1
0
mirror of https://github.com/php/php-src.git synced 2026-04-08 16:43:44 +02:00

PR#1905: directly copy to target memory

This commit is contained in:
sskaje
2016-05-13 17:41:59 +08:00
parent 267ddb3abd
commit b56352aa1d

View File

@@ -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));
}