From b56352aa1d8ba014f37fd5e345c751a8e613cc30 Mon Sep 17 00:00:00 2001 From: sskaje Date: Fri, 13 May 2016 17:41:59 +0800 Subject: [PATCH] PR#1905: directly copy to target memory --- ext/standard/pack.c | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 8d0d7318ec4..f9a3938d776 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -131,7 +131,6 @@ static void php_pack_memcpy(int is_little_endian, void * dst, void * src, size_t /* Copy to dst from last to first */ - int i = 0; src = src + size - 1; do { *(char *) dst = *(char *)src; @@ -345,8 +344,8 @@ PHP_FUNCTION(pack) break; case 'd': /* double */ - case 'e': /* little endian float */ - case 'E': /* big endian float */ + case 'e': /* little endian double */ + case 'E': /* big endian double */ INC_OUTPUTPOS(arg,sizeof(double)) break; @@ -526,9 +525,7 @@ PHP_FUNCTION(pack) /* pack little endian float */ while (arg-- > 0) { float v = (float) zval_get_double(&argv[currentarg++]); - char *buf = emalloc(sizeof(float)); - php_pack_memcpy(1, &buf, &v, sizeof(float)); - memcpy(&ZSTR_VAL(output)[outputpos], &buf, sizeof(float)); + php_pack_memcpy(1, &ZSTR_VAL(output)[outputpos], &v, sizeof(float)); outputpos += sizeof(v); } @@ -538,9 +535,7 @@ PHP_FUNCTION(pack) /* pack big endian float */ while (arg-- > 0) { float v = (float) zval_get_double(&argv[currentarg++]); - char *buf = emalloc(sizeof(float)); - php_pack_memcpy(0, &buf, &v, sizeof(float)); - memcpy(&ZSTR_VAL(output)[outputpos], &buf, sizeof(float)); + php_pack_memcpy(0, &ZSTR_VAL(output)[outputpos], &v, sizeof(float)); outputpos += sizeof(v); } break; @@ -558,10 +553,8 @@ PHP_FUNCTION(pack) case 'e': { /* pack little endian double */ while (arg-- > 0) { - double v = (double) zval_get_double(&argv[currentarg++]); - char *buf = emalloc(sizeof(double)); - php_pack_memcpy(1, &buf, &v, sizeof(double)); - memcpy(&ZSTR_VAL(output)[outputpos], &buf, sizeof(double)); + double v = (double) zval_get_double(&argv[currentarg++]); + php_pack_memcpy(1, &ZSTR_VAL(output)[outputpos], &v, sizeof(double)); outputpos += sizeof(v); } break; @@ -571,9 +564,7 @@ PHP_FUNCTION(pack) /* pack big endian double */ while (arg-- > 0) { double v = (double) zval_get_double(&argv[currentarg++]); - char *buf = emalloc(sizeof(double)); - php_pack_memcpy(0, &buf, &v, sizeof(double)); - memcpy(&ZSTR_VAL(output)[outputpos], &buf, sizeof(double)); + php_pack_memcpy(0, &ZSTR_VAL(output)[outputpos], &v, sizeof(double)); outputpos += sizeof(v); } break; @@ -1050,15 +1041,9 @@ PHP_FUNCTION(unpack) float v; if (type == 'g') { - char *buf = emalloc(sizeof(float)); - php_pack_memcpy(1, &buf, &input[inputpos], sizeof(float)); - memcpy(&v, &buf, sizeof(float)); - efree(buf); + php_pack_memcpy(1, &v, &input[inputpos], sizeof(float)); } else if (type == 'G') { - char *buf = emalloc(sizeof(float)); - php_pack_memcpy(0, &buf, &input[inputpos], sizeof(float)); - memcpy(&v, &buf, sizeof(float)); - efree(buf); + php_pack_memcpy(0, &v, &input[inputpos], sizeof(float)); } else { memcpy(&v, &input[inputpos], sizeof(float)); } @@ -1074,15 +1059,9 @@ PHP_FUNCTION(unpack) { double v; if (type == 'e') { - char *buf = emalloc(sizeof(double)); - php_pack_memcpy(1, &buf, &input[inputpos], sizeof(double)); - memcpy(&v, &buf, sizeof(double)); - efree(buf); + php_pack_memcpy(1, &v, &input[inputpos], sizeof(double)); } else if (type == 'E') { - char *buf = emalloc(sizeof(double)); - php_pack_memcpy(0, &buf, &input[inputpos], sizeof(double)); - memcpy(&v, &buf, sizeof(double)); - efree(buf); + php_pack_memcpy(0, &v, &input[inputpos], sizeof(double)); } else { memcpy(&v, &input[inputpos], sizeof(double)); }