[PHP-CVS] com php-src: Fixed Bug #63738 unpack: back result with Z format: ext/standard/pack.c ext/standard/tests/strings/pack_Z.phpt
Commit:4d8d5d83fce83c32a04cd8d8cf50d909ab101f38 Author:Remi Collet Tue, 11 Dec 2012 16:30:08 +0100 Parents: a9a5f7aca61d4bec9ce2cf5dc967bb7c0ed651cd Branches: PHP-5.5 Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=4d8d5d83fce83c32a04cd8d8cf50d909ab101f38 Log: Fixed Bug #63738 unpack: back result with Z format Fix result for empty string. Same output as perl perl -e 'print unpack("Z2","\0\0");' => "" perl -e 'print unpack("Z2","A\0");' => "A" perl -e 'print unpack("Z2","AB\0");' => "AB" perl -e 'print unpack("Z2","ABC\0");'=> "AB" Bugs: https://bugs.php.net/63738 Changed paths: M ext/standard/pack.c M ext/standard/tests/strings/pack_Z.phpt Diff: diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 9894746..0472cb2 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -729,8 +729,7 @@ PHP_FUNCTION(unpack) size = len; /* Remove everything after the first null */ - s = 0; - while (s++ <= len) { + for (s=0 ; s < len ; s++) { if (input[inputpos + s] == pad) break; } diff --git a/ext/standard/tests/strings/pack_Z.phpt b/ext/standard/tests/strings/pack_Z.phpt index 8a2ee67..4fd007a 100644 --- a/ext/standard/tests/strings/pack_Z.phpt +++ b/ext/standard/tests/strings/pack_Z.phpt @@ -9,9 +9,15 @@ var_dump( pack("Z4", "foo"), pack("Z*", "foo"), unpack("Z*", "foo\0\rbar\0 \t\r\n"), -unpack("Z9", "foo\0\rbar\0 \t\r\n") +unpack("Z9", "foo\0\rbar\0 \t\r\n"), +unpack("Z2", "\0"), +unpack("Z2", "\0\0"), +unpack("Z2", "A\0"), +unpack("Z2", "AB\0"), +unpack("Z2", "ABC") ); --EXPECTF-- +Warning: unpack(): Type Z: not enough input, need 2, have 1 in %s on line %d string(0) "" string(5) "foo%c%c" string(4) "foo%c" @@ -25,3 +31,20 @@ array(1) { [1]=> string(3) "foo" } +bool(false) +array(1) { + [1]=> + string(0) "" +} +array(1) { + [1]=> + string(1) "A" +} +array(1) { + [1]=> + string(2) "AB" +} +array(1) { + [1]=> + string(2) "AB" +} -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] com php-src: - generators API exported for extensions - improved RETURN sequence to avoid redundant check if op_array is a generator: Zend/zend_generators.c Zend/zend_generators.h Zend/zend_
Commit:a9a5f7aca61d4bec9ce2cf5dc967bb7c0ed651cd Author:Dmitry Stogov Tue, 11 Dec 2012 17:25:32 +0400 Parents: 8bb106d20c8f36d814772c45d693af2b42b06732 Branches: PHP-5.5 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=a9a5f7aca61d4bec9ce2cf5dc967bb7c0ed651cd Log: - generators API exported for extensions - improved RETURN sequence to avoid redundant check if op_array is a generator Changed paths: M Zend/zend_generators.c M Zend/zend_generators.h M Zend/zend_vm_def.h M Zend/zend_vm_execute.h diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index dc7ae14..1844be8 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -27,7 +27,7 @@ ZEND_API zend_class_entry *zend_ce_generator; static zend_object_handlers zend_generator_handlers; -void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC) /* {{{ */ +ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC) /* {{{ */ { if (generator->execute_data) { zend_execute_data *execute_data = generator->execute_data; @@ -338,7 +338,7 @@ static zend_object_value zend_generator_create(zend_class_entry *class_type TSRM /* Requires globals EG(scope), EG(current_scope), EG(This), * EG(active_symbol_table) and EG(current_execute_data). */ -zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { zval *return_value; zend_generator *generator; @@ -399,7 +399,7 @@ static zend_function *zend_generator_get_constructor(zval *object TSRMLS_DC) /* } /* }}} */ -void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ */ +ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ */ { if (EG(exception)) { return; diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h index 90f8160..7e6da13 100644 --- a/Zend/zend_generators.h +++ b/Zend/zend_generators.h @@ -62,9 +62,9 @@ static const zend_uchar ZEND_GENERATOR_FORCED_CLOSE = 0x2; static const zend_uchar ZEND_GENERATOR_AT_FIRST_YIELD= 0x4; void zend_register_generator_ce(TSRMLS_D); -zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC); -void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC); -void zend_generator_resume(zend_generator *generator TSRMLS_DC); +ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC); +ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC); +ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC); #endif diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index edbffe1..c5d1748 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1850,18 +1850,6 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) /* return from finally block called because of unhandled exception */ zend_exception_restore(TSRMLS_C); } - - /* Generators go throw a different cleanup process */ - if (UNEXPECTED((EX(op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0)) { - /* The generator object is stored in return_value_ptr_ptr */ - zend_generator *generator = (zend_generator *) EG(return_value_ptr_ptr); - - /* Close the generator to free up resources */ - zend_generator_close(generator, 1 TSRMLS_CC); - - /* Pass execution back to handling code */ - ZEND_VM_RETURN(); - } EG(current_execute_data) = EX(prev_execute_data); EG(opline_ptr) = NULL; @@ -2969,7 +2957,20 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY) ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, ANY, ANY) { - ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); + /* The generator object is stored in return_value_ptr_ptr */ + zend_generator *generator = (zend_generator *) EG(return_value_ptr_ptr); + + if (EXPECTED(EG(exception) == NULL) && + UNEXPECTED(EG(prev_exception) != NULL)) { + /* return from finally block called because of unhandled exception */ + zend_exception_restore(TSRMLS_C); + } + + /* Close the generator to free up resources */ + zend_generator_close(generator, 1 TSRMLS_CC); + + /* Pass execution back to handling code */ + ZEND_VM_RETURN(); } ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY) @@ -5124,7 +5125,11 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]); ZEND_VM_CONTINUE(); } else { - ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); + if (UNEXPECTED((EX(op_array)->fn_flags & ZEND_AC
[PHP-CVS] com php-src: Merge branch 'PHP-5.4' into PHP-5.5: ext/json/json.c
Commit:8bb106d20c8f36d814772c45d693af2b42b06732 Author:Adam Harvey Tue, 11 Dec 2012 19:53:02 +0800 Parents: ec83534d88da4c96777b86d8db7fd20a52ed012e 2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0 Branches: PHP-5.5 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=8bb106d20c8f36d814772c45d693af2b42b06732 Log: Merge branch 'PHP-5.4' into PHP-5.5 * PHP-5.4: Alter php_json_decode_ex() to respect JSON_BIGINT_AS_STRING for bare numbers. Changed paths: MM ext/json/json.c Diff: -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] com php-src: Alter php_json_decode_ex() to respect JSON_BIGINT_AS_STRING for bare numbers.: NEWS ext/json/json.c ext/json/tests/bug63737.phpt
Commit:2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0 Author:Adam Harvey Tue, 11 Dec 2012 19:51:30 +0800 Parents: 95fd52ff3d3cc2162baf4d30fe06cf37da398050 Branches: PHP-5.4 PHP-5.5 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0 Log: Alter php_json_decode_ex() to respect JSON_BIGINT_AS_STRING for bare numbers. Fixes bug #63737 (json_decode does not properly decode with options parameter). Bugs: https://bugs.php.net/63737 Changed paths: M NEWS M ext/json/json.c A ext/json/tests/bug63737.phpt Diff: diff --git a/NEWS b/NEWS index 29b62a3..0504472 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||| ?? ??? 2012, PHP 5.4.11 +- JSON: + . Fixed bug #63737 (json_decode does not properly decode with options +parameter). (Adam) + ?? ??? 2012, PHP 5.4.10 - Core: diff --git a/ext/json/json.c b/ext/json/json.c index fb01529..e26c369 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -682,7 +682,7 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, else { double d; - int type; + int type, overflow_info; long p; RETVAL_NULL(); @@ -698,11 +698,36 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, RETVAL_BOOL(0); } - if ((type = is_numeric_string(str, str_len, &p, &d, 0)) != 0) { + if ((type = is_numeric_string_ex(str, str_len, &p, &d, 0, &overflow_info)) != 0) { if (type == IS_LONG) { RETVAL_LONG(p); } else if (type == IS_DOUBLE) { - RETVAL_DOUBLE(d); + if (options & PHP_JSON_BIGINT_AS_STRING && overflow_info) { + /* Within an object or array, a numeric literal is assumed +* to be an integer if and only if it's entirely made up of +* digits (exponent notation will result in the number +* being treated as a double). We'll match that behaviour +* here. */ + int i; + zend_bool is_float = 0; + + for (i = (str[0] == '-' ? 1 : 0); i < str_len; i++) { + /* Not using isdigit() because it's locale specific, +* but we expect JSON input to always be UTF-8. */ + if (str[i] < '0' || str[i] > '9') { + is_float = 1; + break; + } + } + + if (is_float) { + RETVAL_DOUBLE(d); + } else { + RETVAL_STRINGL(str, str_len, 1); + } + } else { + RETVAL_DOUBLE(d); + } } } diff --git a/ext/json/tests/bug63737.phpt b/ext/json/tests/bug63737.phpt new file mode 100644 index 000..1fb06d4 --- /dev/null +++ b/ext/json/tests/bug63737.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #63737 (json_decode does not properly decode with options parameter) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +float(1.2345678901235E+29) +string(30) "123456789012345678901234567890" +float(-1.2345678901235E+29) +string(31) "-123456789012345678901234567890" +float(1.2345678901235E+29) +float(1.2345678901235E+29) +float(-1.2345678901235E+29) +float(-1.2345678901235E+29) +Done -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php