diff options
author | Anatol Belski <ab@php.net> | 2015-07-21 12:27:50 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2015-07-21 12:27:50 +0200 |
commit | b148ef44965651fcbe93e8ee35a14edc087ef17c (patch) | |
tree | f5c53fb3d448d0174610d077e0bf3c8bd76834b2 | |
parent | ad8a73dd55c087de465ad80e8715611693bb1460 (diff) | |
parent | 6065b29fe41f09e01dd06ba21980e0344f13230c (diff) | |
download | php-git-b148ef44965651fcbe93e8ee35a14edc087ef17c.tar.gz |
Merge branch 'master' into PHP-7.0.0
* master: (204 commits)
Reverted ad4533fdbabcc3e545277e30023b2fdce16297a0
update UPGRADING
updated NEWS
fix comment
libwebp support for linux
Replaced libvpx by libwebp (first draft; Windows only)
update news with bug #70022
Change E_ERROR and some E_WARNING to E_RECOVERABLE_ERROR.
Add tests for json_last_error()/json_last_error_msg() failures
updated NEWS
updated NEWS
Exclude opcache from a few opcode related tests
updated NEWS
updated NEWS
Fix #66387: Stack overflow with imagefilltoborder
Fix various Windows issues (e.g. dir separators)
Remove bogus exception_save() from FETCH_CLASS
Fix readline/libedit build
Do not use readline when not having a tty This is important for e.g. run-tests.php
Add show_unexecuted option to phpdbg_end_oplog()
...
Conflicts:
Zend/tests/temporary_cleaning_001.phpt
Zend/tests/temporary_cleaning_003.phpt
Zend/tests/temporary_cleaning_004.phpt
Zend/tests/temporary_cleaning_005.phpt
Zend/zend_compile.c
Zend/zend_compile.h
sapi/phpdbg/phpdbg_opcode.c
232 files changed, 6658 insertions, 6783 deletions
diff --git a/.travis.yml b/.travis.yml index 86ae36afd5..94056f4ca9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,4 +50,3 @@ before_script: # Run PHPs run-tests.php script: - ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php $(if [ $ENABLE_DEBUG == 1 ]; then echo "-d opcache.enable_cli=1 -d zend_extension=`pwd`/modules/opcache.so"; fi) -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --offline --show-diff --set-timeout 120 - - ./sapi/cli/php sapi/phpdbg/tests/run-tests.php -diff2stdout --phpdbg sapi/phpdbg/phpdbg @@ -695,6 +695,9 @@ out, that the corresponding SDK isn't available anymore. Mhash is not an extension anymore, use function_exists("mhash") to check whether it is avaliable. +- GD + The bundled libgd requires libwebp instead of libvpx for the WebP functionality. + ======================================== 10. New Global Constants ======================================== diff --git a/Zend/tests/assert/expect_empty_stmt_bug.phpt b/Zend/tests/assert/expect_empty_stmt_bug.phpt new file mode 100644 index 0000000000..f5dcff3ba5 --- /dev/null +++ b/Zend/tests/assert/expect_empty_stmt_bug.phpt @@ -0,0 +1,11 @@ +--TEST-- +Empty statement in assert() shouldn't segfault +--FILE-- +<?php + +assert((function () { return true;; })()); +echo "ok"; + +?> +--EXPECT-- +ok diff --git a/Zend/tests/bug69640.phpt b/Zend/tests/bug69640.phpt index e7ff7c99c1..bdc7814712 100644 --- a/Zend/tests/bug69640.phpt +++ b/Zend/tests/bug69640.phpt @@ -5,4 +5,4 @@ Bug #69640 Unhandled Error thrown from userland do not produce any output throw new \ParseError('I mess everything up! :trollface:'); ?> --EXPECTF-- -Fatal error: I mess everything up! :trollface: in %sbug69640.php on line 2 +Parse error: I mess everything up! :trollface: in %sbug69640.php on line 2 diff --git a/Zend/tests/bug69732.phpt b/Zend/tests/bug69732.phpt index bc6206d113..8d5fccd712 100644 --- a/Zend/tests/bug69732.phpt +++ b/Zend/tests/bug69732.phpt @@ -24,7 +24,8 @@ Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 Notice: Indirect modification of overloaded property wpq::$interesting has no effect in %sbug69732.php on line 16 -Notice: Only variables should be assigned by reference in %sbug69732.php on line 16 +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d -Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 -XXX diff --git a/Zend/tests/bug69996.phpt b/Zend/tests/bug69996.phpt new file mode 100644 index 0000000000..178e36837a --- /dev/null +++ b/Zend/tests/bug69996.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #69996 (Changing the property of a cloned object affects the original) +--FILE-- +<?php + +function method($cache) { + $prepared = clone $cache; + var_dump($prepared->data); + $prepared->data = "bad"; + return $prepared; +} + +$cache = new stdClass(); +$cache->data = "good"; + +for ($i = 0; $i < 5; ++$i) { + method($cache); +} +?> +--EXPECT-- +string(4) "good" +string(4) "good" +string(4) "good" +string(4) "good" +string(4) "good" diff --git a/Zend/tests/bug70012.phpt b/Zend/tests/bug70012.phpt new file mode 100644 index 0000000000..5337649d2d --- /dev/null +++ b/Zend/tests/bug70012.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #70012 (Exception lost with nested finally block) +--FILE-- +<?php +try { + echo "Outer try\n"; + try { + echo " Middle try\n"; + throw new Exception(); + } finally { + echo " Middle finally\n"; + try { + echo " Inner try\n"; + } finally { + echo " Inner finally\n"; + } + } + echo "Outer shouldnt get here\n"; +} catch (Exception $e) { + echo "Outer catch\n"; +} finally { + echo "Outer finally\n"; +} +?> +--EXPECT-- +Outer try + Middle try + Middle finally + Inner try + Inner finally +Outer catch +Outer finally diff --git a/Zend/tests/bug70089.phpt b/Zend/tests/bug70089.phpt new file mode 100644 index 0000000000..c61db00c9e --- /dev/null +++ b/Zend/tests/bug70089.phpt @@ -0,0 +1,37 @@ +--TEST-- +Bug #70089 (segfault in PHP 7 at ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER ()) +--INI-- +opcache.enable=0 +--FILE-- +<?php +function dummy($a) { +} + +try { + chr(0)[0][] = 1; +} catch (Error $e) { + var_dump($e->getMessage()); +} +try { + unset(chr(0)[0][0]); +} catch (Error $e) { + var_dump($e->getMessage()); +} +eval("function runtimetest(&\$a) {} "); +try { + runtimetest(chr(0)[0]); +} catch (Error $e) { + var_dump($e->getMessage()); +} + +try { + ++chr(0)[0]; +} catch (Error $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +string(36) "Cannot use string offset as an array" +string(27) "Cannot unset string offsets" +string(41) "Only variables can be passed by reference" +string(64) "Cannot increment/decrement overloaded objects nor string offsets" diff --git a/Zend/tests/closure_033.phpt b/Zend/tests/closure_033.phpt index d92716aacc..c83a53898d 100644 --- a/Zend/tests/closure_033.phpt +++ b/Zend/tests/closure_033.phpt @@ -23,7 +23,7 @@ $o->func(); ?> ===DONE=== --EXPECTF-- -Test::{closure}() +{closure}() Fatal error: Uncaught Error: Call to private method Test::func() from context '' in %sclosure_033.php:%d Stack trace: diff --git a/Zend/tests/nested_method_and_function.phpt b/Zend/tests/nested_method_and_function.phpt new file mode 100644 index 0000000000..46d55ddc52 --- /dev/null +++ b/Zend/tests/nested_method_and_function.phpt @@ -0,0 +1,29 @@ +--TEST-- +active_class_entry must be always correct (__METHOD__ should not depend on declaring function ce) +--FILE-- +<?php + +namespace Baz; + +class Foo { + public static function bar() { + function foo() { + var_dump(__FUNCTION__); + var_dump(__METHOD__); + } + + foo(); + + var_dump(__FUNCTION__); + var_dump(__METHOD__); + } +} + +Foo::bar(); + +?> +--EXPECT-- +string(7) "Baz\foo" +string(7) "Baz\foo" +string(3) "bar" +string(12) "Baz\Foo::bar" diff --git a/Zend/tests/temporary_cleaning_001.phpt b/Zend/tests/temporary_cleaning_001.phpt new file mode 100644 index 0000000000..40340bc3da --- /dev/null +++ b/Zend/tests/temporary_cleaning_001.phpt @@ -0,0 +1,25 @@ +--TEST-- +Temporary leak on exception +--XFAIL-- +See Bug #62210 and attempt to fix it in "tmp_livelibess" branch +--FILE-- +<?php + +function ops() { + throw new Exception(); +} + +try { + $x = 2; + $y = new stdClass; + while ($x-- && new stdClass) { + $r = [$x] + ($y ? ((array) $x) + [2] : ops()); + $y = (array) $y; + } +} catch (Exception $e) { +} + +?> +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/tests/temporary_cleaning_003.phpt b/Zend/tests/temporary_cleaning_003.phpt new file mode 100644 index 0000000000..0f7d9450eb --- /dev/null +++ b/Zend/tests/temporary_cleaning_003.phpt @@ -0,0 +1,21 @@ +--TEST-- +Fundamental memory leak test on temporaries +--XFAIL-- +See Bug #62210 and attempt to fix it in "tmp_livelibess" branch +--FILE-- +<?php + +function ops() { + throw new Exception(); +} + +try{ + $x = 1; + $r = [$x] + ops(); +} catch (Exception $e) { +} + +?> +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/tests/temporary_cleaning_004.phpt b/Zend/tests/temporary_cleaning_004.phpt new file mode 100644 index 0000000000..e2b093654f --- /dev/null +++ b/Zend/tests/temporary_cleaning_004.phpt @@ -0,0 +1,46 @@ +--TEST-- +Temporary leak with switch +--XFAIL-- +See Bug #62210 and attempt to fix it in "tmp_livelibess" branch +--FILE-- +<?php + +function ops() { + throw new Exception(); +} + +$a = [new stdClass, new stdClass]; +switch ($a[0]) { + case false: + break; + default: + try { + $x = 2; + $y = new stdClass; + while ($x-- && new stdClass) { + $r = [$x] + ($y ? ((array) $x) + [2] : ops()); + $y = (array) $y; + } + } catch (Exception $e) { + } +} + +try { + switch ($a[0]) { + case false: + break; + default: + $x = 2; + $y = new stdClass; + while ($x-- && new stdClass) { + $r = [$x] + ($y ? ((array) $x) + [2] : ops()); + $y = (array) $y; + } + } +} catch (Exception $e) { +} + +?> +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/tests/temporary_cleaning_005.phpt b/Zend/tests/temporary_cleaning_005.phpt new file mode 100644 index 0000000000..f671c32543 --- /dev/null +++ b/Zend/tests/temporary_cleaning_005.phpt @@ -0,0 +1,50 @@ +--TEST-- +Temporary leak with foreach +--XFAIL-- +See Bug #62210 and attempt to fix it in "tmp_livelibess" branch +--FILE-- +<?php + +function ops() { + throw new Exception(); +} + +$a = [new stdClass, new stdClass]; +foreach ([$a, [new stdClass]] as $b) { + switch ($b[0]) { + case false: + break; + default: + try { + $x = 2; + $y = new stdClass; + while ($x-- && new stdClass) { + $r = [$x] + ($y ? ((array) $x) + [2] : ops()); + $y = (array) $y; + } + } catch (Exception $e) { + } + } +} + +foreach ([$a, [new stdClass]] as $b) { + try { + switch ($b[0]) { + case false: + break; + default: + $x = 2; + $y = new stdClass; + while ($x-- && new stdClass) { + $r = [$x] + ($y ? ((array) $x) + [2] : ops()); + $y = (array) $y; + } + } + } catch (Exception $e) { + } +} + +?> +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/tests/temporary_cleaning_006.phpt b/Zend/tests/temporary_cleaning_006.phpt new file mode 100644 index 0000000000..435e7b12dd --- /dev/null +++ b/Zend/tests/temporary_cleaning_006.phpt @@ -0,0 +1,20 @@ +--TEST-- +Exception after separation during indirect write to fcall result +--XFAIL-- +See Bug #62210 and attempt to fix it in "tmp_livelibess" branch +--FILE-- +<?php + +function throwing() { throw new Exception; } + +function getArray($x) { return [$x]; } + +try { + getArray(0)[throwing()] = 1; +} catch (Exception $e) { + echo "Exception\n"; +} + +?> +--EXPECT-- +Exception diff --git a/Zend/tests/temporary_cleaning_007.phpt b/Zend/tests/temporary_cleaning_007.phpt new file mode 100644 index 0000000000..0e29ed6c33 --- /dev/null +++ b/Zend/tests/temporary_cleaning_007.phpt @@ -0,0 +1,22 @@ +--TEST-- +Exception inside a foreach loop with return +--FILE-- +<?php +class saboteurTestController { + public function isConsistent() { throw new \Exception(); } +} + +$controllers = array(new saboteurTestController(),new saboteurTestController()); +foreach ($controllers as $controller) { + try { + if ($controller->isConsistent()) { + return $controller; + } + } catch (\Exception $e) { + echo "Exception\n"; + } +} +?> +--EXPECT-- +Exception +Exception diff --git a/Zend/tests/catch_002.phpt b/Zend/tests/try/catch_002.phpt index 11d736abe2..11d736abe2 100644 --- a/Zend/tests/catch_002.phpt +++ b/Zend/tests/try/catch_002.phpt diff --git a/Zend/tests/catch_003.phpt b/Zend/tests/try/catch_003.phpt index 414d50f815..414d50f815 100644 --- a/Zend/tests/catch_003.phpt +++ b/Zend/tests/try/catch_003.phpt diff --git a/Zend/tests/catch_004.phpt b/Zend/tests/try/catch_004.phpt index 54920b8947..54920b8947 100644 --- a/Zend/tests/catch_004.phpt +++ b/Zend/tests/try/catch_004.phpt diff --git a/Zend/tests/catch_finally_001.phpt b/Zend/tests/try/catch_finally_001.phpt index 0c3f597a0a..0c3f597a0a 100644 --- a/Zend/tests/catch_finally_001.phpt +++ b/Zend/tests/try/catch_finally_001.phpt diff --git a/Zend/tests/catch_finally_002.phpt b/Zend/tests/try/catch_finally_002.phpt index c54477ff8c..c54477ff8c 100644 --- a/Zend/tests/catch_finally_002.phpt +++ b/Zend/tests/try/catch_finally_002.phpt diff --git a/Zend/tests/catch_finally_003.phpt b/Zend/tests/try/catch_finally_003.phpt index 24e468d335..24e468d335 100644 --- a/Zend/tests/catch_finally_003.phpt +++ b/Zend/tests/try/catch_finally_003.phpt diff --git a/Zend/tests/catch_finally_004.phpt b/Zend/tests/try/catch_finally_004.phpt index a2c22beab1..a2c22beab1 100644 --- a/Zend/tests/catch_finally_004.phpt +++ b/Zend/tests/try/catch_finally_004.phpt diff --git a/Zend/tests/catch_finally_005.phpt b/Zend/tests/try/catch_finally_005.phpt index c2fd55df27..c2fd55df27 100644 --- a/Zend/tests/catch_finally_005.phpt +++ b/Zend/tests/try/catch_finally_005.phpt diff --git a/Zend/tests/catch_finally_006.phpt b/Zend/tests/try/catch_finally_006.phpt index 216219b6a5..216219b6a5 100644 --- a/Zend/tests/catch_finally_006.phpt +++ b/Zend/tests/try/catch_finally_006.phpt diff --git a/Zend/tests/finally_goto_001.phpt b/Zend/tests/try/finally_goto_001.phpt index 990f78d4c7..990f78d4c7 100644 --- a/Zend/tests/finally_goto_001.phpt +++ b/Zend/tests/try/finally_goto_001.phpt diff --git a/Zend/tests/finally_goto_002.phpt b/Zend/tests/try/finally_goto_002.phpt index a6bd9e307f..a6bd9e307f 100644 --- a/Zend/tests/finally_goto_002.phpt +++ b/Zend/tests/try/finally_goto_002.phpt diff --git a/Zend/tests/finally_goto_003.phpt b/Zend/tests/try/finally_goto_003.phpt index 8529ff7865..8529ff7865 100644 --- a/Zend/tests/finally_goto_003.phpt +++ b/Zend/tests/try/finally_goto_003.phpt diff --git a/Zend/tests/finally_goto_004.phpt b/Zend/tests/try/finally_goto_004.phpt index d88ceedf52..d88ceedf52 100644 --- a/Zend/tests/finally_goto_004.phpt +++ b/Zend/tests/try/finally_goto_004.phpt diff --git a/Zend/tests/try/finally_goto_005.phpt b/Zend/tests/try/finally_goto_005.phpt new file mode 100644 index 0000000000..36b4155d81 --- /dev/null +++ b/Zend/tests/try/finally_goto_005.phpt @@ -0,0 +1,15 @@ +--TEST-- +There must be a difference between label: try { ... } and try { label: ... } +--FILE-- +<?php + +label: try { + goto label; +} finally { + print "success"; + return; // don't loop +} + +?> +--EXPECT-- +success diff --git a/Zend/tests/try_catch_finally_001.phpt b/Zend/tests/try/try_catch_finally_001.phpt index 3d478f461a..3d478f461a 100644 --- a/Zend/tests/try_catch_finally_001.phpt +++ b/Zend/tests/try/try_catch_finally_001.phpt diff --git a/Zend/tests/try_catch_finally_002.phpt b/Zend/tests/try/try_catch_finally_002.phpt index 79efcb3de8..79efcb3de8 100644 --- a/Zend/tests/try_catch_finally_002.phpt +++ b/Zend/tests/try/try_catch_finally_002.phpt diff --git a/Zend/tests/try_catch_finally_003.phpt b/Zend/tests/try/try_catch_finally_003.phpt index 7ec8ec82db..7ec8ec82db 100644 --- a/Zend/tests/try_catch_finally_003.phpt +++ b/Zend/tests/try/try_catch_finally_003.phpt diff --git a/Zend/tests/try_catch_finally_004.phpt b/Zend/tests/try/try_catch_finally_004.phpt index eb8d0966a1..eb8d0966a1 100644 --- a/Zend/tests/try_catch_finally_004.phpt +++ b/Zend/tests/try/try_catch_finally_004.phpt diff --git a/Zend/tests/try_catch_finally_005.phpt b/Zend/tests/try/try_catch_finally_005.phpt index dafeb6bbe0..dafeb6bbe0 100644 --- a/Zend/tests/try_catch_finally_005.phpt +++ b/Zend/tests/try/try_catch_finally_005.phpt diff --git a/Zend/tests/try_catch_finally_006.phpt b/Zend/tests/try/try_catch_finally_006.phpt index dab6af6a58..dab6af6a58 100644 --- a/Zend/tests/try_catch_finally_006.phpt +++ b/Zend/tests/try/try_catch_finally_006.phpt diff --git a/Zend/tests/try_catch_finally_007.phpt b/Zend/tests/try/try_catch_finally_007.phpt index ad33c68131..ad33c68131 100644 --- a/Zend/tests/try_catch_finally_007.phpt +++ b/Zend/tests/try/try_catch_finally_007.phpt diff --git a/Zend/tests/try_finally_001.phpt b/Zend/tests/try/try_finally_001.phpt index 33744d064c..33744d064c 100644 --- a/Zend/tests/try_finally_001.phpt +++ b/Zend/tests/try/try_finally_001.phpt diff --git a/Zend/tests/try_finally_002.phpt b/Zend/tests/try/try_finally_002.phpt index 99a34f62fb..99a34f62fb 100644 --- a/Zend/tests/try_finally_002.phpt +++ b/Zend/tests/try/try_finally_002.phpt diff --git a/Zend/tests/try_finally_003.phpt b/Zend/tests/try/try_finally_003.phpt index b0fee7c6d7..b0fee7c6d7 100644 --- a/Zend/tests/try_finally_003.phpt +++ b/Zend/tests/try/try_finally_003.phpt diff --git a/Zend/tests/try_finally_004.phpt b/Zend/tests/try/try_finally_004.phpt index 08930a40c5..08930a40c5 100644 --- a/Zend/tests/try_finally_004.phpt +++ b/Zend/tests/try/try_finally_004.phpt diff --git a/Zend/tests/try_finally_005.phpt b/Zend/tests/try/try_finally_005.phpt index 8664d6b1bf..8664d6b1bf 100644 --- a/Zend/tests/try_finally_005.phpt +++ b/Zend/tests/try/try_finally_005.phpt diff --git a/Zend/tests/try_finally_006.phpt b/Zend/tests/try/try_finally_006.phpt index f53e6b5bc1..f53e6b5bc1 100644 --- a/Zend/tests/try_finally_006.phpt +++ b/Zend/tests/try/try_finally_006.phpt diff --git a/Zend/tests/try_finally_007.phpt b/Zend/tests/try/try_finally_007.phpt index 634937495c..634937495c 100644 --- a/Zend/tests/try_finally_007.phpt +++ b/Zend/tests/try/try_finally_007.phpt diff --git a/Zend/tests/try_finally_008.phpt b/Zend/tests/try/try_finally_008.phpt index cee37aedab..cee37aedab 100644 --- a/Zend/tests/try_finally_008.phpt +++ b/Zend/tests/try/try_finally_008.phpt diff --git a/Zend/tests/try_finally_009.phpt b/Zend/tests/try/try_finally_009.phpt index b29930a75e..b29930a75e 100644 --- a/Zend/tests/try_finally_009.phpt +++ b/Zend/tests/try/try_finally_009.phpt diff --git a/Zend/tests/try_finally_010.phpt b/Zend/tests/try/try_finally_010.phpt index 91eb7821ee..91eb7821ee 100644 --- a/Zend/tests/try_finally_010.phpt +++ b/Zend/tests/try/try_finally_010.phpt diff --git a/Zend/tests/try_finally_011.phpt b/Zend/tests/try/try_finally_011.phpt index 8a9dc62ca4..8a9dc62ca4 100644 --- a/Zend/tests/try_finally_011.phpt +++ b/Zend/tests/try/try_finally_011.phpt diff --git a/Zend/tests/try/try_finally_012.phpt b/Zend/tests/try/try_finally_012.phpt new file mode 100644 index 0000000000..32fec7ab29 --- /dev/null +++ b/Zend/tests/try/try_finally_012.phpt @@ -0,0 +1,32 @@ +--TEST-- +Try finally (exception in "return" statement) +--FILE-- +<?php +class A { + public $x = 1; + public $y = 2; + function __destruct() { + throw new Exception(); + } +} +function foo() { + foreach(new A() as $a) { + try { + return $a; + } catch (Exception $e) { + echo "exception in foo\n"; + } finally { + echo "finally\n"; + } + } +} +try { + foo(); +} catch (Exception $e) { + echo "exception in main\n"; +} +?> +--EXPECT-- +finally +exception in main + diff --git a/Zend/zend.c b/Zend/zend.c index e5fd2e8bee..168658655c 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -882,7 +882,7 @@ void zenderror(const char *error) /* {{{ */ return; } - zend_throw_exception(zend_ce_parse_error, error, E_PARSE); + zend_throw_exception(zend_ce_parse_error, error, 0); } /* }}} */ @@ -1328,7 +1328,7 @@ ZEND_API void zend_type_error(const char *format, ...) /* {{{ */ va_start(va, format); zend_vspprintf(&message, 0, format, va); - zend_throw_exception(zend_ce_type_error, message, E_ERROR); + zend_throw_exception(zend_ce_type_error, message, 0); efree(message); va_end(va); } /* }}} */ @@ -1341,7 +1341,7 @@ ZEND_API void zend_internal_type_error(zend_bool throw_exception, const char *fo va_start(va, format); zend_vspprintf(&message, 0, format, va); if (throw_exception) { - zend_throw_exception(zend_ce_type_error, message, E_ERROR); + zend_throw_exception(zend_ce_type_error, message, 0); } else { zend_error(E_WARNING, message); } diff --git a/Zend/zend_API.c b/Zend/zend_API.c index c84ab13792..d8e560c844 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3923,7 +3923,7 @@ ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *na if (Z_ISREF_P(property)) { zval_dtor(property); ZVAL_COPY_VALUE(property, value); - if (Z_REFCOUNT_P(value) > 0) { + if (Z_REFCOUNTED_P(value) && Z_REFCOUNT_P(value) > 0) { zval_opt_copy_ctor(property); } } else { diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 58e19c1d39..f0a3b2021e 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2443,6 +2443,20 @@ ZEND_API zend_mm_heap *zend_mm_set_heap(zend_mm_heap *new_heap) return (zend_mm_heap*)old_heap; } +ZEND_API zend_mm_heap *zend_mm_get_heap(void) +{ + return AG(mm_heap); +} + +ZEND_API int zend_mm_is_custom_heap(zend_mm_heap *new_heap) +{ +#if ZEND_MM_CUSTOM + return AG(mm_heap)->use_custom_heap; +#else + return 0; +#endif +} + ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap, void* (*_malloc)(size_t), void (*_free)(void*), diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index 6c12b4247d..eebddca0c9 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -280,7 +280,9 @@ ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size(zend_mm_heap *heap, void *p ZE #define zend_mm_block_size_rel(heap, p) _zend_mm_block_size((heap), (p) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) ZEND_API zend_mm_heap *zend_mm_set_heap(zend_mm_heap *new_heap); +ZEND_API zend_mm_heap *zend_mm_get_heap(void); +ZEND_API int zend_mm_is_custom_heap(zend_mm_heap *new_heap); ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap, void* (*_malloc)(size_t), void (*_free)(void*), diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 714a1443b0..d36ce0b2ad 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -783,6 +783,10 @@ static void zend_ast_export_var_list(smart_str *str, zend_ast_list *list, int in static void zend_ast_export_stmt(smart_str *str, zend_ast *ast, int indent) { + if (!ast) { + return; + } + if (ast->kind == ZEND_AST_STMT_LIST || ast->kind == ZEND_AST_TRAIT_ADAPTATIONS) { zend_ast_list *list = (zend_ast_list*)ast; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 78266f6172..91175af6b3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1598,6 +1598,10 @@ int zendlex(zend_parser_stack_elem *elem) /* {{{ */ again: ZVAL_UNDEF(&zv); retval = lex_scan(&zv); + if (EG(exception)) { + return T_ERROR; + } + switch (retval) { case T_COMMENT: case T_DOC_COMMENT: @@ -2749,7 +2753,8 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ } } else { zend_compile_expr(&arg_node, arg); - if (arg_node.op_type & (IS_VAR|IS_CV)) { + ZEND_ASSERT(arg_node.op_type != IS_CV); + if (arg_node.op_type == IS_VAR) { opcode = ZEND_SEND_VAR_NO_REF; if (fbc && ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) { flags |= ZEND_ARG_SEND_BY_REF; @@ -3509,9 +3514,20 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */ } /* }}} */ -static void zend_free_foreach_and_switch_variables(void) /* {{{ */ +static void zend_free_foreach_and_switch_variables(uint32_t flags) /* {{{ */ { + uint32_t start_op_number = get_next_op_number(CG(active_op_array)); + zend_stack_apply(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_loop_var); + + if (flags) { + uint32_t end_op_number = get_next_op_number(CG(active_op_array)); + + while (start_op_number < end_op_number) { + CG(active_op_array)->opcodes[start_op_number].extended_value |= flags; + start_op_number++; + } + } } /* }}} */ @@ -3533,7 +3549,7 @@ void zend_compile_return(zend_ast *ast) /* {{{ */ zend_compile_expr(&expr_node, expr_ast); } - zend_free_foreach_and_switch_variables(); + zend_free_foreach_and_switch_variables(ZEND_FREE_ON_RETURN); if (CG(context).in_finally) { opline = zend_emit_op(NULL, ZEND_DISCARD_EXCEPTION, NULL, NULL); @@ -3636,6 +3652,118 @@ void zend_compile_break_continue(zend_ast *ast) /* {{{ */ } /* }}} */ +void zend_resolve_goto_label(zend_op_array *op_array, znode *label_node, zend_op *pass2_opline) /* {{{ */ +{ + zend_label *dest; + int current, distance, free_vars; + zval *label; + znode *loop_var = NULL; + + if (pass2_opline) { + label = RT_CONSTANT(op_array, pass2_opline->op2); + } else { + label = &label_node->u.constant; + } + if (CG(context).labels == NULL || + (dest = zend_hash_find_ptr(CG(context).labels, Z_STR_P(label))) == NULL) { + + if (pass2_opline) { + CG(in_compilation) = 1; + CG(active_op_array) = op_array; + CG(zend_lineno) = pass2_opline->lineno; + zend_error_noreturn(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label)); + } else { + /* Label is not defined. Delay to pass 2. */ + zend_op *opline; + + current = CG(context).current_brk_cont; + while (current != -1) { + if (op_array->brk_cont_array[current].start >= 0) { + zend_emit_op(NULL, ZEND_NOP, NULL, NULL); + } + current = op_array->brk_cont_array[current].parent; + } + opline = zend_emit_op(NULL, ZEND_GOTO, NULL, label_node); + opline->extended_value = CG(context).current_brk_cont; + return; + } + } + + zval_dtor(label); + ZVAL_NULL(label); + + /* Check that we are not moving into loop or switch */ + if (pass2_opline) { + current = pass2_opline->extended_value; + } else { + current = CG(context).current_brk_cont; + } + if (!pass2_opline) { + loop_var = zend_stack_top(&CG(loop_var_stack)); + } + for (distance = 0, free_vars = 0; current != dest->brk_cont; distance++) { + if (current == -1) { + if (pass2_opline) { + CG(in_compilation) = 1; + CG(active_op_array) = op_array; + CG(zend_lineno) = pass2_opline->lineno; + } + zend_error_noreturn(E_COMPILE_ERROR, "'goto' into loop or switch statement is disallowed"); + } + if (op_array->brk_cont_array[current].start >= 0) { + if (pass2_opline) { + free_vars++; + } else { + generate_free_loop_var(loop_var); + loop_var--; + } + } + current = op_array->brk_cont_array[current].parent; + } + + if (pass2_opline) { + if (free_vars) { + current = pass2_opline->extended_value; + while (current != dest->brk_cont) { + if (op_array->brk_cont_array[current].start >= 0) { + zend_op *brk_opline = &op_array->opcodes[op_array->brk_cont_array[current].brk]; + + if (brk_opline->opcode == ZEND_FREE) { + (pass2_opline - free_vars)->opcode = ZEND_FREE; + (pass2_opline - free_vars)->op1_type = brk_opline->op1_type; + if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { + (pass2_opline - free_vars)->op1.var = brk_opline->op1.var; + } else { + (pass2_opline - free_vars)->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + brk_opline->op1.var); + ZEND_VM_SET_OPCODE_HANDLER(pass2_opline - free_vars); + } + free_vars--; + } else if (brk_opline->opcode == ZEND_FE_FREE) { + (pass2_opline - free_vars)->opcode = ZEND_FE_FREE; + (pass2_opline - free_vars)->op1_type = brk_opline->op1_type; + if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { + (pass2_opline - free_vars)->op1.var = brk_opline->op1.var; + } else { + (pass2_opline - free_vars)->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + brk_opline->op1.var); + ZEND_VM_SET_OPCODE_HANDLER(pass2_opline - free_vars); + } + free_vars--; + } + } + current = op_array->brk_cont_array[current].parent; + } + } + pass2_opline->opcode = ZEND_JMP; + pass2_opline->op1.opline_num = dest->opline_num; + SET_UNUSED(pass2_opline->op2); + pass2_opline->extended_value = 0; + } else { + zend_op *opline = zend_emit_op(NULL, ZEND_JMP, NULL, NULL); + opline->op1.opline_num = dest->opline_num; + } +} +/* }}} */ + void zend_compile_goto(zend_ast *ast) /* {{{ */ { zend_ast *label_ast = ast->child[0]; @@ -3989,14 +4117,26 @@ void zend_compile_try(zend_ast *ast) /* {{{ */ uint32_t i; zend_op *opline; - uint32_t try_catch_offset = zend_add_try_element( - get_next_op_number(CG(active_op_array))); + uint32_t try_catch_offset; uint32_t *jmp_opnums = safe_emalloc(sizeof(uint32_t), catches->children, 0); if (catches->children == 0 && !finally_ast) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use try without catch or finally"); } + /* label: try { } must not be equal to try { label: } */ + if (CG(context).labels) { + zend_label *label; + ZEND_HASH_REVERSE_FOREACH_PTR(CG(context).labels, label) { + if (label->opline_num == get_next_op_number(CG(active_op_array))) { + zend_emit_op(NULL, ZEND_NOP, NULL, NULL); + } + break; + } ZEND_HASH_FOREACH_END(); + } + + try_catch_offset = zend_add_try_element(get_next_op_number(CG(active_op_array))); + zend_compile_stmt(try_ast); if (catches->children != 0) { @@ -4710,6 +4850,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ zend_bool is_method = decl->kind == ZEND_AST_METHOD; zend_op_array *orig_op_array = CG(active_op_array); + zend_class_entry *orig_ce = CG(active_class_entry); zend_op_array *op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); zend_oparray_context orig_oparray_context; @@ -4734,6 +4875,11 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ } CG(active_op_array) = op_array; + + if (!is_method) { + CG(active_class_entry) = NULL; + } + zend_oparray_context_begin(&orig_oparray_context); if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) { @@ -4769,6 +4915,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ /* Pop the loop variable stack separator */ zend_stack_del_top(&CG(loop_var_stack)); + CG(active_class_entry) = orig_ce; CG(active_op_array) = orig_op_array; } /* }}} */ @@ -5577,9 +5724,9 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */ if (strcmp(ZSTR_VAL(dirname), ".") == 0) { dirname = zend_string_extend(dirname, MAXPATHLEN, 0); #if HAVE_GETCWD - VCWD_GETCWD(ZSTR_VAL(dirname), MAXPATHLEN); + ZEND_IGNORE_VALUE(VCWD_GETCWD(ZSTR_VAL(dirname), MAXPATHLEN)); #elif HAVE_GETWD - VCWD_GETWD(ZSTR_VAL(dirname)); + ZEND_IGNORE_VALUE(VCWD_GETWD(ZSTR_VAL(dirname))); #endif } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index a3bc17f425..74a72f5c84 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -875,7 +875,9 @@ ZEND_API void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_ARG_MASK 0x000fffff -#define ZEND_MEMBER_FUNC_CALL 1<<0 +#define ZEND_FREE_ON_RETURN (1<<0) + +#define ZEND_MEMBER_FUNC_CALL (1<<0) #define ZEND_ARG_SEND_BY_REF (1<<0) #define ZEND_ARG_COMPILE_TIME_BOUND (1<<1) @@ -951,7 +953,8 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf, #define ZEND_ARRAY_SIZE_SHIFT 2 /* Pseudo-opcodes that are used only temporarily during compilation */ -#define ZEND_BRK 254 +#define ZEND_GOTO 253 +#define ZEND_BRK 254 #define ZEND_CONT 255 diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 1c35281177..5d6cc59259 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -965,9 +965,8 @@ ZEND_API void zend_exception_error(zend_object *ex, int severity) /* {{{ */ zend_string *message = zval_get_string(GET_PROPERTY(&exception, "message")); zend_string *file = zval_get_string(GET_PROPERTY_SILENT(&exception, "file")); zend_long line = zval_get_long(GET_PROPERTY_SILENT(&exception, "line")); - zend_long code = zval_get_long(GET_PROPERTY_SILENT(&exception, "code")); - zend_error_helper(code? code : E_ERROR, ZSTR_VAL(file), line, "%s", ZSTR_VAL(message)); + zend_error_helper(E_PARSE, ZSTR_VAL(file), line, "%s", ZSTR_VAL(message)); zend_string_release(file); zend_string_release(message); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 50af005c22..2d1bd5e3d0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -88,18 +88,17 @@ static const zend_internal_function zend_pass_function = { #undef zval_ptr_dtor #define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC) -#define PZVAL_LOCK(z) if (Z_REFCOUNTED_P(z)) Z_ADDREF_P((z)) -#define SELECTIVE_PZVAL_LOCK(pzv, opline) if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(pzv); } - #define READY_TO_DESTROY(zv) \ (zv && Z_REFCOUNTED_P(zv) && Z_REFCOUNT_P(zv) == 1) -#define EXTRACT_ZVAL_PTR(zv) do { \ - zval *__zv = (zv); \ - if (Z_TYPE_P(__zv) == IS_INDIRECT) { \ - ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \ - } \ - } while (0) +#define EXTRACT_ZVAL_PTR(zv, check_null) do { \ + zval *__zv = (zv); \ + if (Z_TYPE_P(__zv) == IS_INDIRECT) { \ + if (!(check_null) || Z_INDIRECT_P(__zv)) { \ + ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \ + } \ + } \ +} while (0) #define FREE_OP(should_free) \ if (should_free) { \ @@ -1110,6 +1109,12 @@ fast_assign: } } else { if (EXPECTED(zobj->properties != NULL)) { + if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) { + if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) { + GC_REFCOUNT(zobj->properties)--; + } + zobj->properties = zend_array_dup(zobj->properties); + } property = zend_hash_find(zobj->properties, Z_STR_P(property_name)); if (property) { goto fast_assign; @@ -2563,11 +2568,21 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t # endif #endif -#define ZEND_VM_NEXT_OPCODE() \ +#define ZEND_VM_NEXT_OPCODE_EX(check_exception, skip) \ CHECK_SYMBOL_TABLES() \ - ZEND_VM_INC_OPCODE(); \ + if (check_exception) { \ + OPLINE = EX(opline) + (skip); \ + } else { \ + OPLINE = opline + (skip); \ + } \ ZEND_VM_CONTINUE() +#define ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION() \ + ZEND_VM_NEXT_OPCODE_EX(1, 1) + +#define ZEND_VM_NEXT_OPCODE() \ + ZEND_VM_NEXT_OPCODE_EX(0, 1) + #define ZEND_VM_SET_NEXT_OPCODE(new_op) \ CHECK_SYMBOL_TABLES() \ OPLINE = new_op diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 64e7407f12..c794c969c0 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -821,7 +821,13 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent do { dst--; src--; - ZVAL_MAKE_REF(src); + if (parent_ce->type == ZEND_INTERNAL_CLASS) { + if (!Z_ISREF_P(src)) { + ZVAL_NEW_PERSISTENT_REF(src, src); + } + } else { + ZVAL_MAKE_REF(src); + } ZVAL_COPY_VALUE(dst, src); Z_ADDREF_P(dst); if (Z_CONSTANT_P(Z_REFVAL_P(dst))) { @@ -831,6 +837,8 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent ce->default_static_members_count += parent_ce->default_static_members_count; if (ce->type == ZEND_USER_CLASS) { ce->static_members_table = ce->default_static_members_table; + } else { + ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; } } @@ -1192,7 +1200,8 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze if (exclude_table == NULL || zend_hash_find(exclude_table, fnname) == NULL) { /* is not in hashtable, thus, function is not to be excluded */ - fn_copy = *fn; + /* And how about ZEND_OVERLOADED_FUNCTION? */ + memcpy(&fn_copy, fn, fn->type == ZEND_USER_FUNCTION? sizeof(zend_op_array) : sizeof(zend_internal_function)); /* apply aliases which have not alias name, just setting visibility */ if (ce->trait_aliases) { diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 6bfe1dd7b3..a73cf88356 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1011,8 +1011,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot if (!valid) { zend_throw_exception(zend_ce_parse_error, - "Invalid UTF-8 codepoint escape sequence", E_PARSE); + "Invalid UTF-8 codepoint escape sequence", 0); zval_ptr_dtor(zendlval); + ZVAL_UNDEF(zendlval); return FAILURE; } @@ -1022,8 +1023,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot /* per RFC 3629, UTF-8 can only represent 21 bits */ if (codepoint > 0x10FFFF || errno) { zend_throw_exception(zend_ce_parse_error, - "Invalid UTF-8 codepoint escape sequence: Codepoint too large", E_PARSE); + "Invalid UTF-8 codepoint escape sequence: Codepoint too large", 0); zval_ptr_dtor(zendlval); + ZVAL_UNDEF(zendlval); return FAILURE; } @@ -1115,7 +1117,7 @@ restart: SCNG(yy_text) = YYCURSOR; -#line 1119 "Zend/zend_language_scanner.c" +#line 1121 "Zend/zend_language_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1169,7 +1171,7 @@ yyc_INITIAL: yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1807 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); @@ -1214,7 +1216,7 @@ inline_char_handler: HANDLE_NEWLINES(yytext, yyleng); RETURN_TOKEN(T_INLINE_HTML); } -#line 1218 "Zend/zend_language_scanner.c" +#line 1220 "Zend/zend_language_scanner.c" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -1232,7 +1234,7 @@ yy5: yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1798 "Zend/zend_language_scanner.l" +#line 1803 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { BEGIN(ST_IN_SCRIPTING); @@ -1241,18 +1243,18 @@ yy6: goto inline_char_handler; } } -#line 1245 "Zend/zend_language_scanner.c" +#line 1247 "Zend/zend_language_scanner.c" yy7: YYDEBUG(7, *YYCURSOR); ++YYCURSOR; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1785 "Zend/zend_language_scanner.l" +#line 1790 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); } -#line 1256 "Zend/zend_language_scanner.c" +#line 1258 "Zend/zend_language_scanner.c" yy9: YYDEBUG(9, *YYCURSOR); yych = *++YYCURSOR; @@ -1283,13 +1285,13 @@ yy13: yy14: YYDEBUG(14, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1791 "Zend/zend_language_scanner.l" +#line 1796 "Zend/zend_language_scanner.l" { HANDLE_NEWLINE(yytext[yyleng-1]); BEGIN(ST_IN_SCRIPTING); RETURN_TOKEN(T_OPEN_TAG); } -#line 1293 "Zend/zend_language_scanner.c" +#line 1295 "Zend/zend_language_scanner.c" yy15: YYDEBUG(15, *YYCURSOR); ++YYCURSOR; @@ -1359,7 +1361,7 @@ yyc_ST_BACKQUOTE: yy19: YYDEBUG(19, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2221 "Zend/zend_language_scanner.l" +#line 2222 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); @@ -1397,9 +1399,7 @@ yy19: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng, '`') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng, '`'); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } #line 1406 "Zend/zend_language_scanner.c" @@ -1413,7 +1413,7 @@ yy21: ++YYCURSOR; YYDEBUG(22, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2163 "Zend/zend_language_scanner.l" +#line 2166 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); RETURN_TOKEN('`'); @@ -1428,7 +1428,7 @@ yy24: ++YYCURSOR; YYDEBUG(25, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2150 "Zend/zend_language_scanner.l" +#line 2153 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (zend_long) '{'; yy_push_state(ST_IN_SCRIPTING); @@ -1451,7 +1451,7 @@ yy26: yy28: YYDEBUG(28, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1872 "Zend/zend_language_scanner.l" +#line 1877 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); @@ -1462,7 +1462,7 @@ yy29: ++YYCURSOR; YYDEBUG(30, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1593 "Zend/zend_language_scanner.l" +#line 1595 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME); RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); @@ -1481,7 +1481,7 @@ yy33: ++YYCURSOR; YYDEBUG(34, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1865 "Zend/zend_language_scanner.l" +#line 1870 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET); @@ -1506,7 +1506,7 @@ yy36: ++YYCURSOR; YYDEBUG(37, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1856 "Zend/zend_language_scanner.l" +#line 1861 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY); @@ -1581,7 +1581,7 @@ yy40: yy41: YYDEBUG(41, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2169 "Zend/zend_language_scanner.l" +#line 2172 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1627,12 +1627,10 @@ yy41: double_quotes_scan_done: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng, '"') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng, '"'); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } -#line 1636 "Zend/zend_language_scanner.c" +#line 1634 "Zend/zend_language_scanner.c" yy42: YYDEBUG(42, *YYCURSOR); yych = *++YYCURSOR; @@ -1643,12 +1641,12 @@ yy43: ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2158 "Zend/zend_language_scanner.l" +#line 2161 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); RETURN_TOKEN('"'); } -#line 1652 "Zend/zend_language_scanner.c" +#line 1650 "Zend/zend_language_scanner.c" yy45: YYDEBUG(45, *YYCURSOR); yych = *++YYCURSOR; @@ -1658,14 +1656,14 @@ yy46: ++YYCURSOR; YYDEBUG(47, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2150 "Zend/zend_language_scanner.l" +#line 2153 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (zend_long) '{'; yy_push_state(ST_IN_SCRIPTING); yyless(1); RETURN_TOKEN(T_CURLY_OPEN); } -#line 1669 "Zend/zend_language_scanner.c" +#line 1667 "Zend/zend_language_scanner.c" yy48: YYDEBUG(48, *YYCURSOR); yyaccept = 0; @@ -1681,23 +1679,23 @@ yy48: yy50: YYDEBUG(50, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1872 "Zend/zend_language_scanner.l" +#line 1877 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 1690 "Zend/zend_language_scanner.c" +#line 1688 "Zend/zend_language_scanner.c" yy51: YYDEBUG(51, *YYCURSOR); ++YYCURSOR; YYDEBUG(52, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1593 "Zend/zend_language_scanner.l" +#line 1595 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME); RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 1701 "Zend/zend_language_scanner.c" +#line 1699 "Zend/zend_language_scanner.c" yy53: YYDEBUG(53, *YYCURSOR); yych = *++YYCURSOR; @@ -1711,14 +1709,14 @@ yy55: ++YYCURSOR; YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1865 "Zend/zend_language_scanner.l" +#line 1870 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET); zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 1722 "Zend/zend_language_scanner.c" +#line 1720 "Zend/zend_language_scanner.c" yy57: YYDEBUG(57, *YYCURSOR); yych = *++YYCURSOR; @@ -1736,14 +1734,14 @@ yy58: ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1856 "Zend/zend_language_scanner.l" +#line 1861 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY); zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 1747 "Zend/zend_language_scanner.c" +#line 1745 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_END_HEREDOC: @@ -1754,7 +1752,7 @@ yyc_ST_END_HEREDOC: ++YYCURSOR; YYDEBUG(63, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2136 "Zend/zend_language_scanner.l" +#line 2139 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -1767,7 +1765,7 @@ yyc_ST_END_HEREDOC: BEGIN(ST_IN_SCRIPTING); RETURN_TOKEN(T_END_HEREDOC); } -#line 1771 "Zend/zend_language_scanner.c" +#line 1769 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_HEREDOC: { @@ -1829,7 +1827,7 @@ yy66: yy67: YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2265 "Zend/zend_language_scanner.l" +#line 2264 "Zend/zend_language_scanner.l" { int newline = 0; @@ -1899,12 +1897,10 @@ yy67: heredoc_scan_done: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0) == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } -#line 1908 "Zend/zend_language_scanner.c" +#line 1904 "Zend/zend_language_scanner.c" yy68: YYDEBUG(68, *YYCURSOR); yych = *++YYCURSOR; @@ -1919,14 +1915,14 @@ yy70: ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2150 "Zend/zend_language_scanner.l" +#line 2153 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (zend_long) '{'; yy_push_state(ST_IN_SCRIPTING); yyless(1); RETURN_TOKEN(T_CURLY_OPEN); } -#line 1930 "Zend/zend_language_scanner.c" +#line 1926 "Zend/zend_language_scanner.c" yy72: YYDEBUG(72, *YYCURSOR); yyaccept = 0; @@ -1942,23 +1938,23 @@ yy72: yy74: YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1872 "Zend/zend_language_scanner.l" +#line 1877 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 1951 "Zend/zend_language_scanner.c" +#line 1947 "Zend/zend_language_scanner.c" yy75: YYDEBUG(75, *YYCURSOR); ++YYCURSOR; YYDEBUG(76, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1593 "Zend/zend_language_scanner.l" +#line 1595 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME); RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 1962 "Zend/zend_language_scanner.c" +#line 1958 "Zend/zend_language_scanner.c" yy77: YYDEBUG(77, *YYCURSOR); yych = *++YYCURSOR; @@ -1972,14 +1968,14 @@ yy79: ++YYCURSOR; YYDEBUG(80, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1865 "Zend/zend_language_scanner.l" +#line 1870 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET); zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 1983 "Zend/zend_language_scanner.c" +#line 1979 "Zend/zend_language_scanner.c" yy81: YYDEBUG(81, *YYCURSOR); yych = *++YYCURSOR; @@ -1997,14 +1993,14 @@ yy82: ++YYCURSOR; YYDEBUG(83, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1856 "Zend/zend_language_scanner.l" +#line 1861 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY); zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 2008 "Zend/zend_language_scanner.c" +#line 2004 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_IN_SCRIPTING: @@ -2187,12 +2183,12 @@ yy86: yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1895 "Zend/zend_language_scanner.l" +#line 1900 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); RETURN_TOKEN(T_STRING); } -#line 2196 "Zend/zend_language_scanner.c" +#line 2192 "Zend/zend_language_scanner.c" yy88: YYDEBUG(88, *YYCURSOR); yych = *++YYCURSOR; @@ -2424,11 +2420,11 @@ yy101: yy102: YYDEBUG(102, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1582 "Zend/zend_language_scanner.l" +#line 1584 "Zend/zend_language_scanner.l" { RETURN_TOKEN(yytext[0]); } -#line 2432 "Zend/zend_language_scanner.c" +#line 2428 "Zend/zend_language_scanner.c" yy103: YYDEBUG(103, *YYCURSOR); ++YYCURSOR; @@ -2437,12 +2433,12 @@ yy103: yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1297 "Zend/zend_language_scanner.l" +#line 1299 "Zend/zend_language_scanner.l" { HANDLE_NEWLINES(yytext, yyleng); RETURN_TOKEN(T_WHITESPACE); } -#line 2446 "Zend/zend_language_scanner.c" +#line 2442 "Zend/zend_language_scanner.c" yy105: YYDEBUG(105, *YYCURSOR); yych = *++YYCURSOR; @@ -2453,11 +2449,11 @@ yy106: ++YYCURSOR; YYDEBUG(107, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1322 "Zend/zend_language_scanner.l" +#line 1324 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_NS_SEPARATOR); } -#line 2461 "Zend/zend_language_scanner.c" +#line 2457 "Zend/zend_language_scanner.c" yy108: YYDEBUG(108, *YYCURSOR); yyaccept = 1; @@ -2686,18 +2682,18 @@ yy131: ++YYCURSOR; YYDEBUG(132, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1587 "Zend/zend_language_scanner.l" +#line 1589 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING); RETURN_TOKEN('{'); } -#line 2695 "Zend/zend_language_scanner.c" +#line 2691 "Zend/zend_language_scanner.c" yy133: YYDEBUG(133, *YYCURSOR); ++YYCURSOR; YYDEBUG(134, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1599 "Zend/zend_language_scanner.l" +#line 1601 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2705,7 +2701,7 @@ yy133: } RETURN_TOKEN('}'); } -#line 2709 "Zend/zend_language_scanner.c" +#line 2705 "Zend/zend_language_scanner.c" yy135: YYDEBUG(135, *YYCURSOR); yyaccept = 2; @@ -2733,7 +2729,7 @@ yy135: yy136: YYDEBUG(136, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1652 "Zend/zend_language_scanner.l" +#line 1654 "Zend/zend_language_scanner.l" { char *end; if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ @@ -2743,8 +2739,9 @@ yy136: * Because the lexing itself doesn't do that for us */ if (end != yytext + yyleng) { - zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_LNUMBER); } } else { errno = 0; @@ -2760,22 +2757,24 @@ yy136: /* Also not an assert for the same reason */ if (end != yytext + yyleng) { zend_throw_exception(zend_ce_parse_error, - "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_DNUMBER); } ZEND_ASSERT(!errno); RETURN_TOKEN(T_DNUMBER); } /* Also not an assert for the same reason */ if (end != yytext + yyleng) { - zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_DNUMBER); } } ZEND_ASSERT(!errno); RETURN_TOKEN(T_LNUMBER); } -#line 2779 "Zend/zend_language_scanner.c" +#line 2778 "Zend/zend_language_scanner.c" yy137: YYDEBUG(137, *YYCURSOR); yyaccept = 2; @@ -2803,7 +2802,7 @@ yy139: yy140: YYDEBUG(140, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1901 "Zend/zend_language_scanner.l" +#line 1906 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -2832,14 +2831,14 @@ yy140: RETURN_TOKEN(T_COMMENT); } -#line 2836 "Zend/zend_language_scanner.c" +#line 2835 "Zend/zend_language_scanner.c" yy141: YYDEBUG(141, *YYCURSOR); ++YYCURSOR; yy142: YYDEBUG(142, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1969 "Zend/zend_language_scanner.l" +#line 1974 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -2907,14 +2906,14 @@ yy142: } RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING); } -#line 2911 "Zend/zend_language_scanner.c" +#line 2910 "Zend/zend_language_scanner.c" yy143: YYDEBUG(143, *YYCURSOR); ++YYCURSOR; yy144: YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2038 "Zend/zend_language_scanner.l" +#line 2043 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -2922,9 +2921,7 @@ yy144: switch (*YYCURSOR++) { case '"': yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"'); RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING); case '$': if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { @@ -2957,24 +2954,24 @@ yy144: BEGIN(ST_DOUBLE_QUOTES); RETURN_TOKEN('"'); } -#line 2961 "Zend/zend_language_scanner.c" +#line 2958 "Zend/zend_language_scanner.c" yy145: YYDEBUG(145, *YYCURSOR); ++YYCURSOR; YYDEBUG(146, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2130 "Zend/zend_language_scanner.l" +#line 2133 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); RETURN_TOKEN('`'); } -#line 2972 "Zend/zend_language_scanner.c" +#line 2969 "Zend/zend_language_scanner.c" yy147: YYDEBUG(147, *YYCURSOR); ++YYCURSOR; YYDEBUG(148, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2398 "Zend/zend_language_scanner.l" +#line 2395 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); @@ -2983,7 +2980,7 @@ yy147: zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 2987 "Zend/zend_language_scanner.c" +#line 2984 "Zend/zend_language_scanner.c" yy149: YYDEBUG(149, *YYCURSOR); ++YYCURSOR; @@ -3010,7 +3007,7 @@ yy151: yy153: YYDEBUG(153, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1743 "Zend/zend_language_scanner.l" +#line 1748 "Zend/zend_language_scanner.l" { const char *end; @@ -3019,7 +3016,7 @@ yy153: ZEND_ASSERT(end == yytext + yyleng); RETURN_TOKEN(T_DNUMBER); } -#line 3023 "Zend/zend_language_scanner.c" +#line 3020 "Zend/zend_language_scanner.c" yy154: YYDEBUG(154, *YYCURSOR); yyaccept = 2; @@ -3115,7 +3112,7 @@ yy163: } YYDEBUG(165, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1624 "Zend/zend_language_scanner.l" +#line 1626 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3143,7 +3140,7 @@ yy163: RETURN_TOKEN(T_DNUMBER); } } -#line 3147 "Zend/zend_language_scanner.c" +#line 3144 "Zend/zend_language_scanner.c" yy166: YYDEBUG(166, *YYCURSOR); ++YYCURSOR; @@ -3155,7 +3152,7 @@ yy166: } YYDEBUG(168, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1694 "Zend/zend_language_scanner.l" +#line 1699 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3183,7 +3180,7 @@ yy166: RETURN_TOKEN(T_DNUMBER); } } -#line 3187 "Zend/zend_language_scanner.c" +#line 3184 "Zend/zend_language_scanner.c" yy169: YYDEBUG(169, *YYCURSOR); ++YYCURSOR; @@ -3208,12 +3205,12 @@ yy169: yy171: YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1872 "Zend/zend_language_scanner.l" +#line 1877 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 3217 "Zend/zend_language_scanner.c" +#line 3214 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yych = *++YYCURSOR; @@ -3227,11 +3224,11 @@ yy173: } YYDEBUG(174, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1570 "Zend/zend_language_scanner.l" +#line 1572 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_LOGICAL_XOR); } -#line 3235 "Zend/zend_language_scanner.c" +#line 3232 "Zend/zend_language_scanner.c" yy175: YYDEBUG(175, *YYCURSOR); ++YYCURSOR; @@ -3240,71 +3237,71 @@ yy175: } YYDEBUG(176, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1562 "Zend/zend_language_scanner.l" +#line 1564 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_LOGICAL_OR); } -#line 3248 "Zend/zend_language_scanner.c" +#line 3245 "Zend/zend_language_scanner.c" yy177: YYDEBUG(177, *YYCURSOR); ++YYCURSOR; YYDEBUG(178, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1550 "Zend/zend_language_scanner.l" +#line 1552 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_XOR_EQUAL); } -#line 3258 "Zend/zend_language_scanner.c" +#line 3255 "Zend/zend_language_scanner.c" yy179: YYDEBUG(179, *YYCURSOR); ++YYCURSOR; YYDEBUG(180, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1554 "Zend/zend_language_scanner.l" +#line 1556 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_BOOLEAN_OR); } -#line 3268 "Zend/zend_language_scanner.c" +#line 3265 "Zend/zend_language_scanner.c" yy181: YYDEBUG(181, *YYCURSOR); ++YYCURSOR; YYDEBUG(182, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1546 "Zend/zend_language_scanner.l" +#line 1548 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_OR_EQUAL); } -#line 3278 "Zend/zend_language_scanner.c" +#line 3275 "Zend/zend_language_scanner.c" yy183: YYDEBUG(183, *YYCURSOR); ++YYCURSOR; YYDEBUG(184, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1558 "Zend/zend_language_scanner.l" +#line 1560 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_BOOLEAN_AND); } -#line 3288 "Zend/zend_language_scanner.c" +#line 3285 "Zend/zend_language_scanner.c" yy185: YYDEBUG(185, *YYCURSOR); ++YYCURSOR; YYDEBUG(186, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1542 "Zend/zend_language_scanner.l" +#line 1544 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_AND_EQUAL); } -#line 3298 "Zend/zend_language_scanner.c" +#line 3295 "Zend/zend_language_scanner.c" yy187: YYDEBUG(187, *YYCURSOR); ++YYCURSOR; YYDEBUG(188, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1530 "Zend/zend_language_scanner.l" +#line 1532 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_MOD_EQUAL); } -#line 3308 "Zend/zend_language_scanner.c" +#line 3305 "Zend/zend_language_scanner.c" yy189: YYDEBUG(189, *YYCURSOR); yyaccept = 4; @@ -3313,7 +3310,7 @@ yy189: yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1930 "Zend/zend_language_scanner.l" +#line 1935 "Zend/zend_language_scanner.l" { int doc_com; @@ -3346,7 +3343,7 @@ yy190: RETURN_TOKEN(T_COMMENT); } -#line 3350 "Zend/zend_language_scanner.c" +#line 3347 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yych = *++YYCURSOR; @@ -3356,11 +3353,11 @@ yy192: ++YYCURSOR; YYDEBUG(193, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1522 "Zend/zend_language_scanner.l" +#line 1524 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DIV_EQUAL); } -#line 3364 "Zend/zend_language_scanner.c" +#line 3361 "Zend/zend_language_scanner.c" yy194: YYDEBUG(194, *YYCURSOR); yych = *++YYCURSOR; @@ -3384,62 +3381,62 @@ yy197: if ((yych = *YYCURSOR) == '=') goto yy201; YYDEBUG(198, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1514 "Zend/zend_language_scanner.l" +#line 1516 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_POW); } -#line 3392 "Zend/zend_language_scanner.c" +#line 3389 "Zend/zend_language_scanner.c" yy199: YYDEBUG(199, *YYCURSOR); ++YYCURSOR; YYDEBUG(200, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1510 "Zend/zend_language_scanner.l" +#line 1512 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_MUL_EQUAL); } -#line 3402 "Zend/zend_language_scanner.c" +#line 3399 "Zend/zend_language_scanner.c" yy201: YYDEBUG(201, *YYCURSOR); ++YYCURSOR; YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1518 "Zend/zend_language_scanner.l" +#line 1520 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_POW_EQUAL); } -#line 3412 "Zend/zend_language_scanner.c" +#line 3409 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy207; YYDEBUG(204, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1578 "Zend/zend_language_scanner.l" +#line 1580 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SR); } -#line 3423 "Zend/zend_language_scanner.c" +#line 3420 "Zend/zend_language_scanner.c" yy205: YYDEBUG(205, *YYCURSOR); ++YYCURSOR; YYDEBUG(206, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1498 "Zend/zend_language_scanner.l" +#line 1500 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); } -#line 3433 "Zend/zend_language_scanner.c" +#line 3430 "Zend/zend_language_scanner.c" yy207: YYDEBUG(207, *YYCURSOR); ++YYCURSOR; YYDEBUG(208, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1538 "Zend/zend_language_scanner.l" +#line 1540 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SR_EQUAL); } -#line 3443 "Zend/zend_language_scanner.c" +#line 3440 "Zend/zend_language_scanner.c" yy209: YYDEBUG(209, *YYCURSOR); yyaccept = 5; @@ -3450,53 +3447,53 @@ yy209: yy210: YYDEBUG(210, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1574 "Zend/zend_language_scanner.l" +#line 1576 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SL); } -#line 3458 "Zend/zend_language_scanner.c" +#line 3455 "Zend/zend_language_scanner.c" yy211: YYDEBUG(211, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '>') goto yy215; YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1494 "Zend/zend_language_scanner.l" +#line 1496 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); } -#line 3469 "Zend/zend_language_scanner.c" +#line 3466 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); ++YYCURSOR; yy214: YYDEBUG(214, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1486 "Zend/zend_language_scanner.l" +#line 1488 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_NOT_EQUAL); } -#line 3480 "Zend/zend_language_scanner.c" +#line 3477 "Zend/zend_language_scanner.c" yy215: YYDEBUG(215, *YYCURSOR); ++YYCURSOR; YYDEBUG(216, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1490 "Zend/zend_language_scanner.l" +#line 1492 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SPACESHIP); } -#line 3490 "Zend/zend_language_scanner.c" +#line 3487 "Zend/zend_language_scanner.c" yy217: YYDEBUG(217, *YYCURSOR); ++YYCURSOR; YYDEBUG(218, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1534 "Zend/zend_language_scanner.l" +#line 1536 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SL_EQUAL); } -#line 3500 "Zend/zend_language_scanner.c" +#line 3497 "Zend/zend_language_scanner.c" yy219: YYDEBUG(219, *YYCURSOR); ++YYCURSOR; @@ -3601,7 +3598,7 @@ yy228: yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2082 "Zend/zend_language_scanner.l" +#line 2085 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3648,7 +3645,7 @@ yy229: RETURN_TOKEN(T_START_HEREDOC); } -#line 3652 "Zend/zend_language_scanner.c" +#line 3649 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); yych = *++YYCURSOR; @@ -3688,31 +3685,31 @@ yy233: ++YYCURSOR; YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1478 "Zend/zend_language_scanner.l" +#line 1480 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_NOT_IDENTICAL); } -#line 3696 "Zend/zend_language_scanner.c" +#line 3693 "Zend/zend_language_scanner.c" yy236: YYDEBUG(236, *YYCURSOR); ++YYCURSOR; YYDEBUG(237, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1502 "Zend/zend_language_scanner.l" +#line 1504 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PLUS_EQUAL); } -#line 3706 "Zend/zend_language_scanner.c" +#line 3703 "Zend/zend_language_scanner.c" yy238: YYDEBUG(238, *YYCURSOR); ++YYCURSOR; YYDEBUG(239, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1466 "Zend/zend_language_scanner.l" +#line 1468 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INC); } -#line 3716 "Zend/zend_language_scanner.c" +#line 3713 "Zend/zend_language_scanner.c" yy240: YYDEBUG(240, *YYCURSOR); yych = *++YYCURSOR; @@ -3731,42 +3728,42 @@ yy242: } YYDEBUG(243, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1456 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_LIST); } -#line 3739 "Zend/zend_language_scanner.c" +#line 3736 "Zend/zend_language_scanner.c" yy244: YYDEBUG(244, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy248; YYDEBUG(245, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1482 "Zend/zend_language_scanner.l" +#line 1484 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_EQUAL); } -#line 3750 "Zend/zend_language_scanner.c" +#line 3747 "Zend/zend_language_scanner.c" yy246: YYDEBUG(246, *YYCURSOR); ++YYCURSOR; YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1450 "Zend/zend_language_scanner.l" +#line 1452 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DOUBLE_ARROW); } -#line 3760 "Zend/zend_language_scanner.c" +#line 3757 "Zend/zend_language_scanner.c" yy248: YYDEBUG(248, *YYCURSOR); ++YYCURSOR; YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1474 "Zend/zend_language_scanner.l" +#line 1476 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IS_IDENTICAL); } -#line 3770 "Zend/zend_language_scanner.c" +#line 3767 "Zend/zend_language_scanner.c" yy250: YYDEBUG(250, *YYCURSOR); yych = *++YYCURSOR; @@ -3896,11 +3893,11 @@ yy266: } YYDEBUG(269, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1780 "Zend/zend_language_scanner.l" +#line 1785 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_NS_C); } -#line 3904 "Zend/zend_language_scanner.c" +#line 3901 "Zend/zend_language_scanner.c" yy270: YYDEBUG(270, *YYCURSOR); yych = *++YYCURSOR; @@ -3920,11 +3917,11 @@ yy271: } YYDEBUG(274, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1776 "Zend/zend_language_scanner.l" +#line 1781 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DIR); } -#line 3928 "Zend/zend_language_scanner.c" +#line 3925 "Zend/zend_language_scanner.c" yy275: YYDEBUG(275, *YYCURSOR); yych = *++YYCURSOR; @@ -3949,11 +3946,11 @@ yy277: } YYDEBUG(280, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1768 "Zend/zend_language_scanner.l" +#line 1773 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_LINE); } -#line 3957 "Zend/zend_language_scanner.c" +#line 3954 "Zend/zend_language_scanner.c" yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; @@ -3988,11 +3985,11 @@ yy285: } YYDEBUG(288, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1764 "Zend/zend_language_scanner.l" +#line 1769 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_METHOD_C); } -#line 3996 "Zend/zend_language_scanner.c" +#line 3993 "Zend/zend_language_scanner.c" yy289: YYDEBUG(289, *YYCURSOR); yych = *++YYCURSOR; @@ -4043,11 +4040,11 @@ yy296: } YYDEBUG(299, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1760 "Zend/zend_language_scanner.l" +#line 1765 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FUNC_C); } -#line 4051 "Zend/zend_language_scanner.c" +#line 4048 "Zend/zend_language_scanner.c" yy300: YYDEBUG(300, *YYCURSOR); yych = *++YYCURSOR; @@ -4067,11 +4064,11 @@ yy301: } YYDEBUG(304, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1772 "Zend/zend_language_scanner.l" +#line 1777 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FILE); } -#line 4075 "Zend/zend_language_scanner.c" +#line 4072 "Zend/zend_language_scanner.c" yy305: YYDEBUG(305, *YYCURSOR); yych = *++YYCURSOR; @@ -4101,11 +4098,11 @@ yy308: } YYDEBUG(311, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1756 "Zend/zend_language_scanner.l" +#line 1761 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_TRAIT_C); } -#line 4109 "Zend/zend_language_scanner.c" +#line 4106 "Zend/zend_language_scanner.c" yy312: YYDEBUG(312, *YYCURSOR); yych = *++YYCURSOR; @@ -4135,11 +4132,11 @@ yy315: } YYDEBUG(318, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1752 "Zend/zend_language_scanner.l" +#line 1757 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CLASS_C); } -#line 4143 "Zend/zend_language_scanner.c" +#line 4140 "Zend/zend_language_scanner.c" yy319: YYDEBUG(319, *YYCURSOR); yych = *++YYCURSOR; @@ -4201,11 +4198,11 @@ yy330: } YYDEBUG(331, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1418 "Zend/zend_language_scanner.l" +#line 1420 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_HALT_COMPILER); } -#line 4209 "Zend/zend_language_scanner.c" +#line 4206 "Zend/zend_language_scanner.c" yy332: YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; @@ -4225,11 +4222,11 @@ yy334: } YYDEBUG(335, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1398 "Zend/zend_language_scanner.l" +#line 1400 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_USE); } -#line 4233 "Zend/zend_language_scanner.c" +#line 4230 "Zend/zend_language_scanner.c" yy336: YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; @@ -4248,11 +4245,11 @@ yy338: } YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1446 "Zend/zend_language_scanner.l" +#line 1448 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_UNSET); } -#line 4256 "Zend/zend_language_scanner.c" +#line 4253 "Zend/zend_language_scanner.c" yy340: YYDEBUG(340, *YYCURSOR); ++YYCURSOR; @@ -4424,11 +4421,11 @@ yy355: ++YYCURSOR; YYDEBUG(357, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1346 "Zend/zend_language_scanner.l" +#line 1348 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INT_CAST); } -#line 4432 "Zend/zend_language_scanner.c" +#line 4429 "Zend/zend_language_scanner.c" yy358: YYDEBUG(358, *YYCURSOR); yych = *++YYCURSOR; @@ -4472,11 +4469,11 @@ yy363: ++YYCURSOR; YYDEBUG(366, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1350 "Zend/zend_language_scanner.l" +#line 1352 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DOUBLE_CAST); } -#line 4480 "Zend/zend_language_scanner.c" +#line 4477 "Zend/zend_language_scanner.c" yy367: YYDEBUG(367, *YYCURSOR); yych = *++YYCURSOR; @@ -4546,11 +4543,11 @@ yy377: ++YYCURSOR; YYDEBUG(380, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1354 "Zend/zend_language_scanner.l" +#line 1356 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_STRING_CAST); } -#line 4554 "Zend/zend_language_scanner.c" +#line 4551 "Zend/zend_language_scanner.c" yy381: YYDEBUG(381, *YYCURSOR); yych = *++YYCURSOR; @@ -4583,11 +4580,11 @@ yy384: ++YYCURSOR; YYDEBUG(387, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1358 "Zend/zend_language_scanner.l" +#line 1360 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ARRAY_CAST); } -#line 4591 "Zend/zend_language_scanner.c" +#line 4588 "Zend/zend_language_scanner.c" yy388: YYDEBUG(388, *YYCURSOR); yych = *++YYCURSOR; @@ -4625,11 +4622,11 @@ yy392: ++YYCURSOR; YYDEBUG(395, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1362 "Zend/zend_language_scanner.l" +#line 1364 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_OBJECT_CAST); } -#line 4633 "Zend/zend_language_scanner.c" +#line 4630 "Zend/zend_language_scanner.c" yy396: YYDEBUG(396, *YYCURSOR); yych = *++YYCURSOR; @@ -4670,11 +4667,11 @@ yy401: ++YYCURSOR; YYDEBUG(403, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1366 "Zend/zend_language_scanner.l" +#line 1368 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_BOOL_CAST); } -#line 4678 "Zend/zend_language_scanner.c" +#line 4675 "Zend/zend_language_scanner.c" yy404: YYDEBUG(404, *YYCURSOR); yych = *++YYCURSOR; @@ -4734,11 +4731,11 @@ yy412: ++YYCURSOR; YYDEBUG(415, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1370 "Zend/zend_language_scanner.l" +#line 1372 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_UNSET_CAST); } -#line 4742 "Zend/zend_language_scanner.c" +#line 4739 "Zend/zend_language_scanner.c" yy416: YYDEBUG(416, *YYCURSOR); yych = *++YYCURSOR; @@ -4752,11 +4749,11 @@ yy417: } YYDEBUG(418, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1342 "Zend/zend_language_scanner.l" +#line 1344 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_VAR); } -#line 4760 "Zend/zend_language_scanner.c" +#line 4757 "Zend/zend_language_scanner.c" yy419: YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; @@ -4776,11 +4773,11 @@ yy421: } YYDEBUG(422, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1334 "Zend/zend_language_scanner.l" +#line 1336 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_NEW); } -#line 4784 "Zend/zend_language_scanner.c" +#line 4781 "Zend/zend_language_scanner.c" yy423: YYDEBUG(423, *YYCURSOR); yych = *++YYCURSOR; @@ -4819,11 +4816,11 @@ yy429: } YYDEBUG(430, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1394 "Zend/zend_language_scanner.l" +#line 1396 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_NAMESPACE); } -#line 4827 "Zend/zend_language_scanner.c" +#line 4824 "Zend/zend_language_scanner.c" yy431: YYDEBUG(431, *YYCURSOR); ++YYCURSOR; @@ -4832,22 +4829,22 @@ yy431: yy432: YYDEBUG(432, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1963 "Zend/zend_language_scanner.l" +#line 1968 "Zend/zend_language_scanner.l" { BEGIN(INITIAL); RETURN_TOKEN(T_CLOSE_TAG); /* implicit ';' at php-end tag */ } -#line 4841 "Zend/zend_language_scanner.c" +#line 4838 "Zend/zend_language_scanner.c" yy433: YYDEBUG(433, *YYCURSOR); ++YYCURSOR; YYDEBUG(434, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1330 "Zend/zend_language_scanner.l" +#line 1332 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_COALESCE); } -#line 4851 "Zend/zend_language_scanner.c" +#line 4848 "Zend/zend_language_scanner.c" yy435: YYDEBUG(435, *YYCURSOR); yych = *++YYCURSOR; @@ -4878,11 +4875,11 @@ yy439: ++YYCURSOR; YYDEBUG(440, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1526 "Zend/zend_language_scanner.l" +#line 1528 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CONCAT_EQUAL); } -#line 4886 "Zend/zend_language_scanner.c" +#line 4883 "Zend/zend_language_scanner.c" yy441: YYDEBUG(441, *YYCURSOR); yych = *++YYCURSOR; @@ -4891,21 +4888,21 @@ yy441: ++YYCURSOR; YYDEBUG(443, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1326 "Zend/zend_language_scanner.l" +#line 1328 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ELLIPSIS); } -#line 4899 "Zend/zend_language_scanner.c" +#line 4896 "Zend/zend_language_scanner.c" yy444: YYDEBUG(444, *YYCURSOR); ++YYCURSOR; YYDEBUG(445, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1318 "Zend/zend_language_scanner.l" +#line 1320 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); } -#line 4909 "Zend/zend_language_scanner.c" +#line 4906 "Zend/zend_language_scanner.c" yy446: YYDEBUG(446, *YYCURSOR); ++YYCURSOR; @@ -4927,32 +4924,32 @@ yy448: ++YYCURSOR; YYDEBUG(449, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1506 "Zend/zend_language_scanner.l" +#line 1508 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_MINUS_EQUAL); } -#line 4935 "Zend/zend_language_scanner.c" +#line 4932 "Zend/zend_language_scanner.c" yy450: YYDEBUG(450, *YYCURSOR); ++YYCURSOR; YYDEBUG(451, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1470 "Zend/zend_language_scanner.l" +#line 1472 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DEC); } -#line 4945 "Zend/zend_language_scanner.c" +#line 4942 "Zend/zend_language_scanner.c" yy452: YYDEBUG(452, *YYCURSOR); ++YYCURSOR; YYDEBUG(453, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1292 "Zend/zend_language_scanner.l" +#line 1294 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY); RETURN_TOKEN(T_OBJECT_OPERATOR); } -#line 4956 "Zend/zend_language_scanner.c" +#line 4953 "Zend/zend_language_scanner.c" yy454: YYDEBUG(454, *YYCURSOR); yych = *++YYCURSOR; @@ -4997,11 +4994,11 @@ yy459: } YYDEBUG(460, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1442 "Zend/zend_language_scanner.l" +#line 1444 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PUBLIC); } -#line 5005 "Zend/zend_language_scanner.c" +#line 5002 "Zend/zend_language_scanner.c" yy461: YYDEBUG(461, *YYCURSOR); yych = *++YYCURSOR; @@ -5056,11 +5053,11 @@ yy468: } YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1438 "Zend/zend_language_scanner.l" +#line 1440 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PROTECTED); } -#line 5064 "Zend/zend_language_scanner.c" +#line 5061 "Zend/zend_language_scanner.c" yy470: YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; @@ -5090,11 +5087,11 @@ yy474: } YYDEBUG(475, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1434 "Zend/zend_language_scanner.l" +#line 1436 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PRIVATE); } -#line 5098 "Zend/zend_language_scanner.c" +#line 5095 "Zend/zend_language_scanner.c" yy476: YYDEBUG(476, *YYCURSOR); ++YYCURSOR; @@ -5103,11 +5100,11 @@ yy476: } YYDEBUG(477, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1268 "Zend/zend_language_scanner.l" +#line 1270 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_PRINT); } -#line 5111 "Zend/zend_language_scanner.c" +#line 5108 "Zend/zend_language_scanner.c" yy478: YYDEBUG(478, *YYCURSOR); yych = *++YYCURSOR; @@ -5132,11 +5129,11 @@ yy481: } YYDEBUG(482, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1260 "Zend/zend_language_scanner.l" +#line 1262 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_GOTO); } -#line 5140 "Zend/zend_language_scanner.c" +#line 5137 "Zend/zend_language_scanner.c" yy483: YYDEBUG(483, *YYCURSOR); yych = *++YYCURSOR; @@ -5160,11 +5157,11 @@ yy486: } YYDEBUG(487, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1406 "Zend/zend_language_scanner.l" +#line 1408 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_GLOBAL); } -#line 5168 "Zend/zend_language_scanner.c" +#line 5165 "Zend/zend_language_scanner.c" yy488: YYDEBUG(488, *YYCURSOR); yych = *++YYCURSOR; @@ -5201,11 +5198,11 @@ yy494: } YYDEBUG(495, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1252 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_BREAK); } -#line 5209 "Zend/zend_language_scanner.c" +#line 5206 "Zend/zend_language_scanner.c" yy496: YYDEBUG(496, *YYCURSOR); yych = *++YYCURSOR; @@ -5245,11 +5242,11 @@ yy502: } YYDEBUG(503, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1236 "Zend/zend_language_scanner.l" +#line 1238 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_SWITCH); } -#line 5253 "Zend/zend_language_scanner.c" +#line 5250 "Zend/zend_language_scanner.c" yy504: YYDEBUG(504, *YYCURSOR); yych = *++YYCURSOR; @@ -5273,11 +5270,11 @@ yy507: } YYDEBUG(508, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1424 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_STATIC); } -#line 5281 "Zend/zend_language_scanner.c" +#line 5278 "Zend/zend_language_scanner.c" yy509: YYDEBUG(509, *YYCURSOR); yych = *++YYCURSOR; @@ -5304,11 +5301,11 @@ yy512: } YYDEBUG(513, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1232 "Zend/zend_language_scanner.l" +#line 1234 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_AS); } -#line 5312 "Zend/zend_language_scanner.c" +#line 5309 "Zend/zend_language_scanner.c" yy514: YYDEBUG(514, *YYCURSOR); yych = *++YYCURSOR; @@ -5327,11 +5324,11 @@ yy516: } YYDEBUG(517, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1458 "Zend/zend_language_scanner.l" +#line 1460 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ARRAY); } -#line 5335 "Zend/zend_language_scanner.c" +#line 5332 "Zend/zend_language_scanner.c" yy518: YYDEBUG(518, *YYCURSOR); ++YYCURSOR; @@ -5340,11 +5337,11 @@ yy518: } YYDEBUG(519, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1566 "Zend/zend_language_scanner.l" +#line 1568 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_LOGICAL_AND); } -#line 5348 "Zend/zend_language_scanner.c" +#line 5345 "Zend/zend_language_scanner.c" yy520: YYDEBUG(520, *YYCURSOR); yych = *++YYCURSOR; @@ -5378,11 +5375,11 @@ yy525: } YYDEBUG(526, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1426 "Zend/zend_language_scanner.l" +#line 1428 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ABSTRACT); } -#line 5386 "Zend/zend_language_scanner.c" +#line 5383 "Zend/zend_language_scanner.c" yy527: YYDEBUG(527, *YYCURSOR); yych = *++YYCURSOR; @@ -5406,11 +5403,11 @@ yy530: } YYDEBUG(531, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1192 "Zend/zend_language_scanner.l" +#line 1194 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_WHILE); } -#line 5414 "Zend/zend_language_scanner.c" +#line 5411 "Zend/zend_language_scanner.c" yy532: YYDEBUG(532, *YYCURSOR); ++YYCURSOR; @@ -5419,11 +5416,11 @@ yy532: } YYDEBUG(533, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1178 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IF); } -#line 5427 "Zend/zend_language_scanner.c" +#line 5424 "Zend/zend_language_scanner.c" yy534: YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; @@ -5475,11 +5472,11 @@ yy539: } YYDEBUG(540, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1410 "Zend/zend_language_scanner.l" +#line 1412 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ISSET); } -#line 5483 "Zend/zend_language_scanner.c" +#line 5480 "Zend/zend_language_scanner.c" yy541: YYDEBUG(541, *YYCURSOR); yych = *++YYCURSOR; @@ -5533,11 +5530,11 @@ yy547: yy548: YYDEBUG(548, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1378 "Zend/zend_language_scanner.l" +#line 1380 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INCLUDE); } -#line 5541 "Zend/zend_language_scanner.c" +#line 5538 "Zend/zend_language_scanner.c" yy549: YYDEBUG(549, *YYCURSOR); yych = *++YYCURSOR; @@ -5566,11 +5563,11 @@ yy553: } YYDEBUG(554, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1382 "Zend/zend_language_scanner.l" +#line 1384 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INCLUDE_ONCE); } -#line 5574 "Zend/zend_language_scanner.c" +#line 5571 "Zend/zend_language_scanner.c" yy555: YYDEBUG(555, *YYCURSOR); yych = *++YYCURSOR; @@ -5604,11 +5601,11 @@ yy560: } YYDEBUG(561, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1276 "Zend/zend_language_scanner.l" +#line 1278 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INTERFACE); } -#line 5612 "Zend/zend_language_scanner.c" +#line 5609 "Zend/zend_language_scanner.c" yy562: YYDEBUG(562, *YYCURSOR); yych = *++YYCURSOR; @@ -5658,11 +5655,11 @@ yy568: } YYDEBUG(569, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1402 "Zend/zend_language_scanner.l" +#line 1404 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INSTEADOF); } -#line 5666 "Zend/zend_language_scanner.c" +#line 5663 "Zend/zend_language_scanner.c" yy570: YYDEBUG(570, *YYCURSOR); yych = *++YYCURSOR; @@ -5691,11 +5688,11 @@ yy574: } YYDEBUG(575, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1228 "Zend/zend_language_scanner.l" +#line 1230 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_INSTANCEOF); } -#line 5699 "Zend/zend_language_scanner.c" +#line 5696 "Zend/zend_language_scanner.c" yy576: YYDEBUG(576, *YYCURSOR); yych = *++YYCURSOR; @@ -5739,11 +5736,11 @@ yy583: } YYDEBUG(584, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1288 "Zend/zend_language_scanner.l" +#line 1290 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_IMPLEMENTS); } -#line 5747 "Zend/zend_language_scanner.c" +#line 5744 "Zend/zend_language_scanner.c" yy585: YYDEBUG(585, *YYCURSOR); yych = *++YYCURSOR; @@ -5771,11 +5768,11 @@ yy586: } YYDEBUG(588, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1160 "Zend/zend_language_scanner.l" +#line 1162 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_TRY); } -#line 5779 "Zend/zend_language_scanner.c" +#line 5776 "Zend/zend_language_scanner.c" yy589: YYDEBUG(589, *YYCURSOR); yych = *++YYCURSOR; @@ -5794,11 +5791,11 @@ yy591: } YYDEBUG(592, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1280 "Zend/zend_language_scanner.l" +#line 1282 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_TRAIT); } -#line 5802 "Zend/zend_language_scanner.c" +#line 5799 "Zend/zend_language_scanner.c" yy593: YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; @@ -5817,11 +5814,11 @@ yy595: } YYDEBUG(596, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1172 "Zend/zend_language_scanner.l" +#line 1174 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_THROW); } -#line 5825 "Zend/zend_language_scanner.c" +#line 5822 "Zend/zend_language_scanner.c" yy597: YYDEBUG(597, *YYCURSOR); yych = *++YYCURSOR; @@ -5854,11 +5851,11 @@ yy600: yy601: YYDEBUG(601, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1156 "Zend/zend_language_scanner.l" +#line 1158 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_YIELD); } -#line 5862 "Zend/zend_language_scanner.c" +#line 5859 "Zend/zend_language_scanner.c" yy602: YYDEBUG(602, *YYCURSOR); ++YYCURSOR; @@ -5900,11 +5897,11 @@ yy607: ++YYCURSOR; YYDEBUG(608, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1152 "Zend/zend_language_scanner.l" +#line 1154 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_YIELD_FROM); } -#line 5908 "Zend/zend_language_scanner.c" +#line 5905 "Zend/zend_language_scanner.c" yy609: YYDEBUG(609, *YYCURSOR); yych = *++YYCURSOR; @@ -5965,11 +5962,11 @@ yy615: yy616: YYDEBUG(616, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1386 "Zend/zend_language_scanner.l" +#line 1388 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_REQUIRE); } -#line 5973 "Zend/zend_language_scanner.c" +#line 5970 "Zend/zend_language_scanner.c" yy617: YYDEBUG(617, *YYCURSOR); yych = *++YYCURSOR; @@ -5998,11 +5995,11 @@ yy621: } YYDEBUG(622, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1390 "Zend/zend_language_scanner.l" +#line 1392 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_REQUIRE_ONCE); } -#line 6006 "Zend/zend_language_scanner.c" +#line 6003 "Zend/zend_language_scanner.c" yy623: YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; @@ -6021,11 +6018,11 @@ yy625: } YYDEBUG(626, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1148 "Zend/zend_language_scanner.l" +#line 1150 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_RETURN); } -#line 6029 "Zend/zend_language_scanner.c" +#line 6026 "Zend/zend_language_scanner.c" yy627: YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; @@ -6115,11 +6112,11 @@ yy636: } YYDEBUG(637, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1256 "Zend/zend_language_scanner.l" +#line 1258 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CONTINUE); } -#line 6123 "Zend/zend_language_scanner.c" +#line 6120 "Zend/zend_language_scanner.c" yy638: YYDEBUG(638, *YYCURSOR); ++YYCURSOR; @@ -6128,11 +6125,11 @@ yy638: } YYDEBUG(639, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1144 "Zend/zend_language_scanner.l" +#line 1146 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CONST); } -#line 6136 "Zend/zend_language_scanner.c" +#line 6133 "Zend/zend_language_scanner.c" yy640: YYDEBUG(640, *YYCURSOR); yych = *++YYCURSOR; @@ -6157,11 +6154,11 @@ yy643: } YYDEBUG(644, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1338 "Zend/zend_language_scanner.l" +#line 1340 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CLONE); } -#line 6165 "Zend/zend_language_scanner.c" +#line 6162 "Zend/zend_language_scanner.c" yy645: YYDEBUG(645, *YYCURSOR); yych = *++YYCURSOR; @@ -6175,11 +6172,11 @@ yy646: } YYDEBUG(647, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1272 "Zend/zend_language_scanner.l" +#line 1274 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CLASS); } -#line 6183 "Zend/zend_language_scanner.c" +#line 6180 "Zend/zend_language_scanner.c" yy648: YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; @@ -6225,11 +6222,11 @@ yy655: } YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1462 "Zend/zend_language_scanner.l" +#line 1464 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CALLABLE); } -#line 6233 "Zend/zend_language_scanner.c" +#line 6230 "Zend/zend_language_scanner.c" yy657: YYDEBUG(657, *YYCURSOR); ++YYCURSOR; @@ -6238,11 +6235,11 @@ yy657: } YYDEBUG(658, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1244 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CASE); } -#line 6246 "Zend/zend_language_scanner.c" +#line 6243 "Zend/zend_language_scanner.c" yy659: YYDEBUG(659, *YYCURSOR); yych = *++YYCURSOR; @@ -6256,11 +6253,11 @@ yy660: } YYDEBUG(661, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1164 "Zend/zend_language_scanner.l" +#line 1166 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_CATCH); } -#line 6264 "Zend/zend_language_scanner.c" +#line 6261 "Zend/zend_language_scanner.c" yy662: YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; @@ -6311,11 +6308,11 @@ yy670: } YYDEBUG(671, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1140 "Zend/zend_language_scanner.l" +#line 1142 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FUNCTION); } -#line 6319 "Zend/zend_language_scanner.c" +#line 6316 "Zend/zend_language_scanner.c" yy672: YYDEBUG(672, *YYCURSOR); ++YYCURSOR; @@ -6339,11 +6336,11 @@ yy672: yy673: YYDEBUG(673, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1204 "Zend/zend_language_scanner.l" +#line 1206 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FOR); } -#line 6347 "Zend/zend_language_scanner.c" +#line 6344 "Zend/zend_language_scanner.c" yy674: YYDEBUG(674, *YYCURSOR); yych = *++YYCURSOR; @@ -6367,11 +6364,11 @@ yy677: } YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1212 "Zend/zend_language_scanner.l" +#line 1214 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FOREACH); } -#line 6375 "Zend/zend_language_scanner.c" +#line 6372 "Zend/zend_language_scanner.c" yy679: YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; @@ -6405,11 +6402,11 @@ yy681: yy682: YYDEBUG(682, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1430 "Zend/zend_language_scanner.l" +#line 1432 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FINAL); } -#line 6413 "Zend/zend_language_scanner.c" +#line 6410 "Zend/zend_language_scanner.c" yy683: YYDEBUG(683, *YYCURSOR); yych = *++YYCURSOR; @@ -6423,11 +6420,11 @@ yy684: } YYDEBUG(685, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1168 "Zend/zend_language_scanner.l" +#line 1170 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_FINALLY); } -#line 6431 "Zend/zend_language_scanner.c" +#line 6428 "Zend/zend_language_scanner.c" yy686: YYDEBUG(686, *YYCURSOR); yych = *++YYCURSOR; @@ -6458,11 +6455,11 @@ yy688: } YYDEBUG(689, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1200 "Zend/zend_language_scanner.l" +#line 1202 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DO); } -#line 6466 "Zend/zend_language_scanner.c" +#line 6463 "Zend/zend_language_scanner.c" yy690: YYDEBUG(690, *YYCURSOR); ++YYCURSOR; @@ -6471,11 +6468,11 @@ yy690: } YYDEBUG(691, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1136 "Zend/zend_language_scanner.l" +#line 1138 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_EXIT); } -#line 6479 "Zend/zend_language_scanner.c" +#line 6476 "Zend/zend_language_scanner.c" yy692: YYDEBUG(692, *YYCURSOR); yych = *++YYCURSOR; @@ -6510,11 +6507,11 @@ yy697: } YYDEBUG(698, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1248 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DEFAULT); } -#line 6518 "Zend/zend_language_scanner.c" +#line 6515 "Zend/zend_language_scanner.c" yy699: YYDEBUG(699, *YYCURSOR); yych = *++YYCURSOR; @@ -6538,11 +6535,11 @@ yy702: } YYDEBUG(703, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1220 "Zend/zend_language_scanner.l" +#line 1222 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_DECLARE); } -#line 6546 "Zend/zend_language_scanner.c" +#line 6543 "Zend/zend_language_scanner.c" yy704: YYDEBUG(704, *YYCURSOR); yych = *++YYCURSOR; @@ -6622,11 +6619,11 @@ yy715: } YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1284 "Zend/zend_language_scanner.l" +#line 1286 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_EXTENDS); } -#line 6630 "Zend/zend_language_scanner.c" +#line 6627 "Zend/zend_language_scanner.c" yy717: YYDEBUG(717, *YYCURSOR); ++YYCURSOR; @@ -6635,11 +6632,11 @@ yy717: } YYDEBUG(718, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1132 "Zend/zend_language_scanner.l" +#line 1134 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_EXIT); } -#line 6643 "Zend/zend_language_scanner.c" +#line 6640 "Zend/zend_language_scanner.c" yy719: YYDEBUG(719, *YYCURSOR); yych = *++YYCURSOR; @@ -6653,11 +6650,11 @@ yy720: } YYDEBUG(721, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1374 "Zend/zend_language_scanner.l" +#line 1376 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_EVAL); } -#line 6661 "Zend/zend_language_scanner.c" +#line 6658 "Zend/zend_language_scanner.c" yy722: YYDEBUG(722, *YYCURSOR); yych = *++YYCURSOR; @@ -6727,11 +6724,11 @@ yy731: } YYDEBUG(732, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1196 "Zend/zend_language_scanner.l" +#line 1198 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDWHILE); } -#line 6735 "Zend/zend_language_scanner.c" +#line 6732 "Zend/zend_language_scanner.c" yy733: YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; @@ -6760,11 +6757,11 @@ yy737: } YYDEBUG(738, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1240 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDSWITCH); } -#line 6768 "Zend/zend_language_scanner.c" +#line 6765 "Zend/zend_language_scanner.c" yy739: YYDEBUG(739, *YYCURSOR); ++YYCURSOR; @@ -6773,11 +6770,11 @@ yy739: } YYDEBUG(740, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1184 "Zend/zend_language_scanner.l" +#line 1186 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDIF); } -#line 6781 "Zend/zend_language_scanner.c" +#line 6778 "Zend/zend_language_scanner.c" yy741: YYDEBUG(741, *YYCURSOR); yych = *++YYCURSOR; @@ -6806,11 +6803,11 @@ yy742: yy743: YYDEBUG(743, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1208 "Zend/zend_language_scanner.l" +#line 1210 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDFOR); } -#line 6814 "Zend/zend_language_scanner.c" +#line 6811 "Zend/zend_language_scanner.c" yy744: YYDEBUG(744, *YYCURSOR); yych = *++YYCURSOR; @@ -6834,11 +6831,11 @@ yy747: } YYDEBUG(748, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1216 "Zend/zend_language_scanner.l" +#line 1218 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDFOREACH); } -#line 6842 "Zend/zend_language_scanner.c" +#line 6839 "Zend/zend_language_scanner.c" yy749: YYDEBUG(749, *YYCURSOR); yych = *++YYCURSOR; @@ -6872,11 +6869,11 @@ yy754: } YYDEBUG(755, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1224 "Zend/zend_language_scanner.l" +#line 1226 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ENDDECLARE); } -#line 6880 "Zend/zend_language_scanner.c" +#line 6877 "Zend/zend_language_scanner.c" yy756: YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; @@ -6895,11 +6892,11 @@ yy758: } YYDEBUG(759, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1414 "Zend/zend_language_scanner.l" +#line 1416 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_EMPTY); } -#line 6903 "Zend/zend_language_scanner.c" +#line 6900 "Zend/zend_language_scanner.c" yy760: YYDEBUG(760, *YYCURSOR); yych = *++YYCURSOR; @@ -6928,11 +6925,11 @@ yy761: yy762: YYDEBUG(762, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1188 "Zend/zend_language_scanner.l" +#line 1190 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ELSE); } -#line 6936 "Zend/zend_language_scanner.c" +#line 6933 "Zend/zend_language_scanner.c" yy763: YYDEBUG(763, *YYCURSOR); yych = *++YYCURSOR; @@ -6946,11 +6943,11 @@ yy764: } YYDEBUG(765, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1180 "Zend/zend_language_scanner.l" +#line 1182 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ELSEIF); } -#line 6954 "Zend/zend_language_scanner.c" +#line 6951 "Zend/zend_language_scanner.c" yy766: YYDEBUG(766, *YYCURSOR); yych = *++YYCURSOR; @@ -6964,11 +6961,11 @@ yy767: } YYDEBUG(768, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1264 "Zend/zend_language_scanner.l" +#line 1266 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_ECHO); } -#line 6972 "Zend/zend_language_scanner.c" +#line 6969 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7041,12 +7038,12 @@ yy771: yy772: YYDEBUG(772, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1297 "Zend/zend_language_scanner.l" +#line 1299 "Zend/zend_language_scanner.l" { HANDLE_NEWLINES(yytext, yyleng); RETURN_TOKEN(T_WHITESPACE); } -#line 7050 "Zend/zend_language_scanner.c" +#line 7047 "Zend/zend_language_scanner.c" yy773: YYDEBUG(773, *YYCURSOR); ++YYCURSOR; @@ -7054,13 +7051,13 @@ yy773: yy774: YYDEBUG(774, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1312 "Zend/zend_language_scanner.l" +#line 1314 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(); goto restart; } -#line 7064 "Zend/zend_language_scanner.c" +#line 7061 "Zend/zend_language_scanner.c" yy775: YYDEBUG(775, *YYCURSOR); ++YYCURSOR; @@ -7069,13 +7066,13 @@ yy775: yy776: YYDEBUG(776, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1306 "Zend/zend_language_scanner.l" +#line 1308 "Zend/zend_language_scanner.l" { yy_pop_state(); zend_copy_value(zendlval, yytext, yyleng); RETURN_TOKEN(T_STRING); } -#line 7079 "Zend/zend_language_scanner.c" +#line 7076 "Zend/zend_language_scanner.c" yy777: YYDEBUG(777, *YYCURSOR); yych = *++YYCURSOR; @@ -7096,11 +7093,11 @@ yy780: ++YYCURSOR; YYDEBUG(781, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1302 "Zend/zend_language_scanner.l" +#line 1304 "Zend/zend_language_scanner.l" { RETURN_TOKEN(T_OBJECT_OPERATOR); } -#line 7104 "Zend/zend_language_scanner.c" +#line 7101 "Zend/zend_language_scanner.c" yy782: YYDEBUG(782, *YYCURSOR); ++YYCURSOR; @@ -7185,14 +7182,14 @@ yy786: yy787: YYDEBUG(787, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1617 "Zend/zend_language_scanner.l" +#line 1619 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(); yy_push_state(ST_IN_SCRIPTING); goto restart; } -#line 7196 "Zend/zend_language_scanner.c" +#line 7193 "Zend/zend_language_scanner.c" yy788: YYDEBUG(788, *YYCURSOR); yych = *++YYCURSOR; @@ -7217,7 +7214,7 @@ yy792: ++YYCURSOR; YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1608 "Zend/zend_language_scanner.l" +#line 1610 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7225,7 +7222,7 @@ yy792: yy_push_state(ST_IN_SCRIPTING); RETURN_TOKEN(T_STRING_VARNAME); } -#line 7229 "Zend/zend_language_scanner.c" +#line 7226 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: @@ -7236,7 +7233,7 @@ yyc_ST_NOWDOC: ++YYCURSOR; YYDEBUG(797, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2341 "Zend/zend_language_scanner.l" +#line 2338 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7292,7 +7289,7 @@ nowdoc_scan_done: HANDLE_NEWLINES(yytext, yyleng - newline); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } -#line 7296 "Zend/zend_language_scanner.c" +#line 7293 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7399,7 +7396,7 @@ yy800: yy801: YYDEBUG(801, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1722 "Zend/zend_language_scanner.l" +#line 1727 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { char *end; @@ -7415,7 +7412,7 @@ string: } RETURN_TOKEN(T_NUM_STRING); } -#line 7419 "Zend/zend_language_scanner.c" +#line 7416 "Zend/zend_language_scanner.c" yy802: YYDEBUG(802, *YYCURSOR); yych = *++YYCURSOR; @@ -7435,23 +7432,23 @@ yy803: yy804: YYDEBUG(804, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1882 "Zend/zend_language_scanner.l" +#line 1887 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ RETURN_TOKEN(yytext[0]); } -#line 7444 "Zend/zend_language_scanner.c" +#line 7441 "Zend/zend_language_scanner.c" yy805: YYDEBUG(805, *YYCURSOR); ++YYCURSOR; YYDEBUG(806, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1877 "Zend/zend_language_scanner.l" +#line 1882 "Zend/zend_language_scanner.l" { yy_pop_state(); RETURN_TOKEN(']'); } -#line 7455 "Zend/zend_language_scanner.c" +#line 7452 "Zend/zend_language_scanner.c" yy807: YYDEBUG(807, *YYCURSOR); yych = *++YYCURSOR; @@ -7461,7 +7458,7 @@ yy808: ++YYCURSOR; YYDEBUG(809, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1887 "Zend/zend_language_scanner.l" +#line 1892 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); @@ -7469,7 +7466,7 @@ yy808: ZVAL_NULL(zendlval); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } -#line 7473 "Zend/zend_language_scanner.c" +#line 7470 "Zend/zend_language_scanner.c" yy810: YYDEBUG(810, *YYCURSOR); ++YYCURSOR; @@ -7478,18 +7475,18 @@ yy810: yy811: YYDEBUG(811, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1895 "Zend/zend_language_scanner.l" +#line 1900 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); RETURN_TOKEN(T_STRING); } -#line 7487 "Zend/zend_language_scanner.c" +#line 7484 "Zend/zend_language_scanner.c" yy812: YYDEBUG(812, *YYCURSOR); ++YYCURSOR; YYDEBUG(813, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2398 "Zend/zend_language_scanner.l" +#line 2395 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); @@ -7498,7 +7495,7 @@ yy812: zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7502 "Zend/zend_language_scanner.c" +#line 7499 "Zend/zend_language_scanner.c" yy814: YYDEBUG(814, *YYCURSOR); ++YYCURSOR; @@ -7534,12 +7531,12 @@ yy816: yy818: YYDEBUG(818, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1872 "Zend/zend_language_scanner.l" +#line 1877 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); RETURN_TOKEN(T_VARIABLE); } -#line 7543 "Zend/zend_language_scanner.c" +#line 7540 "Zend/zend_language_scanner.c" yy819: YYDEBUG(819, *YYCURSOR); ++YYCURSOR; @@ -7579,12 +7576,12 @@ yy824: yy826: YYDEBUG(826, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1738 "Zend/zend_language_scanner.l" +#line 1743 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ ZVAL_STRINGL(zendlval, yytext, yyleng); RETURN_TOKEN(T_NUM_STRING); } -#line 7588 "Zend/zend_language_scanner.c" +#line 7585 "Zend/zend_language_scanner.c" yy827: YYDEBUG(827, *YYCURSOR); ++YYCURSOR; @@ -7607,6 +7604,6 @@ yy829: goto yy826; } } -#line 2407 "Zend/zend_language_scanner.l" +#line 2404 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index a20f7d57f6..47958b7182 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1009,8 +1009,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot if (!valid) { zend_throw_exception(zend_ce_parse_error, - "Invalid UTF-8 codepoint escape sequence", E_PARSE); + "Invalid UTF-8 codepoint escape sequence", 0); zval_ptr_dtor(zendlval); + ZVAL_UNDEF(zendlval); return FAILURE; } @@ -1020,8 +1021,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot /* per RFC 3629, UTF-8 can only represent 21 bits */ if (codepoint > 0x10FFFF || errno) { zend_throw_exception(zend_ce_parse_error, - "Invalid UTF-8 codepoint escape sequence: Codepoint too large", E_PARSE); + "Invalid UTF-8 codepoint escape sequence: Codepoint too large", 0); zval_ptr_dtor(zendlval); + ZVAL_UNDEF(zendlval); return FAILURE; } @@ -1658,8 +1660,9 @@ NEWLINE ("\r"|"\n"|"\r\n") * Because the lexing itself doesn't do that for us */ if (end != yytext + yyleng) { - zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_LNUMBER); } } else { errno = 0; @@ -1675,16 +1678,18 @@ NEWLINE ("\r"|"\n"|"\r\n") /* Also not an assert for the same reason */ if (end != yytext + yyleng) { zend_throw_exception(zend_ce_parse_error, - "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_DNUMBER); } ZEND_ASSERT(!errno); RETURN_TOKEN(T_DNUMBER); } /* Also not an assert for the same reason */ if (end != yytext + yyleng) { - zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", E_PARSE); - RETURN_TOKEN(T_ERROR); + zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); + ZVAL_UNDEF(zendlval); + RETURN_TOKEN(T_DNUMBER); } } ZEND_ASSERT(!errno); @@ -2042,9 +2047,7 @@ inline_char_handler: switch (*YYCURSOR++) { case '"': yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"'); RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING); case '$': if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { @@ -2211,9 +2214,7 @@ inline_char_handler: double_quotes_scan_done: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng, '"') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng, '"'); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } @@ -2255,9 +2256,7 @@ double_quotes_scan_done: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng, '`') == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng, '`'); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } @@ -2331,9 +2330,7 @@ double_quotes_scan_done: heredoc_scan_done: yyleng = YYCURSOR - SCNG(yy_text); - if (zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0) == FAILURE) { - RETURN_TOKEN(T_ERROR); - } + zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0); RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE); } diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 261489b4a1..e38246ee87 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -102,12 +102,14 @@ ZEND_API zend_resource* zend_register_resource(void *rsrc_pointer, int rsrc_type ZEND_API void *zend_fetch_resource2(zend_resource *res, const char *resource_type_name, int resource_type1, int resource_type2) { - if (resource_type1 == res->type) { - return res->ptr; - } + if (res) { + if (resource_type1 == res->type) { + return res->ptr; + } - if (resource_type2 == res->type) { - return res->ptr; + if (resource_type2 == res->type) { + return res->ptr; + } } if (resource_type_name) { diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 64c2620bf3..77916f25a3 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1760,7 +1760,7 @@ static inline void zend_free_obj_get_result(zval *op) /* {{{ */ } /* }}} */ -static zend_always_inline int i_compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ +ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ { int ret; int converted = 0; @@ -1942,15 +1942,9 @@ static zend_always_inline int i_compare_function(zval *result, zval *op1, zval * } /* }}} */ -ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ -{ - return i_compare_function(result, op1, op2); -} -/* }}} */ - ZEND_API int zval_compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ { - return i_compare_function(result, op1, op2); + return compare_function(result, op1, op2); } /* }}} */ @@ -2888,7 +2882,7 @@ static zend_always_inline void zend_memnstr_ex_pre(unsigned int td[], const char } /* }}} */ -ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const char *needle, size_t needle_len, char *end) /* {{{ */ +ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const char *needle, size_t needle_len, const char *end) /* {{{ */ { unsigned int td[256]; register size_t i; @@ -2919,7 +2913,7 @@ ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const c } /* }}} */ -ZEND_API const char* ZEND_FASTCALL zend_memnrstr_ex(const char *haystack, const char *needle, size_t needle_len, char *end) /* {{{ */ +ZEND_API const char* ZEND_FASTCALL zend_memnrstr_ex(const char *haystack, const char *needle, size_t needle_len, const char *end) /* {{{ */ { unsigned int td[256]; register size_t i; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 541d6f978f..21bf9dd67f 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -89,8 +89,8 @@ ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *ins */ ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t length, zend_long *lval, double *dval, int allow_errors, int *oflow_info); -ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const char *needle, size_t needle_len, char *end); -ZEND_API const char* ZEND_FASTCALL zend_memnrstr_ex(const char *haystack, const char *needle, size_t needle_len, char *end); +ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const char *needle, size_t needle_len, const char *end); +ZEND_API const char* ZEND_FASTCALL zend_memnrstr_ex(const char *haystack, const char *needle, size_t needle_len, const char *end); #if SIZEOF_ZEND_LONG == 4 # define ZEND_DOUBLE_FITS_LONG(d) (!((d) > ZEND_LONG_MAX || (d) < ZEND_LONG_MIN)) @@ -141,7 +141,7 @@ static zend_always_inline zend_uchar is_numeric_string(const char *str, size_t l ZEND_API zend_uchar ZEND_FASTCALL is_numeric_str_function(const zend_string *str, zend_long *lval, double *dval); static zend_always_inline const char * -zend_memnstr(const char *haystack, const char *needle, size_t needle_len, char *end) +zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end) { const char *p = haystack; const char ne = needle[needle_len-1]; diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index 214ece53e6..2464f48c0f 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -93,7 +93,7 @@ # define __has_builtin(x) 0 #endif -#if defined(ZEND_WIN32) +#if defined(ZEND_WIN32) && !defined(__clang__) # define ZEND_ASSUME(c) __assume(c) #elif ((defined(__GNUC__) && ZEND_GCC_VERSION >= 4005) || __has_builtin(__builtin_unreachable)) && PHP_HAVE_BUILTIN_EXPECT # define ZEND_ASSUME(c) do { \ @@ -117,6 +117,12 @@ # define EMPTY_SWITCH_DEFAULT_CASE() default: ZEND_ASSUME(0); break; #endif +#if defined(__GNUC__) && __GNUC__ >= 4 +# define ZEND_IGNORE_VALUE(x) (({ __typeof__ (x) __x = (x); (void) __x; })) +#else +# define ZEND_IGNORE_VALUE(x) ((void) (x)) +#endif + /* all HAVE_XXX test have to be after the include of zend_config above */ #if defined(HAVE_LIBDL) && !defined(ZEND_WIN32) @@ -219,7 +225,7 @@ char *alloca(); # define ZEND_FASTCALL __attribute__((fastcall)) #elif defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER == 1700 # define ZEND_FASTCALL __fastcall -#elif defined(_MSC_VER) && _MSC_VER >= 1800 +#elif defined(_MSC_VER) && _MSC_VER >= 1800 && !defined(__clang__) # define ZEND_FASTCALL __vectorcall #else # define ZEND_FASTCALL diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 7d7961cb10..c8fd149320 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -477,6 +477,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_OPT_IMMUTABLE(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_IMMUTABLE << Z_TYPE_FLAGS_SHIFT)) != 0) #define Z_OPT_IMMUTABLE_P(zval_p) Z_OPT_IMMUTABLE(*(zval_p)) +#define Z_OPT_ISREF(zval) (Z_OPT_TYPE(zval) == IS_REFERENCE) +#define Z_OPT_ISREF_P(zval_p) Z_OPT_ISREF(*(zval_p)) + #define Z_ISREF(zval) (Z_TYPE(zval) == IS_REFERENCE) #define Z_ISREF_P(zval_p) Z_ISREF(*(zval_p)) @@ -871,6 +874,12 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) { } \ } while (0) +#define ZVAL_OPT_DEREF(z) do { \ + if (UNEXPECTED(Z_OPT_ISREF_P(z))) { \ + (z) = Z_REFVAL_P(z); \ + } \ + } while (0) + #define ZVAL_MAKE_REF(zv) do { \ zval *__zv = (zv); \ if (!Z_ISREF_P(__zv)) { \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b553a864a8..3000e5ddfe 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -65,8 +65,7 @@ ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV) add_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -109,8 +108,7 @@ ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV) sub_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -156,8 +154,7 @@ ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) mul_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -172,8 +169,7 @@ ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV) fast_div_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -211,8 +207,7 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV) mod_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -227,8 +222,7 @@ ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) shift_left_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -243,8 +237,7 @@ ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) shift_right_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -304,8 +297,7 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV) FREE_OP1(); } while (0); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) @@ -324,7 +316,7 @@ ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) ZEND_VM_SMART_BRANCH(result, (OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -345,7 +337,7 @@ ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) ZEND_VM_SMART_BRANCH(result, (OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -415,8 +407,7 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) ZVAL_BOOL(result, Z_LVAL_P(result) == 0); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -484,8 +475,7 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) ZVAL_BOOL(result, Z_LVAL_P(result) != 0); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -535,8 +525,7 @@ ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV) ZVAL_BOOL(result, Z_LVAL_P(result) < 0); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -586,8 +575,7 @@ ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -602,8 +590,7 @@ ZEND_VM_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV) compare_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -618,8 +605,7 @@ ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) bitwise_or_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -634,8 +620,7 @@ ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV) bitwise_and_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -650,8 +635,7 @@ ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -666,8 +650,7 @@ ZEND_VM_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV) boolean_xor_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY) @@ -679,8 +662,7 @@ ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY) bitwise_not_function(EX_VAR(opline->result.var), GET_OP1_ZVAL_PTR(BP_VAR_R)); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY) @@ -693,17 +675,17 @@ ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY) if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_FALSE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_TRUE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_TRUE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val)); FREE_OP1(); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -770,9 +752,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR| FREE_OP2(); FREE_OP1_VAR_PTR(); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR|UNUSED|CV, binary_op_type binary_op) @@ -843,9 +823,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR| FREE_OP2(); FREE_OP(free_op_data1); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_type binary_op) @@ -882,8 +860,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_ FREE_OP2(); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|CV, CONST|TMPVAR|UNUSED|CV) @@ -1174,8 +1151,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C FREE_OP2(); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -1252,8 +1228,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR| FREE_OP2(); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -1309,8 +1284,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY) } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY) @@ -1356,8 +1330,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY) } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) @@ -1396,8 +1369,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) @@ -1436,8 +1408,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY) @@ -1467,8 +1438,7 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY) } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int type) @@ -1521,8 +1491,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V zend_string_release(name); } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -1619,8 +1588,7 @@ ZEND_VM_C_LABEL(fetch_var_return): } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(80, ZEND_FETCH_R, CONST|TMPVAR|CV, UNUSED|CONST|VAR) @@ -1670,8 +1638,7 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV) zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|CV) @@ -1690,11 +1657,10 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|CV) zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|CV) @@ -1713,11 +1679,10 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|CV) zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -1731,8 +1696,7 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV) zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|CV) @@ -1758,7 +1722,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUS } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -1774,8 +1738,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUS FREE_OP2(); FREE_OP1(); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV) @@ -1795,11 +1758,10 @@ ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV) zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -1872,8 +1834,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): FREE_OP2(); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -1901,11 +1862,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMPVAR|CV) zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -1932,11 +1892,10 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMPVAR|CV) zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -2009,8 +1968,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object): FREE_OP2(); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -2046,11 +2004,10 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|CV, CONST|TMPV zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R); } @@ -2081,11 +2038,10 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|CV, CONST|TMPVAR|CV) zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMPVAR|CV, CONST) @@ -2129,8 +2085,7 @@ ZEND_VM_C_LABEL(try_fetch_list): } ZVAL_NULL(EX_VAR(opline->result.var)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -2160,9 +2115,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) FREE_OP2(); FREE_OP1_VAR_PTR(); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|CV) @@ -2268,9 +2221,7 @@ ZEND_VM_C_LABEL(assign_dim_clean): } FREE_OP1_VAR_PTR(); /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV) @@ -2298,8 +2249,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV) /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) @@ -2317,12 +2267,19 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) FREE_UNFETCHED_OP1(); HANDLE_EXCEPTION(); } + if (OP1_TYPE == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + FREE_OP2_VAR_PTR(); + HANDLE_EXCEPTION(); + } if (OP2_TYPE == IS_VAR && (value_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - if (!OP2_FREE) { - PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */ + if (!OP2_FREE && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op2.var)) != IS_INDIRECT)) { /* undo the effect of get_zval_ptr_ptr() */ + Z_TRY_ADDREF_P(value_ptr); } zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -2338,14 +2295,6 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) FREE_OP2_VAR_PTR(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(variable_ptr))) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - FREE_OP2_VAR_PTR(); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); - } if ((OP1_TYPE == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (OP2_TYPE == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -2360,8 +2309,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) FREE_OP1_VAR_PTR(); FREE_OP2_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) @@ -2412,8 +2360,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) HANDLE_EXCEPTION_LEAVE(); } - LOAD_OPLINE(); - ZEND_VM_INC_OPCODE(); + LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) { zend_detach_symbol_table(execute_data); @@ -2429,8 +2376,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) HANDLE_EXCEPTION_LEAVE(); } - LOAD_OPLINE(); - ZEND_VM_INC_OPCODE(); + LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else { if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) { @@ -2484,11 +2430,9 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, ANY) ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (OP1_TYPE == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - } + if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); @@ -2521,16 +2465,12 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, ANY) ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (OP1_TYPE == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -2642,16 +2582,12 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, ANY) ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - if (OP1_TYPE == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -2673,12 +2609,14 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, ANY) ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY) { + zval *var; USE_OPLINE SAVE_OPLINE(); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + var = EX_VAR(opline->op1.var); + zval_ptr_dtor_nogc(var); + ZVAL_NULL(var); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY) @@ -2690,10 +2628,11 @@ ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY) var = EX_VAR(opline->op1.var); if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) { zend_hash_iterator_del(Z_FE_ITER_P(var)); + Z_FE_ITER_P(var) = (uint32_t)-1; } zval_ptr_dtor_nogc(var); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZVAL_NULL(var); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV) @@ -2760,8 +2699,7 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV) } while (0); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV) @@ -2791,7 +2729,7 @@ ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV) } rope[0] = _zval_get_string_func(var); FREE_OP2(); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -2824,7 +2762,7 @@ ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV) } rope[opline->extended_value] = _zval_get_string_func(var); FREE_OP2(); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -2888,13 +2826,9 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV) USE_OPLINE SAVE_OPLINE(); - if (EG(exception)) { - zend_exception_save(); - } if (OP2_TYPE == IS_UNUSED) { Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_free_op free_op2; zval *class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R); @@ -2925,8 +2859,7 @@ ZEND_VM_C_LABEL(try_class_name): } FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -3048,8 +2981,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR FREE_OP2(); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSED|CV) @@ -3181,8 +3113,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST) @@ -3246,8 +3177,7 @@ ZEND_VM_C_LABEL(try_function_name): called_scope = zend_fetch_class_by_name(lcname, NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { zend_string_release(lcname); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } mname = zend_string_init(Z_STRVAL_P(function_name) + (cname_length + sizeof("::") - 1), mname_length, 0); @@ -3346,8 +3276,7 @@ ZEND_VM_C_LABEL(try_function_name): object = NULL; called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (called_scope->get_static_method) { @@ -3416,8 +3345,7 @@ ZEND_VM_C_LABEL(try_function_name): call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV) @@ -3473,8 +3401,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV) EX(call) = call; FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST) @@ -3960,8 +3887,7 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED) } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY) @@ -4268,13 +4194,16 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, ANY) varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (OP1_TYPE == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (OP1_TYPE == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -4295,7 +4224,7 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, ANY) ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) +ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, ANY) { USE_OPLINE zend_free_op free_op1; @@ -4307,27 +4236,22 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) } } - varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); - if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { - SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); - } + varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || (Z_VAR_FLAGS_P(varptr) & IS_VAR_RET_REF)) && (Z_ISREF_P(varptr) || Z_TYPE_P(varptr) == IS_OBJECT)) { ZVAL_MAKE_REF(varptr); - if (OP1_TYPE == IS_CV) { - Z_ADDREF_P(varptr); - } } else { if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? !(opline->extended_value & ZEND_ARG_SEND_SILENT) : !ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { SAVE_OPLINE(); zend_error(E_NOTICE, "Only variables should be passed by reference"); - CHECK_EXCEPTION(); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -4391,13 +4315,16 @@ ZEND_VM_C_LABEL(send_var_by_ref): varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (OP1_TYPE == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (OP1_TYPE == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -4576,8 +4503,7 @@ ZEND_VM_C_LABEL(unpack_iter_dtor): } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY) @@ -4678,8 +4604,7 @@ ZEND_VM_C_LABEL(send_array): } ZEND_HASH_FOREACH_END(); } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) @@ -4715,8 +4640,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) Z_OBJ(EX(call)->This) = NULL; FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZVAL_NEW_REF(arg, arg); @@ -4735,8 +4659,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) ZVAL_COPY_VALUE(param, arg); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY) @@ -4837,8 +4760,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY) array_init(params); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY) @@ -4851,17 +4773,17 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY) if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_FALSE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val)); FREE_OP1(); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -4954,8 +4876,7 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV) compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY) @@ -4972,8 +4893,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY) } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce); } @@ -5008,8 +4928,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY) ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -5091,8 +5010,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY) } } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) @@ -5118,8 +5036,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) /* non-qualified constant - allow text substitution */ zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); @@ -5300,8 +5217,7 @@ ZEND_VM_C_LABEL(num_index): } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|UNUSED|CV) @@ -5391,8 +5307,7 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY) } FREE_OP1_IF_VAR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (opline->extended_value == IS_ARRAY) { @@ -5435,8 +5350,7 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY) } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY) @@ -5594,8 +5508,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR) } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); @@ -5646,8 +5559,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR) zend_string_release(Z_STR(tmp)); } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -5746,8 +5658,7 @@ ZEND_VM_C_LABEL(num_index_dim): FREE_OP2(); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -5791,8 +5702,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) FREE_OP2(); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, ANY) @@ -5814,8 +5724,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, ANY) Z_FE_POS_P(result) = 0; FREE_OP1_IF_VAR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { HashPosition pos = 0; @@ -5848,8 +5757,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, ANY) Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); FREE_OP1_IF_VAR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0); @@ -5890,8 +5798,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, ANY) if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -5959,8 +5866,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, ANY) Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { @@ -5995,8 +5901,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, ANY) Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); FREE_OP1_VAR_PTR(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); @@ -6053,8 +5958,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, ANY) if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -6503,8 +6407,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR) } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -6547,8 +6450,7 @@ ZEND_VM_C_LABEL(is_var_return): ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -6686,8 +6588,7 @@ ZEND_VM_C_LABEL(isset_dim_obj_exit): FREE_OP1(); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) @@ -6734,13 +6635,11 @@ ZEND_VM_C_LABEL(isset_no_object): FREE_OP1(); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY) { -#if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED) USE_OPLINE SAVE_OPLINE(); @@ -6764,7 +6663,6 @@ ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY) } while (0); FREE_OP1(); } -#endif zend_bailout(); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -6846,8 +6744,7 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, ANY) } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, ANY) @@ -6885,8 +6782,7 @@ ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, ANY) } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY) @@ -6898,8 +6794,9 @@ ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY) value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { SAVE_OPLINE(); - value = GET_OP1_UNDEF_CV(value, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); + ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) { @@ -6924,30 +6821,36 @@ ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY) ZEND_VM_HANDLER(101, ZEND_EXT_STMT, ANY, ANY) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } ZEND_VM_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } ZEND_VM_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -6958,8 +6861,7 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY) SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY) @@ -6968,8 +6870,7 @@ ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY) SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY) @@ -6983,8 +6884,7 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY) Z_CE_P(zce) != Z_CE_P(orig_zce))) { do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY) @@ -7005,8 +6905,7 @@ ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY) zend_verify_abstract_class(ce); } ce->ce_flags |= ZEND_ACC_ANON_BOUND; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, ANY, ANY) @@ -7025,8 +6924,7 @@ ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, ANY, ANY) zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value))); ce->ce_flags |= ZEND_ACC_ANON_BOUND; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY) @@ -7035,8 +6933,7 @@ ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY) SAVE_OPLINE(); do_bind_function(&EX(func)->op_array, opline, EG(function_table), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY) @@ -7048,7 +6945,7 @@ ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY) if (zend_ticks_function) { SAVE_OPLINE(); zend_ticks_function(opline->extended_value); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -7076,8 +6973,7 @@ ZEND_VM_C_LABEL(try_instanceof): if (UNEXPECTED(ce == NULL)) { ZVAL_FALSE(EX_VAR(opline->result.var)); FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -7097,17 +6993,20 @@ ZEND_VM_C_LABEL(try_instanceof): FREE_OP1(); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(104, ZEND_EXT_NOP, ANY, ANY) { + USE_OPLINE + ZEND_VM_NEXT_OPCODE(); } ZEND_VM_HANDLER(0, ZEND_NOP, ANY, ANY) { + USE_OPLINE + ZEND_VM_NEXT_OPCODE(); } @@ -7123,8 +7022,7 @@ ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST) } else { iface = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE); if (UNEXPECTED(iface == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), iface); } @@ -7134,8 +7032,7 @@ ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST) } zend_do_implement_interface(ce, iface); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY) @@ -7152,8 +7049,7 @@ ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY) EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_TRAIT); if (UNEXPECTED(trait == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (!(trait->ce_flags & ZEND_ACC_TRAIT)) { zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name)); @@ -7163,8 +7059,7 @@ ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY) zend_do_implement_trait(ce, trait); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(155, ZEND_BIND_TRAITS, ANY, ANY) @@ -7174,8 +7069,7 @@ ZEND_VM_HANDLER(155, ZEND_BIND_TRAITS, ANY, ANY) SAVE_OPLINE(); zend_do_bind_traits(ce); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) @@ -7206,6 +7100,18 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) } } + if (catch_op_num) { + if ((EX(func)->op_array.opcodes[op_num].opcode == ZEND_FREE && (EX(func)->op_array.opcodes[op_num].extended_value & ZEND_FREE_ON_RETURN)) + || (EX(func)->op_array.opcodes[op_num].opcode == ZEND_FE_FREE && (EX(func)->op_array.opcodes[op_num].extended_value & ZEND_FREE_ON_RETURN)) + ) { + /* exceptions thrown because of TMP variable destruction on "return" + * statement should't be caught in the same function. + * See: Zend/tests/try_finally_012.phpt + */ + catch_op_num = 0; + } + } + i_cleanup_unfinished_execution(execute_data, op_num, catch_op_num); if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) { @@ -7248,8 +7154,7 @@ ZEND_VM_HANDLER(146, ZEND_VERIFY_ABSTRACT_CLASS, ANY, ANY) SAVE_OPLINE(); zend_verify_abstract_class(Z_CE_P(EX_VAR(opline->op1.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) @@ -7317,8 +7222,7 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST) FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED) @@ -7340,8 +7244,7 @@ ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED) EG(scope), EX(called_scope), Z_OBJ(EX(This)) ? &EX(This) : NULL); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(156, ZEND_SEPARATE, VAR, UNUSED) @@ -7620,10 +7523,13 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, ANY, ANY) ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]); ZEND_VM_CONTINUE(); } - /* set no delayed exception */ - Z_OBJ_P(fast_call) = NULL; - /* set return address */ - fast_call->u2.lineno = opline - EX(func)->op_array.opcodes; + if (opline->extended_value == ZEND_FAST_CALL_FROM_FINALLY && UNEXPECTED(Z_OBJ_P(fast_call) != NULL)) { + fast_call->u2.lineno = (uint32_t)-1; + } else { + Z_OBJ_P(fast_call) = NULL; + /* set return address */ + fast_call->u2.lineno = opline - EX(func)->op_array.opcodes; + } ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1)); ZEND_VM_CONTINUE(); } @@ -7676,8 +7582,7 @@ ZEND_VM_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV) pow_function(EX_VAR(opline->result.var), op1, op2); FREE_OP1(); FREE_OP2(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|CV, CONST|TMPVAR|CV) @@ -7806,8 +7711,7 @@ ZEND_VM_C_LABEL(try_strlen): } while (0); } FREE_OP1(); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY) @@ -7843,8 +7747,7 @@ ZEND_VM_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY) FREE_OP1(); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_HANDLER(122, ZEND_DEFINED, CONST, ANY) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b04a54c1e3..130c2cf5ab 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -311,11 +311,11 @@ static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* #ifdef ZEND_VM_FP_GLOBAL_REG -register zend_execute_data *execute_data __asm__(ZEND_VM_FP_GLOBAL_REG); +register zend_execute_data* volatile execute_data __asm__(ZEND_VM_FP_GLOBAL_REG); #endif #ifdef ZEND_VM_IP_GLOBAL_REG -register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG); +register const zend_op* volatile opline __asm__(ZEND_VM_IP_GLOBAL_REG); #endif #ifdef ZEND_VM_FP_GLOBAL_REG @@ -348,23 +348,24 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H #undef DCL_OPLINE #undef USE_OPLINE #undef LOAD_OPLINE +#undef LOAD_OPLINE_EX #undef SAVE_OPLINE #define DCL_OPLINE #ifdef ZEND_VM_IP_GLOBAL_REG # define OPLINE opline # define USE_OPLINE # define LOAD_OPLINE() opline = EX(opline) +# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1 # define SAVE_OPLINE() EX(opline) = opline #else # define OPLINE EX(opline) # define USE_OPLINE const zend_op *opline = EX(opline); # define LOAD_OPLINE() +# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE() # define SAVE_OPLINE() #endif -#undef CHECK_EXCEPTION #undef HANDLE_EXCEPTION #undef HANDLE_EXCEPTION_LEAVE -#define CHECK_EXCEPTION() LOAD_OPLINE() #define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE() #define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE() #if defined(ZEND_VM_FP_GLOBAL_REG) @@ -498,8 +499,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ HANDLE_EXCEPTION_LEAVE(); } - LOAD_OPLINE(); - ZEND_VM_INC_OPCODE(); + LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) { zend_detach_symbol_table(execute_data); @@ -515,8 +515,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ HANDLE_EXCEPTION_LEAVE(); } - LOAD_OPLINE(); - ZEND_VM_INC_OPCODE(); + LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else { if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) { @@ -1091,8 +1090,7 @@ unpack_iter_dtor: } FREE_OP(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1193,8 +1191,7 @@ send_array: } ZEND_HASH_FOREACH_END(); } FREE_OP(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1256,8 +1253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEN array_init(params); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1295,30 +1291,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEN static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + if (!EG(no_extensions)) { SAVE_OPLINE(); zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(func)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -1329,8 +1331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEN SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1339,8 +1340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_H SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1354,8 +1354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYE Z_CE_P(zce) != Z_CE_P(orig_zce))) { do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1376,8 +1375,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE zend_verify_abstract_class(ce); } ce->ce_flags |= ZEND_ACC_ANON_BOUND; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1396,8 +1394,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_S zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value))); ce->ce_flags |= ZEND_ACC_ANON_BOUND; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1406,8 +1403,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER( SAVE_OPLINE(); do_bind_function(&EX(func)->op_array, opline, EG(function_table), 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1419,7 +1415,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE if (zend_ticks_function) { SAVE_OPLINE(); zend_ticks_function(opline->extended_value); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -1427,11 +1423,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + ZEND_VM_NEXT_OPCODE(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + ZEND_VM_NEXT_OPCODE(); } @@ -1449,8 +1449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OP EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_TRAIT); if (UNEXPECTED(trait == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (!(trait->ce_flags & ZEND_ACC_TRAIT)) { zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name)); @@ -1460,8 +1459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OP zend_do_implement_trait(ce, trait); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1471,8 +1469,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_ SAVE_OPLINE(); zend_do_bind_traits(ce); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1503,6 +1500,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER( } } + if (catch_op_num) { + if ((EX(func)->op_array.opcodes[op_num].opcode == ZEND_FREE && (EX(func)->op_array.opcodes[op_num].extended_value & ZEND_FREE_ON_RETURN)) + || (EX(func)->op_array.opcodes[op_num].opcode == ZEND_FE_FREE && (EX(func)->op_array.opcodes[op_num].extended_value & ZEND_FREE_ON_RETURN)) + ) { + /* exceptions thrown because of TMP variable destruction on "return" + * statement should't be caught in the same function. + * See: Zend/tests/try_finally_012.phpt + */ + catch_op_num = 0; + } + } + i_cleanup_unfinished_execution(execute_data, op_num, catch_op_num); if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) { @@ -1545,8 +1554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HAN SAVE_OPLINE(); zend_verify_abstract_class(Z_CE_P(EX_VAR(opline->op1.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1607,10 +1615,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CALL_SPEC_HANDLER(ZEND_OP ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]); ZEND_VM_CONTINUE(); } - /* set no delayed exception */ - Z_OBJ_P(fast_call) = NULL; - /* set return address */ - fast_call->u2.lineno = opline - EX(func)->op_array.opcodes; + if (opline->extended_value == ZEND_FAST_CALL_FROM_FINALLY && UNEXPECTED(Z_OBJ_P(fast_call) != NULL)) { + fast_call->u2.lineno = (uint32_t)-1; + } else { + Z_OBJ_P(fast_call) = NULL; + /* set return address */ + fast_call->u2.lineno = opline - EX(func)->op_array.opcodes; + } ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1)); ZEND_VM_CONTINUE(); } @@ -1847,13 +1858,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER USE_OPLINE SAVE_OPLINE(); - if (EG(exception)) { - zend_exception_save(); - } if (IS_CONST == IS_UNUSED) { Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zval *class_name = EX_CONSTANT(opline->op2); @@ -1883,8 +1890,7 @@ try_class_name: zend_throw_error(NULL, "Class name must be a valid object or a string"); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -1949,8 +1955,7 @@ try_function_name: called_scope = zend_fetch_class_by_name(lcname, NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { zend_string_release(lcname); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } mname = zend_string_init(Z_STRVAL_P(function_name) + (cname_length + sizeof("::") - 1), mname_length, 0); @@ -2049,8 +2054,7 @@ try_function_name: object = NULL; called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (called_scope->get_static_method) { @@ -2119,8 +2123,7 @@ try_function_name: call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2262,8 +2265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDL } else { iface = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE); if (UNEXPECTED(iface == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), iface); } @@ -2273,8 +2275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDL } zend_do_implement_interface(ce, iface); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2282,13 +2283,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLE USE_OPLINE SAVE_OPLINE(); - if (EG(exception)) { - zend_exception_save(); - } if (IS_UNUSED == IS_UNUSED) { Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zval *class_name = NULL; @@ -2318,8 +2315,7 @@ try_class_name: zend_throw_error(NULL, "Class name must be a valid object or a string"); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -2328,13 +2324,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZE USE_OPLINE SAVE_OPLINE(); - if (EG(exception)) { - zend_exception_save(); - } if (IS_CV == IS_UNUSED) { Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zval *class_name = _get_zval_ptr_cv_undef(execute_data, opline->op2.var); @@ -2364,8 +2356,7 @@ try_class_name: zend_throw_error(NULL, "Class name must be a valid object or a string"); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -2402,8 +2393,7 @@ try_function_name: called_scope = zend_fetch_class_by_name(lcname, NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { zend_string_release(lcname); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } mname = zend_string_init(Z_STRVAL_P(function_name) + (cname_length + sizeof("::") - 1), mname_length, 0); @@ -2502,8 +2492,7 @@ try_function_name: object = NULL; called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (called_scope->get_static_method) { @@ -2572,8 +2561,7 @@ try_function_name: call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2581,13 +2569,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLE USE_OPLINE SAVE_OPLINE(); - if (EG(exception)) { - zend_exception_save(); - } if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_free_op free_op2; zval *class_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -2618,8 +2602,7 @@ try_class_name: } zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -2656,8 +2639,7 @@ try_function_name: called_scope = zend_fetch_class_by_name(lcname, NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { zend_string_release(lcname); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } mname = zend_string_init(Z_STRVAL_P(function_name) + (cname_length + sizeof("::") - 1), mname_length, 0); @@ -2756,8 +2738,7 @@ try_function_name: object = NULL; called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(called_scope == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (called_scope->get_static_method) { @@ -2826,8 +2807,7 @@ try_function_name: call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2839,8 +2819,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND bitwise_not_function(EX_VAR(opline->result.var), EX_CONSTANT(opline->op1)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2853,17 +2832,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZE if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_FALSE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_TRUE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_TRUE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -2894,8 +2873,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_O zend_string_release(str); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -2910,11 +2888,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_O ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CONST == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - } + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); @@ -2947,16 +2923,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CONST == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -3068,16 +3040,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZE ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - if (IS_CONST == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -3350,17 +3318,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_O if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_FALSE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -3379,8 +3347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce); } @@ -3415,8 +3382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -3498,8 +3464,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_ } } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -3557,8 +3522,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_O if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (opline->extended_value == IS_ARRAY) { @@ -3600,8 +3564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_O } } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -3751,8 +3714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER( } Z_FE_POS_P(result) = 0; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { HashPosition pos = 0; @@ -3784,8 +3746,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER( } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0); @@ -3825,8 +3786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER( if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -3893,8 +3853,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { @@ -3928,8 +3887,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); @@ -3986,8 +3944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -4005,7 +3962,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if 0 || (IS_CONST != IS_UNUSED) USE_OPLINE SAVE_OPLINE(); @@ -4029,7 +3985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_O } while (0); } -#endif zend_bailout(); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -4067,8 +4022,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4105,8 +4059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZE ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4118,8 +4071,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(Z value = EX_CONSTANT(opline->op1); if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { SAVE_OPLINE(); - value = GET_OP1_UNDEF_CV(value, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); + ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) { @@ -4269,8 +4223,7 @@ try_strlen: } while (0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4306,8 +4259,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CONST_HANDLER( ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4370,8 +4322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(Z add_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4414,8 +4365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(Z sub_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4461,8 +4411,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z mul_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4477,8 +4426,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(Z fast_div_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4516,8 +4464,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z mod_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4532,8 +4479,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZE shift_left_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4548,8 +4494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZE shift_right_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4609,8 +4554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4629,7 +4573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_ ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -4650,7 +4594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CO ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -4720,8 +4664,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4789,8 +4732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_ ZVAL_BOOL(result, Z_LVAL_P(result) != 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4840,8 +4782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HA ZVAL_BOOL(result, Z_LVAL_P(result) < 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4891,8 +4832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4907,8 +4847,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HAN compare_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4923,8 +4862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER bitwise_or_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4939,8 +4877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLE bitwise_and_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4955,8 +4892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLE bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -4971,8 +4907,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HAND boolean_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) @@ -5025,8 +4960,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -5122,8 +5056,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5173,8 +5106,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CONST_H zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5188,8 +5120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_ zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5215,7 +5146,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -5231,8 +5162,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5304,8 +5234,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5377,8 +5306,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5414,11 +5342,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -5465,8 +5392,7 @@ try_fetch_list: } ZVAL_NULL(EX_VAR(opline->result.var)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5533,8 +5459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5653,8 +5578,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5786,8 +5710,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5842,8 +5765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5909,8 +5831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER( compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5936,8 +5857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONS /* non-qualified constant - allow text substitution */ zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); @@ -6118,8 +6038,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6179,8 +6098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HAN } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = EX_CONSTANT(opline->op1); @@ -6231,8 +6149,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HAN zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6292,8 +6209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_C } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -6335,8 +6251,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -6474,8 +6389,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6521,8 +6435,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6558,8 +6471,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6715,8 +6627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(Z pow_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -6735,7 +6646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HA ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -6756,7 +6667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TM ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -6918,7 +6829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HA ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -6939,7 +6850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VA ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -6994,8 +6905,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -7091,8 +7001,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7157,8 +7066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDL } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = EX_CONSTANT(opline->op1); @@ -7209,8 +7117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDL zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7270,8 +7177,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_V } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -7313,8 +7219,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -7509,8 +7414,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -7606,8 +7510,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7669,7 +7572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -7685,8 +7588,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7818,8 +7720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7867,8 +7768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_ } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -7967,8 +7867,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8028,8 +7927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = EX_CONSTANT(opline->op1); @@ -8080,8 +7978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8141,8 +8038,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -8184,8 +8080,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -8208,8 +8103,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_C EG(scope), EX(called_scope), Z_OBJ(EX(This)) ? &EX(This) : NULL); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8393,8 +8287,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND add_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8437,8 +8330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND sub_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8484,8 +8376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND mul_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8500,8 +8391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND fast_div_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8539,8 +8429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND mod_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8555,8 +8444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_ shift_left_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8571,8 +8459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_ shift_right_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8632,8 +8519,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8652,7 +8538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HAN ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -8673,7 +8559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV ZEND_VM_SMART_BRANCH(result, (IS_CONST|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CONST|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -8743,8 +8629,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8812,8 +8697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HAN ZVAL_BOOL(result, Z_LVAL_P(result) != 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8863,8 +8747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDL ZVAL_BOOL(result, Z_LVAL_P(result) < 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8914,8 +8797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8930,8 +8812,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLE compare_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8946,8 +8827,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZE bitwise_or_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8962,8 +8842,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(Z bitwise_and_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8978,8 +8857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(Z bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8994,8 +8872,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER boolean_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9009,8 +8886,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HAND zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9024,8 +8900,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HAN zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9051,7 +8926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -9067,8 +8942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9140,8 +9014,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9213,8 +9086,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9250,11 +9122,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -9324,8 +9195,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9444,8 +9314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9577,8 +9446,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9633,8 +9501,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9751,8 +9618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEN compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -9851,8 +9717,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10020,8 +9885,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10067,8 +9931,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10224,8 +10087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND pow_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10268,8 +10130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER( add_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10312,8 +10173,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER( sub_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10359,8 +10219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER( mul_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10375,8 +10234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER( fast_div_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10414,8 +10272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER( mod_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10430,8 +10287,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(Z shift_left_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10446,8 +10302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(Z shift_right_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10507,8 +10362,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDL } while (0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10576,8 +10430,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10645,8 +10498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR ZVAL_BOOL(result, Z_LVAL_P(result) != 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10696,8 +10548,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_H ZVAL_BOOL(result, Z_LVAL_P(result) < 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10747,8 +10598,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10763,8 +10613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HA compare_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10779,8 +10628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLE bitwise_or_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10795,8 +10643,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDL bitwise_and_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10811,8 +10658,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDL bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10827,8 +10673,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HAN boolean_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10842,8 +10687,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_ zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10857,8 +10701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10884,7 +10727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } zval_ptr_dtor_nogc(free_op2); @@ -10900,8 +10743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ zval_ptr_dtor_nogc(free_op2); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10974,8 +10816,7 @@ fetch_obj_r_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11048,8 +10889,7 @@ fetch_obj_is_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11085,11 +10925,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -11159,8 +10998,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_ } while (0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11280,8 +11118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11413,8 +11250,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11470,8 +11306,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV EX(call) = call; zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11537,8 +11372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11637,8 +11471,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11806,8 +11639,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11854,8 +11686,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -11870,8 +11701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMPVAR_HANDLER( pow_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12172,8 +12002,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (opline->extended_value == IS_ARRAY) { @@ -12216,8 +12045,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12238,8 +12066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE } Z_FE_POS_P(result) = 0; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { HashPosition pos = 0; @@ -12271,8 +12098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0); @@ -12313,8 +12139,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -12381,8 +12206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { @@ -12416,8 +12240,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); @@ -12474,8 +12297,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -12535,8 +12357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_ } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12574,8 +12395,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12587,8 +12407,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEN value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { SAVE_OPLINE(); - value = GET_OP1_UNDEF_CV(value, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); + ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) { @@ -12732,8 +12553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZE zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12752,7 +12572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HA ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -12773,7 +12593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -12801,7 +12621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -12817,8 +12637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12890,8 +12709,7 @@ fetch_obj_r_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -12927,11 +12745,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -12964,7 +12781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CONST_HANDLE } rope[opline->extended_value] = _zval_get_string_func(var); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -13119,8 +12936,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -13311,7 +13127,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HAND ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -13332,7 +13148,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_ ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -13494,7 +13310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HAND ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -13515,7 +13331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_ ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -13684,7 +13500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UN } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -13700,8 +13516,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UN zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -13749,8 +13564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -13849,8 +13663,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14041,7 +13854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDL ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -14062,7 +13875,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_H ZEND_VM_SMART_BRANCH(result, (IS_TMP_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_TMP_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -14090,7 +13903,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -14106,8 +13919,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14179,8 +13991,7 @@ fetch_obj_r_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14216,11 +14027,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -14253,7 +14063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CV_HANDLER(Z } rope[opline->extended_value] = _zval_get_string_func(var); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -14408,8 +14218,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14607,7 +14416,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } zval_ptr_dtor_nogc(free_op2); @@ -14623,8 +14432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14697,8 +14505,7 @@ fetch_obj_r_no_object: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14734,11 +14541,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -14771,7 +14577,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDL } rope[opline->extended_value] = _zval_get_string_func(var); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -14926,8 +14732,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15004,8 +14809,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_ } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15051,8 +14855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_ } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15091,8 +14894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15131,8 +14933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15341,13 +15142,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_VAR == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (IS_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -15381,26 +15185,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL } varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { - SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); - } + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || (Z_VAR_FLAGS_P(varptr) & IS_VAR_RET_REF)) && (Z_ISREF_P(varptr) || Z_TYPE_P(varptr) == IS_OBJECT)) { ZVAL_MAKE_REF(varptr); - if (IS_VAR == IS_CV) { - Z_ADDREF_P(varptr); - } } else { if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? !(opline->extended_value & ZEND_ARG_SEND_SILENT) : !ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { SAVE_OPLINE(); zend_error(E_NOTICE, "Only variables should be passed by reference"); - CHECK_EXCEPTION(); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_COPY_VALUE(arg, varptr); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -15464,13 +15263,16 @@ send_var_by_ref: varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_VAR == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (IS_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -15524,8 +15326,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN Z_OBJ(EX(call)->This) = NULL; zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZVAL_NEW_REF(arg, arg); @@ -15544,8 +15345,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN ZVAL_COPY_VALUE(param, arg); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15562,8 +15362,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce); } @@ -15598,8 +15397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO ZVAL_COPY(EX_VAR(opline->result.var), &object_zval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -15659,8 +15457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (opline->extended_value == IS_ARRAY) { @@ -15703,8 +15500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -15726,8 +15522,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE Z_FE_POS_P(result) = 0; zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { HashPosition pos = 0; @@ -15760,8 +15555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0); @@ -15802,8 +15596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -15871,8 +15664,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { @@ -15907,8 +15699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); @@ -15965,8 +15756,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -16392,8 +16182,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_ } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -16431,8 +16220,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -16444,8 +16232,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEN value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { SAVE_OPLINE(); - value = GET_OP1_UNDEF_CV(value, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); + ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) { @@ -16591,8 +16380,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZE zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -16611,7 +16399,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HA ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -16632,7 +16420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -16699,9 +16487,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -16771,9 +16557,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -16809,8 +16593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17100,8 +16883,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17177,8 +16959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17207,11 +16988,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HAN zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17230,11 +17010,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HA zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17260,7 +17039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CO } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; @@ -17276,8 +17055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CO zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17297,11 +17075,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17373,8 +17150,7 @@ fetch_obj_r_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17402,11 +17178,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17433,11 +17208,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17473,11 +17247,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -17508,11 +17281,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17542,9 +17314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HAND if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17650,9 +17420,7 @@ assign_dim_clean: } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17680,8 +17448,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER( /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17813,8 +17580,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -17840,8 +17606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_ /* non-qualified constant - allow text substitution */ zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); @@ -18022,8 +17787,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18152,8 +17916,7 @@ num_index_dim: } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18196,8 +17959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18363,7 +18125,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HAND ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -18384,7 +18146,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_ ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -18414,8 +18176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZE /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18576,7 +18337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HAND ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -18597,7 +18358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_ ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -18627,8 +18388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZE /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18647,11 +18407,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE HANDLE_EXCEPTION(); } if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } + if (IS_VAR == IS_VAR && (value_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - if (!(free_op2 != NULL)) { - PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */ + if (!(free_op2 != NULL) && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op2.var)) != IS_INDIRECT)) { /* undo the effect of get_zval_ptr_ptr() */ + Z_TRY_ADDREF_P(value_ptr); } zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -18667,14 +18434,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(variable_ptr))) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; - if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -18689,8 +18448,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18902,9 +18660,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19143,11 +18899,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HA zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19166,11 +18921,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_H zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19196,7 +18950,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UN } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; @@ -19212,8 +18966,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UN zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19319,9 +19072,7 @@ assign_dim_clean: } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19453,8 +19204,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19502,8 +19252,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19602,8 +19351,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -19812,7 +19560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDL ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -19833,7 +19581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_H ZEND_VM_SMART_BRANCH(result, (IS_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_VAR|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -19900,9 +19648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -19972,9 +19718,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -20010,8 +19754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20301,8 +20044,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20378,8 +20120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20408,11 +20149,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLE zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20431,11 +20171,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDL zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20461,7 +20200,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; @@ -20477,8 +20216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20498,11 +20236,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HA zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20574,8 +20311,7 @@ fetch_obj_r_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20603,11 +20339,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20634,11 +20369,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20674,11 +20408,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -20709,11 +20442,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20743,9 +20475,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20851,9 +20581,7 @@ assign_dim_clean: } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20881,8 +20609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEN /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20900,12 +20627,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); HANDLE_EXCEPTION(); } + if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && (value_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - if (!0) { - PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */ + if (!0 && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op2.var)) != IS_INDIRECT)) { /* undo the effect of get_zval_ptr_ptr() */ + Z_TRY_ADDREF_P(value_ptr); } zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -20921,14 +20655,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(variable_ptr))) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -20942,8 +20668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21075,8 +20800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21175,8 +20899,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21305,8 +21028,7 @@ num_index_dim: } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21349,8 +21071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( } while (0); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21562,9 +21283,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -21635,9 +21354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -21674,8 +21391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -21966,8 +21682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22044,8 +21759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22074,11 +21788,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HA zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22097,11 +21810,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_H zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22127,7 +21839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TM } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; @@ -22143,8 +21855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TM zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22164,11 +21875,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVA zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22241,8 +21951,7 @@ fetch_obj_r_no_object: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22270,11 +21979,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22301,11 +22009,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22341,11 +22048,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -22376,11 +22082,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22410,9 +22115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_HAN zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22518,9 +22221,7 @@ assign_dim_clean: } if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22652,8 +22353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V call->prev_execute_data = EX(call); EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22752,8 +22452,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22883,8 +22582,7 @@ num_index_dim: zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -22928,8 +22626,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND zval_ptr_dtor_nogc(free_op2); if (free_op1) {zval_ptr_dtor_nogc(free_op1);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23015,13 +22712,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND } } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if 0 || (IS_UNUSED != IS_UNUSED) USE_OPLINE SAVE_OPLINE(); @@ -23045,7 +22740,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_ } while (0); } -#endif zend_bailout(); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -23112,9 +22806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -23184,9 +22876,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23476,8 +23166,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23553,8 +23242,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23636,8 +23324,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23665,11 +23352,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23696,11 +23382,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23772,8 +23457,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23809,11 +23493,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -23844,11 +23527,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23878,9 +23560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_H /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -23910,7 +23590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HA } rope[0] = _zval_get_string_func(var); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -24032,8 +23712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -24059,8 +23738,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CON /* non-qualified constant - allow text substitution */ zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var))); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); @@ -24271,8 +23949,7 @@ num_index_dim: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -24315,8 +23992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -24453,8 +24129,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -24500,8 +24175,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -24994,9 +24668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25264,8 +24936,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25502,9 +25173,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -25574,9 +25243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25866,8 +25533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25943,8 +25609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26026,8 +25691,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26055,11 +25719,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26086,11 +25749,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26162,8 +25824,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26199,11 +25860,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -26234,11 +25894,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26268,9 +25927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HAND /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26300,7 +25957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL } rope[0] = _zval_get_string_func(var); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -26422,8 +26079,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26552,8 +26208,7 @@ num_index_dim: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26596,8 +26251,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26734,8 +26388,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26781,8 +26434,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -26988,9 +26640,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -27061,9 +26711,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27354,8 +27002,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27432,8 +27079,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27516,8 +27162,7 @@ fetch_obj_r_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27545,11 +27190,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27576,11 +27220,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27653,8 +27296,7 @@ fetch_obj_is_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27690,11 +27332,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -27725,11 +27366,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27759,9 +27399,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -27791,7 +27429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_H } rope[0] = _zval_get_string_func(var); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } ZEND_VM_NEXT_OPCODE(); @@ -27914,8 +27552,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28045,8 +27682,7 @@ num_index_dim: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28090,8 +27726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28228,8 +27863,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28276,8 +27910,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28289,8 +27922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OP bitwise_not_function(EX_VAR(opline->result.var), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28303,17 +27935,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_ if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_FALSE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_TRUE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_TRUE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -28360,8 +27992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_O ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28406,8 +28037,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_O ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28445,8 +28075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28484,8 +28113,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28514,8 +28142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCO zend_string_release(str); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28530,11 +28157,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCO ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CV == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - } + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); @@ -28567,16 +28192,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPC ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CV == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -28688,16 +28309,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_ ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - if (IS_CV == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -28922,13 +28539,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_ varptr = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_CV == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (IS_CV == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -28949,48 +28569,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_ ZEND_VM_NEXT_OPCODE(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *varptr, *arg; - - if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) { - if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { - ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - } - - varptr = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { - SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); - } - if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || - (Z_VAR_FLAGS_P(varptr) & IS_VAR_RET_REF)) && - (Z_ISREF_P(varptr) || Z_TYPE_P(varptr) == IS_OBJECT)) { - - ZVAL_MAKE_REF(varptr); - if (IS_CV == IS_CV) { - Z_ADDREF_P(varptr); - } - } else { - if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? - !(opline->extended_value & ZEND_ARG_SEND_SILENT) : - !ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { - SAVE_OPLINE(); - zend_error(E_NOTICE, "Only variables should be passed by reference"); - CHECK_EXCEPTION(); - } - } - - arg = ZEND_CALL_VAR(EX(call), opline->result.var); - ZVAL_COPY_VALUE(arg, varptr); - - ZEND_VM_NEXT_OPCODE(); -} - static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -29044,13 +28622,16 @@ send_var_by_ref: varptr = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) { SAVE_OPLINE(); - varptr = GET_OP1_UNDEF_CV(varptr, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(varptr, BP_VAR_R); + arg = ZEND_CALL_VAR(EX(call), opline->result.var); + ZVAL_NULL(arg); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } + arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_CV == IS_CV) { - ZVAL_DEREF(varptr); + ZVAL_OPT_DEREF(varptr); ZVAL_COPY(arg, varptr); } else /* if (IS_CV == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(varptr))) { @@ -29103,8 +28684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND EX(call)->called_scope = NULL; Z_OBJ(EX(call)->This) = NULL; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZVAL_NEW_REF(arg, arg); @@ -29122,8 +28702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND } ZVAL_COPY_VALUE(param, arg); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -29136,17 +28715,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_FALSE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val)); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -29229,8 +28808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC } } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -29288,8 +28866,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if (opline->extended_value == IS_ARRAY) { @@ -29331,8 +28908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO } } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -29482,8 +29058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN } Z_FE_POS_P(result) = 0; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { HashPosition pos = 0; @@ -29515,8 +29090,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0); @@ -29556,8 +29130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -29624,8 +29197,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CV == IS_VAR || IS_CV == IS_CV) { @@ -29659,8 +29231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); @@ -29717,8 +29288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE if (is_empty) { ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } } else { @@ -29736,7 +29306,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if 0 || (IS_CV != IS_UNUSED) USE_OPLINE SAVE_OPLINE(); @@ -29760,7 +29329,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCO } while (0); } -#endif zend_bailout(); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -29798,8 +29366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -29836,8 +29403,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_ ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -29849,8 +29415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND value = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { SAVE_OPLINE(); - value = GET_OP1_UNDEF_CV(value, BP_VAR_R); - CHECK_EXCEPTION(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); + ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) { @@ -30000,8 +29567,7 @@ try_strlen: } while (0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30037,8 +29603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEN ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30081,8 +29646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND add_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30125,8 +29689,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND sub_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30172,8 +29735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND mul_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30188,8 +29750,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND fast_div_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30227,8 +29788,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND mod_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30243,8 +29803,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_ shift_left_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30259,8 +29818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_ shift_right_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30320,8 +29878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(Z } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30340,7 +29897,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HAN ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -30361,7 +29918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_CONST) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_CONST) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -30431,8 +29988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30500,8 +30056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN ZVAL_BOOL(result, Z_LVAL_P(result) != 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30551,8 +30106,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDL ZVAL_BOOL(result, Z_LVAL_P(result) < 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30602,8 +30156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CO ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30618,8 +30171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CONST_HANDLE compare_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30634,8 +30186,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZE bitwise_or_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30650,8 +30201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(Z bitwise_and_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30666,8 +30216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(Z bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30682,8 +30231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER boolean_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -30748,9 +30296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -30820,9 +30366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -30858,8 +30402,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31149,8 +30692,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31226,8 +30768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31290,8 +30831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -31387,8 +30927,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31438,8 +30977,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HAND zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31458,11 +30996,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HAND zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31481,11 +31018,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HAN zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31499,8 +31035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HAN zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31526,7 +31061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CON } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -31542,8 +31077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CON } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31563,11 +31097,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_ zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31639,8 +31172,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31668,11 +31200,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31699,11 +31230,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31775,8 +31305,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31812,11 +31341,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -31847,11 +31375,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31895,8 +31422,7 @@ try_fetch_list: } ZVAL_NULL(EX_VAR(opline->result.var)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31926,9 +31452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDL /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32034,9 +31558,7 @@ assign_dim_clean: } /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32064,8 +31586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(Z /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32132,8 +31653,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32252,8 +31772,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32319,8 +31838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEN compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32419,8 +31937,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32480,8 +31997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLE } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); @@ -32532,8 +32048,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLE zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32631,8 +32146,7 @@ num_index_dim: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32675,8 +32189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32736,8 +32249,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONS } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -32779,8 +32291,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -32918,8 +32429,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32965,8 +32475,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -32991,8 +32500,7 @@ try_instanceof: if (UNEXPECTED(ce == NULL)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -33012,8 +32520,7 @@ try_instanceof: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33169,8 +32676,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CONST_HANDLER(ZEND pow_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33275,7 +32781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDL ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -33296,7 +32802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_H ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_TMP_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -33326,8 +32832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_HANDLER(ZEN /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33487,7 +32992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDL ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -33508,7 +33013,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_VAR) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_VAR) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -33563,8 +33068,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -33660,8 +33164,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33725,8 +33228,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEN /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33744,12 +33246,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER HANDLE_EXCEPTION(); } + if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && (value_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - if (!(free_op2 != NULL)) { - PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */ + if (!(free_op2 != NULL) && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op2.var)) != IS_INDIRECT)) { /* undo the effect of get_zval_ptr_ptr() */ + Z_TRY_ADDREF_P(value_ptr); } zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -33765,14 +33274,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(variable_ptr))) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; - - HANDLE_EXCEPTION(); - } if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -33786,8 +33287,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER if (free_op2) {zval_ptr_dtor_nogc(free_op2);}; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33816,8 +33316,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER( } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); @@ -33868,8 +33367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER( zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -33929,8 +33427,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_ } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -33972,8 +33469,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -33999,8 +33495,7 @@ try_instanceof: if (UNEXPECTED(ce == NULL)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -34020,8 +33515,7 @@ try_instanceof: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34232,9 +33726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34507,8 +33999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -34604,8 +34095,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34660,11 +34150,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HAN zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34683,11 +34172,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HA zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34713,7 +34201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -34729,8 +34217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34836,9 +34323,7 @@ assign_dim_clean: } /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34886,8 +34371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU } #endif } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34986,8 +34470,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35047,8 +34530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); @@ -35099,8 +34581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL zend_string_release(Z_STR(tmp)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35160,8 +34641,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -35203,8 +34683,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -35389,8 +34868,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OP add_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35433,8 +34911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OP sub_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35480,8 +34957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OP mul_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35496,8 +34972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OP fast_div_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35535,8 +35010,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP mod_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35551,8 +35025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPC shift_left_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35567,8 +35040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPC shift_right_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35628,8 +35100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35648,7 +35119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLE ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -35669,7 +35140,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HA ZEND_VM_SMART_BRANCH(result, (IS_CV|IS_CV) & (IS_VAR|IS_TMP_VAR)); ZVAL_BOOL(EX_VAR(opline->result.var), result); if ((IS_CV|IS_CV) & (IS_VAR|IS_TMP_VAR)) { - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -35739,8 +35210,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35808,8 +35278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE ZVAL_BOOL(result, Z_LVAL_P(result) != 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35859,8 +35328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER( ZVAL_BOOL(result, Z_LVAL_P(result) < 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35910,8 +35378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35926,8 +35393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(Z compare_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35942,8 +35408,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_ bitwise_or_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35958,8 +35423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND bitwise_and_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35974,8 +35438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -35990,8 +35453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZE boolean_xor_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -36056,9 +35518,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -36128,9 +35588,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -36166,8 +35624,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36457,8 +35914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36534,8 +35990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36559,8 +36014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36579,11 +36033,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36602,11 +36055,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLE zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36620,8 +36072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLE zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36647,7 +36098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_ } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } @@ -36663,8 +36114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36684,11 +36134,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HAN zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36760,8 +36209,7 @@ fetch_obj_r_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36789,11 +36237,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36820,11 +36267,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36896,8 +36342,7 @@ fetch_obj_is_no_object: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36933,11 +36378,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -36968,11 +36412,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37002,9 +36445,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER( /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37110,9 +36551,7 @@ assign_dim_clean: } /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37140,8 +36579,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND /* zend_assign_to_variable() always takes care of op2, never free it! */ } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37160,11 +36598,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + HANDLE_EXCEPTION(); + } + if (IS_CV == IS_VAR && (value_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - if (!0) { - PZVAL_LOCK(value_ptr); /* undo the effect of get_zval_ptr_ptr() */ + if (!0 && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op2.var)) != IS_INDIRECT)) { /* undo the effect of get_zval_ptr_ptr() */ + Z_TRY_ADDREF_P(value_ptr); } zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -37180,14 +36625,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(variable_ptr))) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - - HANDLE_EXCEPTION(); - } if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -37200,8 +36637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37268,8 +36704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37388,8 +36823,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA EX(call) = call; - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37455,8 +36889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_O compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37555,8 +36988,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37685,8 +37117,7 @@ num_index_dim: } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37729,8 +37160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37867,8 +37297,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -37914,8 +37343,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38071,8 +37499,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OP pow_function(EX_VAR(opline->result.var), op1, op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38120,8 +37547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEN add_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38164,8 +37590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEN sub_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38211,8 +37636,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEN mul_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38227,8 +37651,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEN fast_div_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38266,8 +37689,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEN mod_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38282,8 +37704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND shift_left_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38298,8 +37719,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND shift_right_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38359,8 +37779,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER( } while (0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38428,8 +37847,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38497,8 +37915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HA ZVAL_BOOL(result, Z_LVAL_P(result) != 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38548,8 +37965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HAND ZVAL_BOOL(result, Z_LVAL_P(result) < 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38599,8 +38015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TM ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38615,8 +38030,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDL compare_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38631,8 +38045,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(Z bitwise_or_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38647,8 +38060,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER( bitwise_and_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38663,8 +38075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER( bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -38679,8 +38090,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLE boolean_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -38745,9 +38155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -38818,9 +38226,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) @@ -38857,8 +38263,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39149,8 +38554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39227,8 +38631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39252,8 +38655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HAN zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39272,11 +38674,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HAN zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39295,11 +38696,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HA zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39313,8 +38713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HA zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39340,7 +38739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } zval_ptr_dtor_nogc(free_op2); @@ -39356,8 +38755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP zval_ptr_dtor_nogc(free_op2); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39377,11 +38775,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39454,8 +38851,7 @@ fetch_obj_r_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39483,11 +38879,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39514,11 +38909,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39591,8 +38985,7 @@ fetch_obj_is_no_object: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39628,11 +39021,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -39663,11 +39055,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { - EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); + EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 0); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39697,9 +39088,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_HAND zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39805,9 +39194,7 @@ assign_dim_clean: } /* assign_dim has two opcodes! */ - CHECK_EXCEPTION(); - ZEND_VM_INC_OPCODE(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39874,8 +39261,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HAN } while (0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -39995,8 +39381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40062,8 +39447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZE compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40162,8 +39546,7 @@ num_index: } else { zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40293,8 +39676,7 @@ num_index_dim: zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40338,8 +39720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40476,8 +39857,7 @@ isset_dim_obj_exit: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40524,8 +39904,7 @@ isset_no_object: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40540,8 +39919,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEN pow_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40558,8 +39936,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEN bitwise_not_function(EX_VAR(opline->result.var), _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1)); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40572,17 +39949,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_FALSE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_TRUE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_TRUE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val)); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -40614,8 +39991,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_ } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40630,11 +40006,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_ ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } else { ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); @@ -40667,16 +40041,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2)); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -40788,16 +40158,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(Z ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); - if ((IS_TMP_VAR|IS_VAR) == IS_CV) { - if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); - } - ZEND_VM_NEXT_OPCODE(); + if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(val, BP_VAR_R); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { - ZEND_VM_SET_NEXT_OPCODE(opline + 1); - ZEND_VM_CONTINUE(); + ZEND_VM_NEXT_OPCODE(); } } @@ -40819,12 +40185,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(Z static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + zval *var; USE_OPLINE SAVE_OPLINE(); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + var = EX_VAR(opline->op1.var); + zval_ptr_dtor_nogc(var); + ZVAL_NULL(var); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40836,10 +40204,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZE var = EX_VAR(opline->op1.var); if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) { zend_hash_iterator_del(Z_FE_ITER_P(var)); + Z_FE_ITER_P(var) = (uint32_t)-1; } zval_ptr_dtor_nogc(var); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZVAL_NULL(var); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -40852,17 +40221,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_ if (Z_TYPE_INFO_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { SAVE_OPLINE(); GET_OP1_UNDEF_CV(val, BP_VAR_R); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - ZVAL_FALSE(EX_VAR(opline->result.var)); } else { SAVE_OPLINE(); ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val)); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); } @@ -40945,8 +40314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND } } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41080,7 +40448,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if 0 || ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) USE_OPLINE SAVE_OPLINE(); @@ -41104,7 +40471,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_ } while (0); zval_ptr_dtor_nogc(free_op1); } -#endif zend_bailout(); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -41149,8 +40515,7 @@ try_strlen: } while (0); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41193,8 +40558,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER( add_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41237,8 +40601,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER( sub_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41284,8 +40647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER( mul_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41300,8 +40662,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER( fast_div_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41339,8 +40700,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER( mod_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41355,8 +40715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(Z shift_left_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41371,8 +40730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(Z shift_right_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41432,8 +40790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDL zval_ptr_dtor_nogc(free_op1); } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41501,8 +40858,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41570,8 +40926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST ZVAL_BOOL(result, Z_LVAL_P(result) != 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41621,8 +40976,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_H ZVAL_BOOL(result, Z_LVAL_P(result) < 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41672,8 +41026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41688,8 +41041,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HA compare_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41704,8 +41056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLE bitwise_or_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41720,8 +41071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDL bitwise_and_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41736,8 +41086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDL bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41752,8 +41101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HAN boolean_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) @@ -41806,8 +41154,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -41904,8 +41251,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41955,8 +41301,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_ zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -41970,8 +41315,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42043,8 +41387,7 @@ fetch_obj_is_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42088,8 +41431,7 @@ try_fetch_list: } ZVAL_NULL(EX_VAR(opline->result.var)); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42156,8 +41498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_ } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42277,8 +41618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42344,8 +41684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42374,8 +41713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_CONST_HA } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -42426,8 +41764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_CONST_HA zend_string_release(Z_STR(tmp)); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42487,8 +41824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_ } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -42531,8 +41867,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -42670,8 +42005,7 @@ isset_dim_obj_exit: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42717,8 +42051,7 @@ isset_no_object: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42743,8 +42076,7 @@ try_instanceof: if (UNEXPECTED(ce == NULL)) { ZVAL_FALSE(EX_VAR(opline->result.var)); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -42764,8 +42096,7 @@ try_instanceof: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42780,8 +42111,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CONST_HANDLER( pow_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) @@ -42834,8 +42164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -42932,8 +42261,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42998,8 +42326,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_VAR_HAND } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -43050,8 +42377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_VAR_HAND zend_string_release(Z_STR(tmp)); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43111,8 +42437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_ } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -43155,8 +42480,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -43182,8 +42506,7 @@ try_instanceof: if (UNEXPECTED(ce == NULL)) { ZVAL_FALSE(EX_VAR(opline->result.var)); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -43203,8 +42526,7 @@ try_instanceof: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) @@ -43257,8 +42579,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_ zend_string_release(name); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -43355,8 +42676,7 @@ fetch_var_return: } else { ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43421,8 +42741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H } else { ZVAL_UNDEF(var); } - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -43473,8 +42792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H zend_string_release(Z_STR(tmp)); } zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43534,8 +42852,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_ } else { ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); if (UNEXPECTED(ce == NULL)) { - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); } @@ -43578,8 +42895,7 @@ is_var_return: ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } } @@ -43623,8 +42939,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEN add_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43667,8 +42982,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEN sub_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43714,8 +43028,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEN mul_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43730,8 +43043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEN fast_div_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43769,8 +43081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEN mod_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43785,8 +43096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND shift_left_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43801,8 +43111,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND shift_right_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43862,8 +43171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER( zval_ptr_dtor_nogc(free_op1); } while (0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -43931,8 +43239,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLE ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44000,8 +43307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HA ZVAL_BOOL(result, Z_LVAL_P(result) != 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44051,8 +43357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HAND ZVAL_BOOL(result, Z_LVAL_P(result) < 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44102,8 +43407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44118,8 +43422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDL compare_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44134,8 +43437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER(Z bitwise_or_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44150,8 +43452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER( bitwise_and_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44166,8 +43467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER( bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44182,8 +43482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLE boolean_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44197,8 +43496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HAN zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44212,8 +43510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HA zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44285,8 +43582,7 @@ fetch_obj_is_no_object: } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44353,8 +43649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HAN } while (0); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44474,8 +43769,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44541,8 +43835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44679,8 +43972,7 @@ isset_dim_obj_exit: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44726,8 +44018,7 @@ isset_no_object: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44742,8 +44033,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEN pow_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44786,8 +44076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER add_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44830,8 +44119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER sub_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44877,8 +44165,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER mul_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44893,8 +44180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER fast_div_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44932,8 +44218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER mod_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44948,8 +44233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER( shift_left_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44964,8 +44248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER( shift_right_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45025,8 +44308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HAND zval_ptr_dtor_nogc(free_op1); } while (0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45094,8 +44376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45163,8 +44444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVA ZVAL_BOOL(result, Z_LVAL_P(result) != 0); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45214,8 +44494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_ ZVAL_BOOL(result, Z_LVAL_P(result) < 0); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45265,8 +44544,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA ZVAL_BOOL(result, Z_LVAL_P(result) <= 0); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45281,8 +44559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_H compare_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45297,8 +44574,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDL bitwise_or_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45313,8 +44589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HAND bitwise_and_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45329,8 +44604,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HAND bitwise_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45345,8 +44619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HA boolean_xor_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45360,8 +44633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45375,8 +44647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVA zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45449,8 +44720,7 @@ fetch_obj_is_no_object: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45517,8 +44787,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR } while (0); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45639,8 +44908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45706,8 +44974,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE compare_function(result, op1, op2); ZVAL_BOOL(result, Z_LVAL_P(result) == 0); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45844,8 +45111,7 @@ isset_dim_obj_exit: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45892,8 +45158,7 @@ isset_no_object: zval_ptr_dtor_nogc(free_op1); ZEND_VM_SMART_BRANCH(result, 1); ZVAL_BOOL(EX_VAR(opline->result.var), result); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -45908,12 +45173,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER pow_function(EX_VAR(opline->result.var), op1, op2); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { + USE_OPLINE + zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type); ZEND_VM_NEXT_OPCODE(); /* Never reached */ } @@ -48592,11 +47858,11 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER, - ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER, - ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER, - ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER, - ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -50296,7 +49562,7 @@ ZEND_API int zend_vm_call_opcode_handler(zend_execute_data* ex) LOAD_OPLINE(); #if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG) ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - ret = (opline) ? 0 : -1; + ret = opline? ((execute_data != ex)? (int)(execute_data->prev_execute_data != ex) + 1 : 0) : -1; #else ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index ff181ce1e7..ed194486a4 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -921,6 +921,8 @@ function gen_null_handler($f) { $done = 1; out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n"); out($f,"{\n"); + out($f,"\tUSE_OPLINE\n"); + out($f,"\n"); out($f,"\tzend_error_noreturn(E_ERROR, \"Invalid opcode %d/%d/%d.\", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);\n"); out($f,"\tZEND_VM_NEXT_OPCODE(); /* Never reached */\n"); out($f,"}\n\n"); @@ -1030,11 +1032,11 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) case ZEND_VM_KIND_CALL: out($f,"\n"); out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n"); - out($f,"register zend_execute_data *execute_data __asm__(ZEND_VM_FP_GLOBAL_REG);\n"); + out($f,"register zend_execute_data* volatile execute_data __asm__(ZEND_VM_FP_GLOBAL_REG);\n"); out($f,"#endif\n"); out($f,"\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); - out($f,"register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n"); + out($f,"register const zend_op* volatile opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n"); out($f,"#endif\n"); out($f,"\n"); out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n"); @@ -1067,23 +1069,24 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_OPLINE_EX\n"); out($f,"#undef SAVE_OPLINE\n"); out($f,"#define DCL_OPLINE\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); out($f,"# define OPLINE opline\n"); out($f,"# define USE_OPLINE\n"); out($f,"# define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"# define SAVE_OPLINE() EX(opline) = opline\n"); out($f,"#else\n"); out($f,"# define OPLINE EX(opline)\n"); out($f,"# define USE_OPLINE const zend_op *opline = EX(opline);\n"); out($f,"# define LOAD_OPLINE()\n"); + out($f,"# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n"); out($f,"# define SAVE_OPLINE()\n"); out($f,"#endif\n"); - out($f,"#undef CHECK_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); - out($f,"#define CHECK_EXCEPTION() LOAD_OPLINE()\n"); out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n"); out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n"); @@ -1105,16 +1108,16 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_NEXT_OPLINE\n"); out($f,"#undef SAVE_OPLINE\n"); out($f,"#define OPLINE opline\n"); out($f,"#define DCL_OPLINE const zend_op *opline;\n"); out($f,"#define USE_OPLINE\n"); out($f,"#define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"#define SAVE_OPLINE() EX(opline) = opline\n"); - out($f,"#undef CHECK_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); - out($f,"#define CHECK_EXCEPTION() LOAD_OPLINE()\n"); out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n"); out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n"); @@ -1130,21 +1133,20 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_NEXT_OPLINE()\n"); out($f,"#undef SAVE_OPLINE\n"); out($f,"#define OPLINE opline\n"); out($f,"#define DCL_OPLINE const zend_op *opline;\n"); out($f,"#define USE_OPLINE\n"); out($f,"#define LOAD_OPLINE() opline = EX(opline)\n"); + out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n"); out($f,"#define SAVE_OPLINE() EX(opline) = opline\n"); - out($f,"#undef CHECK_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); if (ZEND_VM_SPEC) { - out($f,"#define CHECK_EXCEPTION() if (UNEXPECTED(EG(exception) != NULL)) goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n"); out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n"); } else { - out($f,"#define CHECK_EXCEPTION() if (UNEXPECTED(EG(exception) != NULL)) goto ZEND_HANDLE_EXCEPTION_HANDLER\n"); out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_HANDLER\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_HANDLER\n"); } @@ -1187,7 +1189,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) // Emit array of labels of opcode handlers and code for // zend_opcode_handlers initialization $prolog = $m[1]; - out($f,$prolog."if (execute_data == NULL) {\n"); + out($f,$prolog."if (UNEXPECTED(execute_data == NULL)) {\n"); out($f,$prolog."\tstatic const void* labels[] = {\n"); gen_labels($f, $spec, $kind, $prolog."\t\t"); out($f,$prolog."\t};\n"); @@ -1604,7 +1606,7 @@ function gen_vm($def, $skel) { out($f, "\tLOAD_OPLINE();\n"); out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n"); out($f, "\t((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); - out($f, "\tret = (opline) ? 0 : -1;\n"); + out($f, "\tret = opline? ((execute_data != ex)? (int)(execute_data->prev_execute_data != ex) + 1 : 0) : -1;\n"); out($f, "#else\n"); out($f, "\tret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); out($f, "#endif\n"); @@ -1632,16 +1634,16 @@ function gen_vm($def, $skel) { out($f,"#undef DCL_OPLINE\n"); out($f,"#undef USE_OPLINE\n"); out($f,"#undef LOAD_OPLINE\n"); + out($f,"#undef LOAD_NEXT_OPLINE()\n"); out($f,"#undef SAVE_OPLINE\n"); out($f,"#define OPLINE EX(opline)\n"); out($f,"#define DCL_OPLINE\n"); out($f,"#define USE_OPLINE const zend_op *opline = EX(opline);\n"); out($f,"#define LOAD_OPLINE()\n"); + out($f,"#define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n"); out($f,"#define SAVE_OPLINE()\n"); - out($f,"#undef CHECK_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION\n"); out($f,"#undef HANDLE_EXCEPTION_LEAVE\n"); - out($f,"#define CHECK_EXCEPTION() LOAD_OPLINE()\n"); out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n"); out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n"); out($f,"#undef ZEND_VM_CONTINUE\n"); diff --git a/configure.in b/configure.in index 9b234e776e..04d1a782c8 100644 --- a/configure.in +++ b/configure.in @@ -1420,9 +1420,7 @@ AC_PROVIDE_IFELSE([PHP_REQUIRE_CXX], [], [ ]) AC_PROG_LIBTOOL -if test "$enable_debug" != "yes"; then - PHP_SET_LIBTOOL_VARIABLE([--silent]) -fi +PHP_SET_LIBTOOL_VARIABLE([--silent]) dnl libtool 1.4.3 needs this. PHP_SET_LIBTOOL_VARIABLE([--preserve-dup-deps]) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 676c6adb81..3ac13074a8 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2904,7 +2904,11 @@ PHP_FUNCTION(curl_getinfo) if (ZEND_NUM_ARGS() < 2) { char *s_code; - zend_long l_code; + /* libcurl expects long datatype. So far no cases are known where + it would be an issue. Using zend_long would truncate a 64-bit + var on Win64, so the exact long datatype fits everywhere, as + long as there's no 32-bit int overflow. */ + long l_code; double d_code; #if LIBCURL_VERSION_NUM > 0x071301 struct curl_certinfo *ci = NULL; diff --git a/ext/date/tests/bug66985.phpt b/ext/date/tests/bug66985.phpt index 0045ca29d6..37dcd3e80d 100644 --- a/ext/date/tests/bug66985.phpt +++ b/ext/date/tests/bug66985.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #66986 (Some timezones are no longer valid in PHP 5.5.10) +Bug #66985 (Some timezones are no longer valid in PHP 5.5.10) --FILE-- <?php $zones = array( diff --git a/ext/dom/document.c b/ext/dom/document.c index 0ab0e498c8..001b477354 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -133,6 +133,7 @@ ZEND_END_ARG_INFO(); ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savexml, 0, 0, 0) ZEND_ARG_OBJ_INFO(0, node, DOMNode, 1) + ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO(); ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_construct, 0, 0, 0) diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c index c65902e759..30fd590536 100644 --- a/ext/dom/documenttype.c +++ b/ext/dom/documenttype.c @@ -193,7 +193,7 @@ int dom_documenttype_internal_subset_read(dom_object *obj, zval *retval) #ifdef LIBXML2_NEW_BUFFER smart_str_appendl(&ret_buf, (const char *) xmlOutputBufferGetContent(buff), xmlOutputBufferGetSize(buff)); #else - smart_str_appendl(&ret_buf, buff->buffer->content, buff->buffer->use); + smart_str_appendl(&ret_buf, (char *) buff->buffer->content, buff->buffer->use); #endif (void)xmlOutputBufferClose(buff); diff --git a/ext/gd/config.m4 b/ext/gd/config.m4 index 36688e127a..1864d258be 100644 --- a/ext/gd/config.m4 +++ b/ext/gd/config.m4 @@ -9,9 +9,9 @@ dnl PHP_ARG_WITH(gd, for GD support, [ --with-gd[=DIR] Include GD support. DIR is the GD library base install directory [BUNDLED]]) -if test -z "$PHP_VPX_DIR"; then - PHP_ARG_WITH(vpx-dir, for the location of libvpx, - [ --with-vpx-dir[=DIR] GD: Set the path to libvpx install prefix], no, no) +if test -z "$PHP_WEBP_DIR"; then + PHP_ARG_WITH(webp-dir, for the location of libwebp, + [ --with-webp-dir[=DIR] GD: Set the path to libwebp install prefix], no, no) fi if test -z "$PHP_JPEG_DIR"; then @@ -69,29 +69,37 @@ AC_DEFUN([PHP_GD_ZLIB],[ fi ]) -AC_DEFUN([PHP_GD_VPX],[ - if test "$PHP_VPX_DIR" != "no"; then +AC_DEFUN([PHP_GD_WEBP],[ + if test "$PHP_WEBP_DIR" != "no"; then - for i in $PHP_VPX_DIR /usr/local /usr; do - test -f $i/include/vpx_codec.h || test -f $i/include/vpx/vpx_codec.h && GD_VPX_DIR=$i && break + for i in $PHP_WEBP_DIR /usr/local /usr; do + test -f $i/include/webp/decode.h && GD_WEBP_DIR=$i && break done - if test -z "$GD_VPX_DIR"; then - AC_MSG_ERROR([vpx_codec.h not found.]) + if test -z "$GD_WEBP_DIR"; then + AC_MSG_ERROR([webp/decode.h not found.]) fi - PHP_CHECK_LIBRARY(vpx,vpx_codec_destroy, + for i in $PHP_WEBP_DIR /usr/local /usr; do + test -f $i/include/webp/encode.h && GD_WEBP_DIR=$i && break + done + + if test -z "$GD_WEBP_DIR"; then + AC_MSG_ERROR([webp/encode.h not found.]) + fi + + PHP_CHECK_LIBRARY(webp,WebPGetInfo, [ - PHP_ADD_INCLUDE($GD_VPX_DIR/include) + PHP_ADD_INCLUDE($GD_WEBP_DIR/include) PHP_ADD_LIBRARY(pthread) - PHP_ADD_LIBRARY_WITH_PATH(vpx, $GD_VPX_DIR/$PHP_LIBDIR, GD_SHARED_LIBADD) + PHP_ADD_LIBRARY_WITH_PATH(webp, $GD_WEBP_DIR/$PHP_LIBDIR, GD_SHARED_LIBADD) ],[ - AC_MSG_ERROR([Problem with libvpx.(a|so). Please check config.log for more information.]) + AC_MSG_ERROR([Problem with libwebp.(a|so). Please check config.log for more information.]) ],[ - -L$GD_VPX_DIR/$PHP_LIBDIR + -L$GD_WEBP_DIR/$PHP_LIBDIR ]) else - AC_MSG_RESULT([If configure fails try --with-vpx-dir=<DIR>]) + AC_MSG_RESULT([If configure fails try --with-webp-dir=<DIR>]) fi ]) @@ -242,7 +250,7 @@ dnl PNG is required by GD library dnl Various checks for GD features PHP_GD_ZLIB PHP_GD_TTSTR - PHP_GD_VPX + PHP_GD_WEBP PHP_GD_JPEG PHP_GD_PNG PHP_GD_XPM @@ -253,7 +261,7 @@ fi if test "$PHP_GD" = "yes"; then GD_MODULE_TYPE=builtin extra_sources="libgd/gd.c libgd/gd_gd.c libgd/gd_gd2.c libgd/gd_io.c libgd/gd_io_dp.c \ - libgd/gd_io_file.c libgd/gd_ss.c libgd/gd_io_ss.c libgd/webpimg.c libgd/gd_webp.c \ + libgd/gd_io_file.c libgd/gd_ss.c libgd/gd_io_ss.c libgd/gd_webp.c \ libgd/gd_png.c libgd/gd_jpeg.c libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c \ libgd/gdfontmb.c libgd/gdfontl.c libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c \ libgd/gdcache.c libgd/gdkanji.c libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c \ @@ -275,9 +283,9 @@ dnl Make sure the libgd/ is first in the include path dnl Depending which libraries were included to PHP configure, dnl enable the support in bundled GD library - if test -n "$GD_VPX_DIR"; then + if test -n "$GD_WEBP_DIR"; then AC_DEFINE(HAVE_GD_WEBP, 1, [ ]) - GDLIB_CFLAGS="$GDLIB_CFLAGS -DHAVE_LIBVPX" + GDLIB_CFLAGS="$GDLIB_CFLAGS -DHAVE_LIBWEBP" fi if test -n "$GD_JPEG_DIR"; then @@ -310,7 +318,7 @@ else dnl Various checks for GD features PHP_GD_ZLIB PHP_GD_TTSTR - PHP_GD_VPX + PHP_GD_WEBP PHP_GD_JPEG PHP_GD_PNG PHP_GD_XPM diff --git a/ext/gd/config.w32 b/ext/gd/config.w32 index a51f027d38..d9716bae36 100644 --- a/ext/gd/config.w32 +++ b/ext/gd/config.w32 @@ -2,7 +2,7 @@ // vim:ft=javascript ARG_WITH("gd", "Bundled GD support", "yes,shared"); -ARG_WITH("libvpx", "vpx support", "yes"); +ARG_WITH("libwebp", "webp support", "yes"); if (PHP_GD != "no") { if ( @@ -21,12 +21,13 @@ if (PHP_GD != "no") { CHECK_HEADER_ADD_INCLUDE("xpm.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\X11") ) { - if (PHP_LIBVPX != "no") { - if (CHECK_LIB("vpxmt.lib", "gd", PHP_GD) && - CHECK_HEADER_ADD_INCLUDE("vp8.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\vpx")) { - ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBVPX /D HAVE_GD_WEBP"); + if (PHP_LIBWEBP != "no") { + if (CHECK_LIB("libwebp.lib", "gd", PHP_GD) && + CHECK_HEADER_ADD_INCLUDE("decode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") && + CHECK_HEADER_ADD_INCLUDE("encode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp")) { + ADD_FLAG("CFLAGS_GD", "/D HAVE_LIBWEBP /D HAVE_GD_WEBP"); } else { - WARNING("libvpx not enabled; libraries and headers not found"); + WARNING("libwebp not enabled; libraries and headers not found"); } } CHECK_LIB("User32.lib", "gd", PHP_GD); @@ -38,7 +39,7 @@ if (PHP_GD != "no") { gdft.c gd_gd2.c gd_gd.c gd_gif_in.c gd_gif_out.c gdhelpers.c gd_io.c gd_io_dp.c \ gd_io_file.c gd_io_ss.c gd_jpeg.c gdkanji.c gd_png.c gd_ss.c \ gdtables.c gd_topal.c gd_wbmp.c gdxpm.c wbmp.c xbm.c gd_security.c gd_transform.c \ - gd_filter.c gd_pixelate.c gd_arc.c gd_rotate.c gd_color.c webpimg.c gd_webp.c \ + gd_filter.c gd_pixelate.c gd_arc.c gd_rotate.c gd_color.c gd_webp.c \ gd_crop.c gd_interpolation.c gd_matrix.c", "gd"); AC_DEFINE('HAVE_LIBGD', 1, 'GD support'); ADD_FLAG("CFLAGS_GD", " \ diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 9fcbb176c0..3f3c629dac 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -1294,6 +1294,11 @@ PHP_FUNCTION(gd_info) add_assoc_bool(return_value, "XPM Support", 0); #endif add_assoc_bool(return_value, "XBM Support", 1); +#ifdef HAVE_GD_WEBP + add_assoc_bool(return_value, "WebP Support", 1); +#else + add_assoc_bool(return_value, "WebP Support", 0); +#endif #if defined(USE_GD_JISX0208) add_assoc_bool(return_value, "JIS-mapped Japanese Font Support", 1); #else @@ -2435,7 +2440,7 @@ PHP_FUNCTION(imagecreatefromwebp) _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WEBP, "WEBP", gdImageCreateFromWebp, gdImageCreateFromWebpCtx); } /* }}} */ -#endif /* HAVE_GD_VPX */ +#endif /* HAVE_GD_WEBP */ /* {{{ proto resource imagecreatefromxbm(string filename) Create a new image from XBM file or URL */ @@ -3852,10 +3857,9 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int if (extended && EXT) { /* parse extended info */ zval *item; zend_string *key; - zend_ulong num_key; /* walk the assoc array */ - ZEND_HASH_FOREACH_KEY_VAL(HASH_OF(EXT), num_key, key, item) { + ZEND_HASH_FOREACH_STR_KEY_VAL(HASH_OF(EXT), key, item) { if (key == NULL) { continue; } diff --git a/ext/gd/gd_ctx.c b/ext/gd/gd_ctx.c index c848e438c7..5f7c5ae924 100644 --- a/ext/gd/gd_ctx.c +++ b/ext/gd/gd_ctx.c @@ -134,6 +134,11 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, php_error_docref(NULL, E_WARNING, "Invalid 2nd parameter, it must a filename or a stream"); RETURN_FALSE; } + } else if (argc > 1 && file != NULL) { + stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL); + if (stream == NULL) { + RETURN_FALSE; + } } else { ctx = emalloc(sizeof(gdIOCtx)); ctx->putC = _php_image_output_putc; @@ -181,7 +186,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, q = i; } if (image_type == PHP_GDIMG_TYPE_XBM) { - (*func_p)(im, file, q, ctx); + (*func_p)(im, file ? file : "", q, ctx); } else { (*func_p)(im, q, ctx); } diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 3164a2cc9e..b427831672 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -1772,9 +1772,13 @@ void gdImageFillToBorder (gdImagePtr im, int x, int y, int border, int color) if (x >= im->sx) { x = im->sx - 1; + } else if (x < 0) { + x = 0; } if (y >= im->sy) { y = im->sy - 1; + } else if (y < 0) { + y = 0; } for (i = x; i >= 0; i--) { @@ -2042,7 +2046,9 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) t=y1; y1 = y2; y2 = t; - + } + + if (x2 < x1) { t = x1; x1 = x2; x2 = t; @@ -2093,12 +2099,16 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) return; } else { - y1v = y1h + 1; - y2v = y2h - 1; - gdImageLine(im, x1h, y1h, x2h, y1h, color); - gdImageLine(im, x1h, y2h, x2h, y2h, color); - gdImageLine(im, x1v, y1v, x1v, y2v, color); - gdImageLine(im, x2v, y1v, x2v, y2v, color); + if (x1 == x2 || y1 == y2) { + gdImageLine(im, x1, y1, x2, y2, color); + } else { + y1v = y1h + 1; + y2v = y2h - 1; + gdImageLine(im, x1h, y1h, x2h, y1h, color); + gdImageLine(im, x1h, y2h, x2h, y2h, color); + gdImageLine(im, x1v, y1v, x1v, y2v, color); + gdImageLine(im, x2v, y1v, x2v, y2v, color); + } } } diff --git a/ext/gd/libgd/gd_arc.c b/ext/gd/libgd/gd_arc.c index 545dcb3fc5..1c74871388 100644 --- a/ext/gd/libgd/gd_arc.c +++ b/ext/gd/libgd/gd_arc.c @@ -58,7 +58,7 @@ void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c) int x=0,mx1=0,mx2=0,my1=0,my2=0; long aq,bq,dx,dy,r,rx,ry,a,b; int i; - int old_y1,old_y2; + int old_y2; a=w>>1; b=h>>1; @@ -79,7 +79,6 @@ void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c) ry = 0; x = a; old_y2=-2; - old_y1=-2; while (x > 0){ if (r > 0) { my1++;my2--; @@ -95,15 +94,10 @@ void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c) if(old_y2!=my2){ for(i=mx1;i<=mx2;i++){ gdImageSetPixel(im,i,my1,c); - } - } - if(old_y2!=my2){ - for(i=mx1;i<=mx2;i++){ gdImageSetPixel(im,i,my2,c); } } old_y2 = my2; - old_y1 = my1; } } diff --git a/ext/gd/libgd/gd_crop.c b/ext/gd/libgd/gd_crop.c index 84edb5d1f7..8331521446 100644 --- a/ext/gd/libgd/gd_crop.c +++ b/ext/gd/libgd/gd_crop.c @@ -80,14 +80,14 @@ printf("rect->x: %i\nrect->y: %i\nrect->width: %i\nrect->height: %i\n", crop->x, y = crop->y; if (src->trueColor) { unsigned int dst_y = 0; - while (y < (crop->y + (crop->height - 1))) { + while (y < (crop->y + crop->height)) { /* TODO: replace 4 w/byte per channel||pitch once available */ memcpy(dst->tpixels[dst_y++], src->tpixels[y++] + crop->x, crop->width * 4); } } else { int x; - for (y = crop->y; y < (crop->y + (crop->height - 1)); y++) { - for (x = crop->x; x < (crop->x + (crop->width - 1)); x++) { + for (y = crop->y; y < (crop->y + crop->height); y++) { + for (x = crop->x; x < (crop->x + crop->width); x++) { dst->pixels[y - crop->y][x - crop->x] = src->pixels[y][x]; } } diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c index ed2fc188f9..f70169dddc 100644 --- a/ext/gd/libgd/gd_interpolation.c +++ b/ext/gd/libgd/gd_interpolation.c @@ -1059,6 +1059,11 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt gdImagePtr tmp_im; gdImagePtr dst; + /* Convert to truecolor if it isn't; this code requires it. */ + if (!src->trueColor) { + gdImagePaletteToTrueColor(src); + } + tmp_im = gdImageCreateTrueColor(new_width, src_height); if (tmp_im == NULL) { return NULL; @@ -1068,12 +1073,12 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt dst = gdImageCreateTrueColor(new_width, new_height); if (dst == NULL) { - gdFree(tmp_im); + gdImageDestroy(tmp_im); return NULL; } gdImageSetInterpolationMethod(dst, src->interpolation_id); _gdScaleVert(tmp_im, new_width, src_height, dst, new_width, new_height); - gdFree(tmp_im); + gdImageDestroy(tmp_im); return dst; } @@ -2173,10 +2178,13 @@ gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, in /* no interpolation needed here */ switch (angle_rounded) { - case 9000: + case -27000: + case 9000: return gdImageRotate90(src, 0); - case 18000: + case -18000: + case 18000: return gdImageRotate180(src, 0); + case -9000: case 27000: return gdImageRotate270(src, 0); } diff --git a/ext/gd/libgd/gd_webp.c b/ext/gd/libgd/gd_webp.c index bf9ac9dd0e..eef65f79fb 100644 --- a/ext/gd/libgd/gd_webp.c +++ b/ext/gd/libgd/gd_webp.c @@ -1,28 +1,14 @@ +#ifdef HAVE_LIBWEBP #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include "gd.h" - - -#ifdef HAVE_LIBVPX -#include "webpimg.h" #include "gdhelpers.h" +#include "webp/decode.h" +#include "webp/encode.h" -extern void gd_YUV420toRGBA(uint8* Y, - uint8* U, - uint8* V, - gdImagePtr im); - -extern void gd_RGBAToYUV420(gdImagePtr im2, - uint8* Y, - uint8* U, - uint8* V); - -const char * gdWebpGetVersionString() -{ - return "not defined"; -} +#define GD_WEBP_ALLOC_STEP (4*1024) gdImagePtr gdImageCreateFromWebp (FILE * inFile) { @@ -34,42 +20,28 @@ gdImagePtr gdImageCreateFromWebp (FILE * inFile) return im; } + gdImagePtr gdImageCreateFromWebpPtr (int size, void *data) { - int width, height, ret; - unsigned char *Y = NULL; - unsigned char *U = NULL; - unsigned char *V = NULL; gdImagePtr im; - - ret = WebPDecode(data, size, &Y, &U, &V, &width, &height); - if (ret != webp_success) { - if (Y) free(Y); - if (U) free(U); - if (V) free(V); - php_gd_error("WebP decode: fail to decode input data"); - return NULL; - } - im = gdImageCreateTrueColor(width, height); - if (!im) { - return NULL; - } - gd_YUV420toRGBA(Y, U, V, im); + gdIOCtx *in = gdNewDynamicCtxEx(size, data, 0); + if (!in) + return 0; + im = gdImageCreateFromWebpCtx(in); + in->gd_free(in); return im; } -#define GD_WEBP_ALLOC_STEP (4*1024) - gdImagePtr gdImageCreateFromWebpCtx (gdIOCtx * infile) { - int width, height, ret; - unsigned char *filedata = NULL; + int width, height; + uint8_t *filedata = NULL; + uint8_t *argb = NULL; unsigned char *read, *temp; - unsigned char *Y = NULL; - unsigned char *U = NULL; - unsigned char *V = NULL; size_t size = 0, n; gdImagePtr im; + int x, y; + uint8_t *p; do { temp = gdRealloc(filedata, size+GD_WEBP_ALLOC_STEP); @@ -80,31 +52,106 @@ gdImagePtr gdImageCreateFromWebpCtx (gdIOCtx * infile) if (filedata) { gdFree(filedata); } - php_gd_error("WebP decode: realloc failed"); + zend_error(E_ERROR, "WebP decode: realloc failed"); return NULL; } n = gdGetBuf(read, GD_WEBP_ALLOC_STEP, infile); - /* differs from upstream where gdGetBuf return 0 instead of EOF */ if (n>0 && n!=EOF) { size += n; } } while (n>0 && n!=EOF); - ret = WebPDecode(filedata, size, &Y, &U, &V, &width, &height); - gdFree(filedata); - if (ret != webp_success) { - if (Y) free(Y); - if (U) free(U); - if (V) free(V); - php_gd_error("WebP decode: fail to decode input data"); + if (WebPGetInfo(filedata,size, &width, &height) == 0) { + zend_error(E_ERROR, "gd-webp cannot get webp info"); + gdFree(temp); return NULL; } + im = gdImageCreateTrueColor(width, height); - gd_YUV420toRGBA(Y, U, V, im); + if (!im) { + gdFree(temp); + return NULL; + } + argb = WebPDecodeARGB(filedata, size, &width, &height); + if (!argb) { + zend_error(E_ERROR, "gd-webp cannot allocate temporary buffer"); + gdFree(temp); + gdImageDestroy(im); + return NULL; + } + for (y = 0, p = argb; y < height; y++) { + for (x = 0; x < width; x++) { + register uint8_t a = gdAlphaMax - (*(p++) >> 1); + register uint8_t r = *(p++); + register uint8_t g = *(p++); + register uint8_t b = *(p++); + im->tpixels[y][x] = gdTrueColorAlpha(r, g, b, a); + } + } + gdFree(filedata); + /* do not use gdFree here, in case gdFree/alloc is mapped to something else than libc */ + free(argb); + gdFree(temp); + im->saveAlphaFlag = 1; return im; } +void gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quantization) +{ + uint8_t *argb; + int x, y; + uint8_t *p; + uint8_t *out; + size_t out_size; + + if (im == NULL) { + return; + } + + if (!gdImageTrueColor(im)) { + zend_error(E_ERROR, "Paletter image not supported by webp"); + return; + } + + if (quantization == -1) { + quantization = 80; + } + + argb = (uint8_t *)gdMalloc(gdImageSX(im) * 4 * gdImageSY(im)); + if (!argb) { + return; + } + p = argb; + for (y = 0; y < gdImageSY(im); y++) { + for (x = 0; x < gdImageSX(im); x++) { + register int c; + register char a; + c = im->tpixels[y][x]; + a = gdTrueColorGetAlpha(c); + if (a == 127) { + a = 0; + } else { + a = 255 - ((a << 1) + (a >> 6)); + } + *(p++) = gdTrueColorGetRed(c); + *(p++) = gdTrueColorGetGreen(c); + *(p++) = gdTrueColorGetBlue(c); + *(p++) = a; + } + } + out_size = WebPEncodeRGBA(argb, gdImageSX(im), gdImageSY(im), gdImageSX(im) * 4, quantization, &out); + if (out_size == 0) { + zend_error(E_ERROR, "gd-webp encoding failed"); + goto freeargb; + } + gdPutBuf(out, out_size, outfile); + free(out); + +freeargb: + gdFree(argb); +} + void gdImageWebpEx (gdImagePtr im, FILE * outFile, int quantization) { gdIOCtx *out = gdNewFileCtx(outFile); @@ -115,7 +162,7 @@ void gdImageWebpEx (gdImagePtr im, FILE * outFile, int quantization) void gdImageWebp (gdImagePtr im, FILE * outFile) { gdIOCtx *out = gdNewFileCtx(outFile); - gdImageWebpCtx(im, out, -1); + gdImageWebpCtx(im, out, -1); out->gd_free(out); } @@ -139,74 +186,4 @@ void * gdImageWebpPtrEx (gdImagePtr im, int *size, int quantization) out->gd_free(out); return rv; } - -/* - * Maps normalized QP (quality) to VP8 QP - */ -int mapQualityToVP8QP(int quality) { -#define MIN_QUALITY 0 -#define MAX_QUALITY 100 -#define MIN_VP8QP 1 -#define MAX_VP8QP 63 - const float scale = MAX_VP8QP - MIN_VP8QP; - const float vp8qp = - scale * (MAX_QUALITY - quality) / (MAX_QUALITY - MIN_QUALITY) + MIN_VP8QP; - if (quality < MIN_QUALITY || quality > MAX_QUALITY) { - php_gd_error("Wrong quality value %d.", quality); - return -1; - } - - return (int)(vp8qp + 0.5); -} - -/* This routine is based in part on code from Dale Lutz (Safe Software Inc.) - * and in part on demo code from Chapter 15 of "PNG: The Definitive Guide" - * (http://www.cdrom.com/pub/png/pngbook.html). - */ -void gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quantization) -{ - int width = im->sx; - int height = im->sy; - int colors = im->colorsTotal; - int *open = im->open; - - int yuv_width, yuv_height, yuv_nbytes, ret; - int vp8_quality; - unsigned char *Y = NULL, - *U = NULL, - *V = NULL; - unsigned char *filedata = NULL; - - /* Conversion to Y,U,V buffer */ - yuv_width = (width + 1) >> 1; - yuv_height = (height + 1) >> 1; - yuv_nbytes = width * height + 2 * yuv_width * yuv_height; - - if ((Y = (unsigned char *)gdCalloc(yuv_nbytes, sizeof(unsigned char))) == NULL) { - php_gd_error("gd-webp error: cannot allocate Y buffer"); - return; - } - vp8_quality = mapQualityToVP8QP(quantization); - - U = Y + width * height; - V = U + yuv_width * yuv_height; - gd_RGBAToYUV420(im, Y, U, V); - - /* Encode Y,U,V and write data to file */ - ret = WebPEncode(Y, U, V, width, height, width, yuv_width, yuv_height, yuv_width, - vp8_quality, &filedata, &yuv_nbytes, NULL); - gdFree(Y); - - if (ret != webp_success) { - if (filedata) { - free(filedata); - } - php_gd_error("gd-webp error: WebP Encoder failed"); - return; - } - - gdPutBuf (filedata, yuv_nbytes, outfile); - free(filedata); -} - -#endif /* HAVE_LIBVPX */ +#endif /* HAVE_LIBWEBP */ diff --git a/ext/gd/libgd/webpimg.c b/ext/gd/libgd/webpimg.c deleted file mode 100644 index 9d801a29a3..0000000000 --- a/ext/gd/libgd/webpimg.c +++ /dev/null @@ -1,900 +0,0 @@ -/*===========================================================================* - - Copyright 2010 Google Inc. - - - - This code is licensed under the same terms as WebM: - - Software License Agreement: http://www.webmproject.org/license/software/ - - Additional IP Rights Grant: http://www.webmproject.org/license/additional/ - *===========================================================================*/ - -/* - * Encoding/Decoding of WebP still image compression format. - * - * 1. WebPDecode: Takes an array of bytes (string) corresponding to the WebP - * encoded image and generates output in the YUV format with - * the color components U, V subsampled to 1/2 resolution along - * each dimension. - * - * 2. YUV420toRGBA: Converts from YUV (with color subsampling) such as produced - * by the WebPDecode routine into 32 bits per pixel RGBA data - * array. This data array can be directly used by the Leptonica - * Pix in-memory image format. - * - * 3. WebPEncode: Takes a Y, U, V data buffers (with color components U and V - * subsampled to 1/2 resolution) and generates the WebP string - * - * 4. RGBAToYUV420: Generates Y, U, V data (with color subsampling) from 32 bits - * per pixel RGBA data buffer. The resulting YUV data can be - * directly fed into the WebPEncode routine. - * - * 5. AdjustColorspace: - * - * 6. AdjustColorspaceBack: - */ -#include "gd.h" -#ifdef HAVE_LIBVPX -#include "webpimg.h" - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> - -#include "vpx/vpx_decoder.h" -#include "vpx/vp8dx.h" -#include "vpx/vpx_encoder.h" -#include "vpx/vp8cx.h" -#include "gd.h" - -/*---------------------------------------------------------------------* - * color conversions * - *---------------------------------------------------------------------*/ - -#ifndef inline -# define inline __inline -#endif -static inline int clip(float v, int a, int b) { - return (v > b) ? b : (v < 0) ? 0 : (int)(v); -} -enum { - COLOR_RED = 0, - COLOR_GREEN = 1, - COLOR_BLUE = 2, - ALPHA_CHANNEL = 3 -}; - -/* endian neutral extractions of RGBA from a 32 bit pixel */ -static const uint32 RED_SHIFT = - 8 * (sizeof(uint32) - 1 - COLOR_RED); /* 24 */ -static const uint32 GREEN_SHIFT = - 8 * (sizeof(uint32) - 1 - COLOR_GREEN); /* 16 */ -static const uint32 BLUE_SHIFT = - 8 * (sizeof(uint32) - 1 - COLOR_BLUE); /* 8 */ -static const uint32 ALPHA_SHIFT = - 8 * (sizeof(uint32) - 1 - ALPHA_CHANNEL); /* 0 */ - -static inline int GetRed(const uint32* rgba) { - return gdTrueColorGetRed(*rgba); -} - -static inline int GetGreen(const uint32* rgba) { - return gdTrueColorGetGreen(*rgba); -} - -static inline int GetBlue(const uint32* rgba) { - return gdTrueColorGetBlue(*rgba); -} - -enum { YUV_FRAC = 16 }; - -static inline int clip_uv(int v) { - v = (v + (257 << (YUV_FRAC + 2 - 1))) >> (YUV_FRAC + 2); - return ((v & ~0xff) == 0) ? v : v < 0 ? 0u : 255u; -} - - -/* YUV <-----> RGB conversions */ -/* The exact naming is Y'CbCr, following the ITU-R BT.601 standard. - * More information at: http://en.wikipedia.org/wiki/YCbCr - */ -static inline int GetLumaY(int r, int g, int b) { - const int kRound = (1 << (YUV_FRAC - 1)) + (16 << YUV_FRAC); - // Y = 0.2569 * R + 0.5044 * G + 0.0979 * B + 16 - const int luma = 16839 * r + 33059 * g + 6420 * b; - return (luma + kRound) >> YUV_FRAC; -} - -static inline int GetLumaYfromPtr(uint32* rgba) { - const int r = GetRed(rgba); - const int g = GetGreen(rgba); - const int b = GetBlue(rgba); - return GetLumaY(r, g, b); -} - -static inline int GetChromaU(int r, int g, int b) { - // U = -0.1483 * R - 0.2911 * G + 0.4394 * B + 128 - return clip_uv(-9719 * r - 19081 * g + 28800 * b); -} - -static inline int GetChromaV(int r, int g, int b) { - // V = 0.4394 * R - 0.3679 * G - 0.0715 * B + 128 - return clip_uv(+28800 * r - 24116 * g - 4684 * b); -} - -/* Converts YUV to RGB and writes into a 32 bit pixel in endian - * neutral fashion - */ -enum { RGB_FRAC = 16, RGB_HALF = (1 << RGB_FRAC) / 2, - RGB_RANGE_MIN = -227, RGB_RANGE_MAX = 256 + 226 }; - -static int init_done = 0; -static int16_t kVToR[256], kUToB[256]; -static int32_t kVToG[256], kUToG[256]; -static uint8_t kClip[RGB_RANGE_MAX - RGB_RANGE_MIN]; - -static void InitTables() { - int i; - for (i = 0; i < 256; ++i) { - kVToR[i] = (89858 * (i - 128) + RGB_HALF) >> RGB_FRAC; - kUToG[i] = -22014 * (i - 128) + RGB_HALF; - kVToG[i] = -45773 * (i - 128); - kUToB[i] = (113618 * (i - 128) + RGB_HALF) >> RGB_FRAC; - } - for (i = RGB_RANGE_MIN; i < RGB_RANGE_MAX; ++i) { - const int j = ((i - 16) * 76283 + RGB_HALF) >> RGB_FRAC; - kClip[i - RGB_RANGE_MIN] = (j < 0) ? 0 : (j > 255) ? 255 : j; - } - - init_done = 1; -} - -static void ToRGB(int y, int u, int v, uint32* const dst) { - const int r_off = kVToR[v]; - const int g_off = (kVToG[v] + kUToG[u]) >> RGB_FRAC; - const int b_off = kUToB[u]; - const int r = kClip[y + r_off - RGB_RANGE_MIN]; - const int g = kClip[y + g_off - RGB_RANGE_MIN]; - const int b = kClip[y + b_off - RGB_RANGE_MIN]; - *dst = (r << RED_SHIFT) | (g << GREEN_SHIFT) | (b << BLUE_SHIFT); -} - -static inline uint32 get_le32(const uint8* const data) { - return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); -} - -/* Returns the difference (in dB) between two images represented in YUV format - * - * Input: - * Y1/U1/V1: The Y/U/V data of the first image - * Y2/U2/V2: The Y/U/V data of the second image - * - * Returns the PSNR (http://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio) - * value computed between the two images - */ -double GetPSNRYuv(const uint8* Y1, - const uint8* U1, - const uint8* V1, - const uint8* Y2, - const uint8* U2, - const uint8* V2, - int y_width, - int y_height) { - int x, y, row_idx; - const int uv_width = ((y_width + 1) >> 1); - const int uv_height = ((y_height + 1) >> 1); - double sse = 0., count = 0.; - for (y = 0; y < y_height; ++y) { - count += y_width; - row_idx = y * y_width; - for (x = 0; x < y_width; ++x) { - double diff = Y1[row_idx + x] - Y2[row_idx + x]; - sse += diff * diff; - } - } - for (y = 0; y < uv_height; ++y) { - count += 2 * uv_width; - row_idx = y * uv_width; - for (x = 0; x < uv_width; ++x) { - const double diff_U = U1[row_idx + x] - U2[row_idx + x]; - const double diff_V = V1[row_idx + x] - V2[row_idx + x]; - sse += diff_U * diff_U + diff_V * diff_V; - } - } - return -4.3429448 * log(sse / (255. * 255. * count)); -} - -/* Returns the difference (in dB) between two images. One represented - * using Y,U,V vectors and the other is webp image data. - * Input: - * Y1/U1/V1: The Y/U/V data of the first image - * imgdata: data buffer containing webp image - * imgdata_size: size of the imgdata buffer - * - * Returns the PSNR value computed between the two images - */ -double WebPGetPSNR(const uint8* Y1, - const uint8* U1, - const uint8* V1, - uint8* imgdata, - int imgdata_size) { - uint8* Y2 = NULL; - uint8* U2 = NULL; - uint8* V2 = NULL; - int w = 0, h = 0; - double psnr = 0; - - WebPDecode(imgdata, - imgdata_size, - &Y2, - &U2, - &V2, - &w, - &h); - - psnr = GetPSNRYuv(Y1, U1, V1, Y2, U2, V2, w, h); - free(Y2); - - return psnr; -} - -/*---------------------------------------------------------------------* - * Reading WebP * - *---------------------------------------------------------------------*/ - -/* RIFF layout is: - * 0ffset tag - * 0...3 "RIFF" 4-byte tag - * 4...7 size of image data (including metadata) starting at offset 8 - * 8...11 "WEBP" our form-type signature - * 12..15 "VP8 " 4-byte tags, describing the raw video format used - * 16..19 size of the raw WebP image data, starting at offset 20 - * 20.... the WebP bytes - * There can be extra chunks after the "VP8 " chunk (ICMT, ICOP, ...) - * All 32-bits sizes are in little-endian order. - * Note: chunk data must be padded to multiple of 2 in size - */ - -int SkipRiffHeader(const uint8** data_ptr, int *data_size_ptr) { - /* 20 bytes RIFF header 10 bytes VP8 header */ - const int kHeaderSize = (20 + 10); - uint32 chunk_size = 0xffffffffu; - - if (*data_size_ptr >= kHeaderSize && !memcmp(*data_ptr, "RIFF", 4)) { - if (memcmp(*data_ptr + 8, "WEBP", 4)) { - return 0; /* wrong image file signature */ - } else { - const uint32 riff_size = get_le32(*data_ptr + 4); - if (memcmp(*data_ptr + 12, "VP8 ", 4)) { - return 0; /* invalid compression format */ - } - chunk_size = get_le32(*data_ptr + 16); - if ((chunk_size > riff_size + 8) || (chunk_size & 1)) { - return 0; /* inconsistent size information. */ - } - /* We have a RIFF container. Skip it. */ - *data_ptr += 20; - *data_size_ptr -= 20; - } - } - return chunk_size; -} - -/* Generate RGBA row from an YUV row (with width upsampling of chrome data) - * Input: - * 1, 2, 3. y_src, u_src, v_src - Pointers to input Y, U, V row data - * respectively. We reuse these variables, they iterate over all pixels in - * the row. - * 4. y_width: width of the Y image plane (aka image width) - * Output: - * 5. rgb_sat: pointer to the output rgb row. We reuse this variable, it - * iterates over all pixels in the row. - */ -static void YUV420toRGBLine(uint8* y_src, - uint8* u_src, - uint8* v_src, - int y_width, - uint32* rgb_dst) { - int x; - for (x = 0; x < (y_width >> 1); ++x) { - const int U = u_src[0]; - const int V = v_src[0]; - ToRGB(y_src[0], U, V, rgb_dst); - ToRGB(y_src[1], U, V, rgb_dst + 1); - ++u_src; - ++v_src; - y_src += 2; - rgb_dst += 2; - } - if (y_width & 1) { /* Rightmost pixel */ - ToRGB(y_src[0], (*u_src), (*v_src), rgb_dst); - } -} - -/* Converts from YUV (with color subsampling) such as produced by the WebPDecode - * routine into 32 bits per pixel RGBA data array. This data array can be - * directly used by the Leptonica Pix in-memory image format. - * Input: - * 1, 2, 3. Y, U, V: the input data buffers - * 4. pixwpl: the desired words per line corresponding to the supplied - * output pixdata. - * 5. width, height: the dimensions of the image whose data resides in Y, - * U, V. - * Output: - * 6. pixdata: the output data buffer. Caller should allocate - * height * pixwpl bytes of memory before calling this routine. - */ -void YUV420toRGBA(uint8* Y, - uint8* U, - uint8* V, - int words_per_line, - int width, - int height, - uint32* pixdata) { - int y_width = width; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_stride = uv_width; - int y; - - if (!init_done) - InitTables(); - - /* note that the U, V upsampling in height is happening here as the U, V - * buffers sent to successive odd-even pair of lines is same. - */ - for (y = 0; y < height; ++y) { - YUV420toRGBLine(Y + y * y_stride, - U + (y >> 1) * uv_stride, - V + (y >> 1) * uv_stride, - width, - pixdata + y * words_per_line); - } -} - -void gd_YUV420toRGBA(uint8* Y, - uint8* U, - uint8* V, - gdImagePtr im) { - int width = im->sx; - int height = im->sy; - int y_width = width; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_stride = uv_width; - int y; - - /* output im must be truecolor */ - if (!im->trueColor) { - return; - } - - if (!init_done) - InitTables(); - - /* note that the U, V upsampling in height is happening here as the U, V - * buffers sent to successive odd-even pair of lines is same. - */ - for (y = 0; y < height; ++y) { - YUV420toRGBLine(Y + y * y_stride, - U + (y >> 1) * uv_stride, - V + (y >> 1) * uv_stride, - width, - im->tpixels[y]); - } -} - -static WebPResult VPXDecode(const uint8* data, - int data_size, - uint8** p_Y, - uint8** p_U, - uint8** p_V, - int* p_width, - int* p_height) { - vpx_codec_ctx_t dec; - vp8_postproc_cfg_t ppcfg; - WebPResult result = webp_failure; - - if (!data || data_size <= 10 || !p_Y || !p_U || !p_V - || *p_Y != NULL || *p_U != NULL || *p_V != NULL) { - return webp_failure; - } - - if (vpx_codec_dec_init(&dec, - &vpx_codec_vp8_dx_algo, NULL, 0) != VPX_CODEC_OK) { - return webp_failure; - } - - ppcfg.post_proc_flag = VP8_NOFILTERING; - vpx_codec_control(&dec, VP8_SET_POSTPROC, &ppcfg); - - - if (vpx_codec_decode(&dec, data, data_size, NULL, 0) == VPX_CODEC_OK) { - vpx_codec_iter_t iter = NULL; - vpx_image_t* const img = vpx_codec_get_frame(&dec, &iter); - if (img) { - int y_width = img->d_w; - int y_height = img->d_h; - int y_stride = y_width; - int uv_width = (y_width + 1) >> 1; - int uv_stride = uv_width; - int uv_height = ((y_height + 1) >> 1); - int y; - - *p_width = y_width; - *p_height = y_height; - if ((*p_Y = (uint8 *)(calloc(y_stride * y_height - + 2 * uv_stride * uv_height, - sizeof(uint8)))) != NULL) { - *p_U = *p_Y + y_height * y_stride; - *p_V = *p_U + uv_height * uv_stride; - for (y = 0; y < y_height; ++y) { - memcpy(*p_Y + y * y_stride, - img->planes[0] + y * img->stride[0], - y_width); - } - for (y = 0; y < uv_height; ++y) { - memcpy(*p_U + y * uv_stride, - img->planes[1] + y * img->stride[1], - uv_width); - memcpy(*p_V + y * uv_stride, - img->planes[2] + y * img->stride[2], - uv_width); - } - result = webp_success; - } - } - } - vpx_codec_destroy(&dec); - - return result; -} - -WebPResult WebPDecode(const uint8* data, - int data_size, - uint8** p_Y, - uint8** p_U, - uint8** p_V, - int* p_width, - int* p_height) { - - const uint32 chunk_size = SkipRiffHeader(&data, &data_size); - if (!chunk_size) { - return webp_failure; /* unsupported RIFF header */ - } - - return VPXDecode(data, data_size, p_Y, p_U, p_V, p_width, p_height); -} - -/*---------------------------------------------------------------------* - * Writing WebP * - *---------------------------------------------------------------------*/ - -/* Takes a pair of RGBA row data as input and generates 2 rows of Y data and one - * row of subsampled U, V data as output - * Input: - * 1, 2. rgb_line1, rgb_line2 - input rgba rows - * 3. width - image width - * Outout: - * 4, 5, 6: Output Y, U, V row - */ -static void RGBALinepairToYUV420(uint32* rgb_line1, - uint32* rgb_line2, - int width, - uint8* Y_dst1, - uint8* Y_dst2, - uint8* u_dst, - uint8* v_dst) { - int x; - for (x = (width >> 1); x > 0; --x) { - const int sum_r = - GetRed(rgb_line1 + 0) + GetRed(rgb_line1 + 1) + - GetRed(rgb_line2 + 0) + GetRed(rgb_line2 + 1); - const int sum_g = - GetGreen(rgb_line1 + 0) + GetGreen(rgb_line1 + 1) + - GetGreen(rgb_line2 + 0) + GetGreen(rgb_line2 + 1); - const int sum_b = - GetBlue(rgb_line1 + 0) + GetBlue(rgb_line1 + 1) + - GetBlue(rgb_line2 + 0) + GetBlue(rgb_line2 + 1); - - Y_dst1[0] = GetLumaYfromPtr(rgb_line1 + 0); - Y_dst1[1] = GetLumaYfromPtr(rgb_line1 + 1); - Y_dst2[0] = GetLumaYfromPtr(rgb_line2 + 0); - Y_dst2[1] = GetLumaYfromPtr(rgb_line2 + 1); - - *u_dst++ = GetChromaU(sum_r, sum_g, sum_b); - *v_dst++ = GetChromaV(sum_r, sum_g, sum_b); - - rgb_line1 += 2; - rgb_line2 += 2; - Y_dst1 += 2; - Y_dst2 += 2; - } - - if (width & 1) { /* rightmost pixel. */ - const int sum_r = GetRed(rgb_line1) + GetRed(rgb_line2); - const int sum_g = GetGreen(rgb_line1) + GetGreen(rgb_line2); - const int sum_b = GetBlue(rgb_line1) + GetBlue(rgb_line2); - - Y_dst1[0] = GetLumaYfromPtr(rgb_line1); - Y_dst2[0] = GetLumaYfromPtr(rgb_line2); - *u_dst = GetChromaU(2 * sum_r, 2 * sum_g, 2 * sum_b); - *v_dst = GetChromaV(2 * sum_r, 2 * sum_g, 2 * sum_b); - } -} - -/* Generates Y, U, V data (with color subsampling) from 32 bits - * per pixel RGBA data buffer. The resulting YUV data can be directly fed into - * the WebPEncode routine. - * Input: - * 1. pixdatainput rgba data buffer - * 2. words per line corresponding to pixdata - * 3, 4. image width and height respectively - * Output: - * 5, 6, 7. Output YUV data buffers - */ -void gd_RGBAToYUV420(gdImagePtr im2, - uint8* Y, - uint8* U, - uint8* V) { - int y_width = im2->sx; - int y_height = im2->sy; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_stride = uv_width; - int y; - gdImagePtr im = NULL; - int free_im = 0; - - if (!im2->trueColor) { - /* Todo: Replace the color/YUV functions with our own and simplify - that should boost the conversion a bit as well, not only for - palette image. */ - im = gdImageCreateTrueColor(im2->sx, im2->sy); - if (!im) { - php_gd_error("gd-webp error: cannot convert palette input to truecolor"); - return; - } - gdImageCopy(im, im2, 0, 0, 0, 0, im->sx, im->sy); - free_im = 1; - } else { - im = im2; - } - for (y = 0; y < (y_height >> 1); ++y) { - RGBALinepairToYUV420(im->tpixels[2 * y], - im->tpixels[2 * y + 1], - y_width, - Y + 2 * y * y_stride, - Y + (2 * y + 1) * y_stride, - U + y * uv_stride, - V + y * uv_stride); - } - if (y_height & 1) { - RGBALinepairToYUV420(im->tpixels[y_height - 1], - im->tpixels[y_height - 1], - y_width, - Y + (y_height - 1) * y_stride, - Y + (y_height - 1) * y_stride, - U + (y_height >> 1) * uv_stride, - V + (y_height >> 1) * uv_stride); - } - if (free_im) { - gdImageDestroy(im); - } -} - -/* Generates Y, U, V data (with color subsampling) from 32 bits - * per pixel RGBA data buffer. The resulting YUV data can be directly fed into - * the WebPEncode routine. - * Input: - * 1. pixdatainput rgba data buffer - * 2. words per line corresponding to pixdata - * 3, 4. image width and height respectively - * Output: - * 5, 6, 7. Output YUV data buffers - */ -void RGBAToYUV420(uint32* pixdata, - int words_per_line, - int width, - int height, - uint8* Y, - uint8* U, - uint8* V) { - int y_width = width; - int y_height = height; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_stride = uv_width; - int y; - - for (y = 0; y < (y_height >> 1); ++y) { - RGBALinepairToYUV420(pixdata + 2 * y * words_per_line, - pixdata + (2 * y + 1) * words_per_line, - y_width, - Y + 2 * y * y_stride, - Y + (2 * y + 1) * y_stride, - U + y * uv_stride, - V + y * uv_stride); - } - if (y_height & 1) { - RGBALinepairToYUV420(pixdata + (y_height - 1) * words_per_line, - pixdata + (y_height - 1) * words_per_line, - y_width, - Y + (y_height - 1) * y_stride, - Y + (y_height - 1) * y_stride, - U + (y_height >> 1) * uv_stride, - V + (y_height >> 1) * uv_stride); - } -} - -static int codec_ctl(vpx_codec_ctx_t *enc, - enum vp8e_enc_control_id id, - int value) { - const vpx_codec_err_t res = vpx_codec_control_(enc, id, value); - if (res != VPX_CODEC_OK) { - return webp_failure; - } - return webp_success; -} - -static void SetupParams(vpx_codec_enc_cfg_t* cfg, - int QP) { - cfg->g_threads = 2; - cfg->rc_min_quantizer = QP; - cfg->rc_max_quantizer = QP; - cfg->kf_mode = VPX_KF_FIXED; -} - -/* VPXEncode: Takes a Y, U, V data buffers (with color components U and V - * subsampled to 1/2 resolution) and generates the VPX string. - * Output VPX string is placed in the *p_out buffer. container_size - * indicates number of bytes to be left blank at the beginning of - * *p_out buffer to accommodate for a container header. - * - * Return: success/failure - */ -static WebPResult VPXEncode(const uint8* Y, - const uint8* U, - const uint8* V, - int y_width, - int y_height, - int y_stride, - int uv_width, - int uv_height, - int uv_stride, - int QP, - int container_size, - unsigned char** p_out, - int* p_out_size_bytes) { - vpx_codec_iface_t* iface = &vpx_codec_vp8_cx_algo; - vpx_codec_err_t res; - vpx_codec_enc_cfg_t cfg; - vpx_codec_ctx_t enc; - WebPResult result = webp_failure; - vpx_image_t img; - - *p_out = NULL; - *p_out_size_bytes = 0; - - - /* validate input parameters. */ - if (!p_out || !Y || !U || !V - || y_width <= 0 || y_height <= 0 || uv_width <= 0 || uv_height <= 0 - || y_stride < y_width || uv_stride < uv_width - || QP < 0 || QP > 63) { - return webp_failure; - } - - res = vpx_codec_enc_config_default(iface, &cfg, 0); - if (res != VPX_CODEC_OK) { - return webp_failure; - } - - SetupParams(&cfg, QP); - cfg.g_w = y_width; - cfg.g_h = y_height; - - res = vpx_codec_enc_init(&enc, iface, &cfg, 0); - - if (res == VPX_CODEC_OK) { - codec_ctl(&enc, VP8E_SET_CPUUSED, 3); - codec_ctl(&enc, VP8E_SET_NOISE_SENSITIVITY, 0); - codec_ctl(&enc, VP8E_SET_SHARPNESS, 0); - codec_ctl(&enc, VP8E_SET_ENABLEAUTOALTREF, 0); - codec_ctl(&enc, VP8E_SET_ARNR_MAXFRAMES, 0); - codec_ctl(&enc, VP8E_SET_ARNR_TYPE, 0); - codec_ctl(&enc, VP8E_SET_ARNR_STRENGTH, 0); - codec_ctl(&enc, VP8E_SET_STATIC_THRESHOLD, 0); - codec_ctl(&enc, VP8E_SET_TOKEN_PARTITIONS, 2); - - vpx_img_wrap(&img, VPX_IMG_FMT_I420, - y_width, y_height, 16, (uint8*)(Y)); - img.planes[VPX_PLANE_Y] = (uint8*)(Y); - img.planes[VPX_PLANE_U] = (uint8*)(U); - img.planes[VPX_PLANE_V] = (uint8*)(V); - img.stride[VPX_PLANE_Y] = y_stride; - img.stride[VPX_PLANE_U] = uv_stride; - img.stride[VPX_PLANE_V] = uv_stride; - - res = vpx_codec_encode(&enc, &img, 0, 1, 0, VPX_DL_BEST_QUALITY); - - if (res == VPX_CODEC_OK) { - vpx_codec_iter_t iter = NULL; - const vpx_codec_cx_pkt_t* pkt = vpx_codec_get_cx_data(&enc, &iter); - if (pkt != NULL) { - *p_out = (unsigned char*)(calloc(container_size + pkt->data.frame.sz, - 1)); - - memcpy(*p_out + container_size, - (const void*)(pkt->data.frame.buf), - pkt->data.frame.sz); - *p_out_size_bytes = container_size + pkt->data.frame.sz; - - result = webp_success; - } - } - } - - vpx_codec_destroy(&enc); - - return result; -} - -WebPResult WebPEncode(const uint8* Y, - const uint8* U, - const uint8* V, - int y_width, - int y_height, - int y_stride, - int uv_width, - int uv_height, - int uv_stride, - int QP, - unsigned char** p_out, - int* p_out_size_bytes, - double *psnr) { - - const int kRiffHeaderSize = 20; - - if (VPXEncode(Y, U, V, - y_width, y_height, y_stride, - uv_width, uv_height, uv_stride, - QP, kRiffHeaderSize, - p_out, p_out_size_bytes) != webp_success) { - return webp_failure; - } else { - /* Write RIFF header */ - const int img_size_bytes = *p_out_size_bytes - kRiffHeaderSize; - const int chunk_size = (img_size_bytes + 1) & ~1; /* make size even */ - const int riff_size = chunk_size + 12; - const uint8_t kRiffHeader[20] = { 'R', 'I', 'F', 'F', - (riff_size >> 0) & 255, - (riff_size >> 8) & 255, - (riff_size >> 16) & 255, - (riff_size >> 24) & 255, - 'W', 'E', 'B', 'P', - 'V', 'P', '8', ' ', - (chunk_size >> 0) & 255, - (chunk_size >> 8) & 255, - (chunk_size >> 16) & 255, - (chunk_size >> 24) & 255 }; - memcpy(*p_out, kRiffHeader, kRiffHeaderSize); - - if (psnr) { - *psnr = WebPGetPSNR(Y, U, V, *p_out, *p_out_size_bytes); - } - - return webp_success; - } -} - -void AdjustColorspace(uint8* Y, uint8* U, uint8* V, int width, int height) { - int y_width = width; - int y_height = height; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_height = ((y_height + 1) >> 1); - int uv_stride = uv_width; - int x, y; - /* convert luma */ - for (y = 0; y < y_height; ++y) { - uint8* const Yrow = Y + y * y_stride; - for (x = 0; x < y_width; ++x) { - /* maps [0..255] to [16..235] */ - Yrow[x] = ((Yrow[x] * 55 + 32) >> 6) + 16; - } - } - /* convert chroma */ - for (y = 0; y < uv_height; ++y) { - uint8* const Urow = U + y * uv_stride; - uint8* const Vrow = V + y * uv_stride; - for (x = 0; x < uv_width; ++x) { - /* maps [0..255] to [16..240] */ - Urow[x] = (((Urow[x] - 127) * 7) >> 3) + 128; - Vrow[x] = (((Vrow[x] - 127) * 7) >> 3) + 128; - } - } -} - -void AdjustColorspaceBack(uint8* Y, uint8* U, uint8* V, int width, int height) { - int y_width = width; - int y_height = height; - int y_stride = y_width; - int uv_width = ((y_width + 1) >> 1); - int uv_height = ((y_height + 1) >> 1); - int uv_stride = uv_width; - int x, y; - /* convert luma */ - for (y = 0; y < y_height; ++y) { - uint8* const Yrow = Y + y * y_stride; - for (x = 0; x < y_width; ++x) { - /* maps [16..235] to [0..255] */ - const int v = ((Yrow[x] - 16) * 149 + 64) >> 7; - Yrow[x] = (v < 0) ? 0 : (v > 255) ? 255u : v; - } - } - /* convert chroma */ - for (y = 0; y < uv_height; ++y) { - uint8* const Urow = U + y * uv_stride; - uint8* const Vrow = V + y * uv_stride; - for (x = 0; x < uv_width; ++x) { - /* maps [0..255] to [16..240] */ - const int ru = (((Urow[x] - 128) * 73) >> 6) + 128; - const int rv = (((Vrow[x] - 128) * 73) >> 6) + 128; - Urow[x] = (ru < 0) ? 0 : (ru > 255) ? 255u : ru; - Vrow[x] = (rv < 0) ? 0 : (rv > 255) ? 255u : rv; - } - } -} - -WebPResult WebPGetInfo(const uint8* data, - int data_size, - int *width, - int *height) { - const uint32 chunk_size = SkipRiffHeader(&data, &data_size); - - if (width) *width = 0; - if (height) *height = 0; - - if (!chunk_size) { - return webp_failure; /* unsupported RIFF header */ - } - - /* Validate raw video data */ - if (data_size < 10) { - return webp_failure; /* not enough data */ - } - - /* check signature */ - if (data[3] != 0x9d || data[4] != 0x01 || data[5] != 0x2a) { - return webp_failure; /* Wrong signature. */ - } else { - const uint32 bits = data[0] | (data[1] << 8) | (data[2] << 16); - - if ((bits & 1)) { /* Not a keyframe. */ - return webp_failure; - } else { - const int profile = (bits >> 1) & 7; - const int show_frame = (bits >> 4) & 1; - const uint32 partition_length = (bits >> 5); - - if (profile > 3) { - return webp_failure; /* unknown profile */ - } - if (!show_frame) { - return webp_failure; /* first frame is invisible! */ - } - if (partition_length >= chunk_size) { - return webp_failure; /* inconsistent size information. */ - } else { - const int w = ((data[7] << 8) | data[6]) & 0x3fff; - const int h = ((data[9] << 8) | data[8]) & 0x3fff; - if (width) *width = w; - if (height) *height = h; - - return webp_success; - } - } - } - return webp_failure; -} -#endif /* HAVE_LIBVPX */ diff --git a/ext/gd/libgd/webpimg.h b/ext/gd/libgd/webpimg.h deleted file mode 100644 index bc0f9722bd..0000000000 --- a/ext/gd/libgd/webpimg.h +++ /dev/null @@ -1,181 +0,0 @@ -/*===========================================================================* - - Copyright 2010 Google Inc. - - - - This code is licensed under the same terms as WebM: - - Software License Agreement: http://www.webmproject.org/license/software/ - - Additional IP Rights Grant: http://www.webmproject.org/license/additional/ - *===========================================================================*/ - -/* - * Encoding/Decoding of WebP still image compression format. - * - * 1. WebPDecode: Takes an array of bytes (string) corresponding to the WebP - * encoded image and generates output in the YUV format with - * the color components U, V subsampled to 1/2 resolution along - * each dimension. - * - * 2. YUV420toRGBA: Converts from YUV (with color subsampling) such as produced - * by the WebPDecode routine into 32 bits per pixel RGBA data - * array. This data array can be directly used by the Leptonica - * Pix in-memory image format. - * - * 3. WebPEncode: Takes a Y, U, V data buffers (with color components U and V - * subsampled to 1/2 resolution) and generates the WebP string - * - * 4. RGBAToYUV420: Generates Y, U, V data (with color subsampling) from 32 bits - * per pixel RGBA data buffer. The resulting YUV data can be - * directly fed into the WebPEncode routine. - * - * 5. AdjustColorspace: - * - * 6. AdjustColorspaceBack: - */ - -#ifndef THIRD_PARTY_VP8_VP8IMG_H_ -#define THIRD_PARTY_VP8_VP8IMG_H_ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef unsigned char uint8; -typedef unsigned int uint32; -typedef enum WebPResultType { - webp_success = 0, - webp_failure = -1 -} WebPResult; - -/* Takes an array of bytes (string) corresponding to the WebP - * encoded image and generates output in the YUV format with - * the color components U, V subsampled to 1/2 resolution along - * each dimension. - * Input: - * 1. data: the WebP data stream (array of bytes) - * 2. data_size: count of bytes in the WebP data stream - * - * Output: - * 3. p_Y/p_U/p_V : pointer to the Y/U/V data buffer (this routine will - * allocate memory for the buffer, fill the buffer with - * appropriate data and transfer owner ship of the buffer - * to caller. Caller is responsible for freeing the memory). - * Note that the memory for Y, U, V buffers is alloacted - * in one chunk, hence one should call free(*p_Y) only. - * Do not try to free the U and V buffers. - * - * 6. p_width: this routine returns the width of the decoded image here - * 7. p_height: this routine returns the width of the decoded image here - * Return: success/failure - */ -WebPResult WebPDecode(const uint8* data, - int data_size, - uint8** p_Y, - uint8** p_U, - uint8** p_V, - int* p_width, - int* p_height); - -/* WebPEncode: Takes a Y, U, V data buffers (with color components U and V - * subsampled to 1/2 resolution) and generates the WebP string. - * Input: - * 1, 2, 3. Y, U, V: The input YUV data buffers - * 4, 5. y_width, y_height: The width and height of the image whose data - * is in Y, U, V. This matches the Y plane. The U - * and V planes typically have 1/2 width and - * height. - * 6. y_stride: The width (in bytes) of one row of Y data. This may not - * match width if there is end of row padding (e.g., for 32 - * bit row alignment). - * 7. QP: the quantization parameter. This parameter controls the - * compression vs quality tradeoff. Use smaller numbers for better - * quality (compression will be lesser) and vice versa. 20 is a - * good optimal value. - * Output: - * 8. p_out: the output array of bytes corresponding to the encoded WebP - * image. This routine allocates memory for the buffer, fills it - * with appropriate values and transfers ownership to caller. - * Caller responsible for freeing of memory. - * Return: success/failure - */ -WebPResult WebPEncode(const uint8* Y, - const uint8* U, - const uint8* V, - int y_width, - int y_height, - int y_stride, - int uv_width, - int uv_height, - int uv_stride, - int QP, - unsigned char** p_out, - int* p_out_size_bytes, - double* psnr); - -/* Converts from YUV (with color subsampling) such as produced by the WebPDecode - * routine into 32 bits per pixel RGBA data array. This data array can be - * directly used by the Leptonica Pix in-memory image format. - * Input: - * 1, 2, 3. Y, U, V: the input data buffers - * 4. pixwpl: the desired words per line corresponding to the supplied - * output pixdata. - * 5. width, height: the dimensions of the image whose data resides in Y, - * U, V. - * Output: - * 6. pixdata: the output data buffer. Caller should allocate - * height * pixwpl bytes of memory before calling this routine. - */ -void YUV420toRGBA(uint8* Y, - uint8* U, - uint8* V, - int words_per_line, - int width, - int height, - uint32* pixdata); - -/* Generates Y, U, V data (with color subsampling) from 32 bits - * per pixel RGBA data buffer. The resulting YUV data can be directly fed into - * the WebPEncode routine. - * Input: - * 1. pix data input rgba data buffer - * 2. words per line corresponding to pixdata - * 3, 4. image width and height respectively - * Output: - * 5, 6, 7. Output YUV data buffers - */ -void RGBAToYUV420(uint32* pixdata, - int words_per_line, - int width, - int height, - uint8* Y, - uint8* U, - uint8* V); - -/* This function adjust from YUV420J (jpeg decoding) to YUV420 (webp input) - * Hints: http://en.wikipedia.org/wiki/YCbCr - */ -void AdjustColorspace(uint8* Y, uint8* U, uint8* V, int width, int height); - -/* Inverse function: convert from YUV420 to YUV420J */ -void AdjustColorspaceBack(uint8* Y, uint8* U, uint8* V, int width, int height); - -/* Checks WebP image header and outputs height and width information of - * the image - * - * Input: - * 1. data: the WebP data stream (array of bytes) - * 2. data_size: count of bytes in the WebP data stream - * - * Outut: - * width/height: width and height of the image - * - * Return: success/failure - */ -WebPResult WebPGetInfo(const uint8* data, - int data_size, - int *width, - int *height); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* THIRD_PARTY_VP8_VP8IMG_H_ */ diff --git a/ext/gd/tests/bug53154.phpt b/ext/gd/tests/bug53154.phpt new file mode 100644 index 0000000000..6cbae2016c --- /dev/null +++ b/ext/gd/tests/bug53154.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #53154 (Zero-height rectangle has whiskers) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$im = imagecreatetruecolor(100, 10); +$red = imagecolorallocate($im, 255, 0, 0); +imagerectangle($im, 5, 5, 95, 5, $red); +var_dump(imagecolorat($im, 5, 4) !== $red); +var_dump(imagecolorat($im, 5, 6) !== $red); +var_dump(imagecolorat($im, 95, 4) !== $red); +var_dump(imagecolorat($im, 95, 6) !== $red); +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/gd/tests/bug53156.phpt b/ext/gd/tests/bug53156.phpt new file mode 100644 index 0000000000..24db8024fe --- /dev/null +++ b/ext/gd/tests/bug53156.phpt @@ -0,0 +1,57 @@ +--TEST--
+Bug #53156 (imagerectangle problem with point ordering)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+function draw_and_check_pixel($x, $y)
+{
+ global $img, $black, $red;
+
+ echo (imagecolorat($img, $x, $y) === $black) ? '+' : '-';
+ imagesetpixel($img, $x, $y, $red);
+}
+
+function draw_and_check_rectangle($x1, $y1, $x2, $y2)
+{
+ global $img, $black;
+
+ echo 'Rectangle: ';
+ imagerectangle($img, $x1, $y1, $x2, $y2, $black);
+ $x = ($x1 + $x2) / 2;
+ $y = ($y1 + $y2) / 2;
+ draw_and_check_pixel($x, $y1);
+ draw_and_check_pixel($x1, $y);
+ draw_and_check_pixel($x, $y2);
+ draw_and_check_pixel($x2, $y);
+ echo PHP_EOL;
+}
+
+$img = imagecreate(110, 210);
+$bgnd = imagecolorallocate($img, 255, 255, 255);
+$black = imagecolorallocate($img, 0, 0, 0);
+$red = imagecolorallocate($img, 255, 0, 0);
+
+draw_and_check_rectangle( 10, 10, 50, 50);
+draw_and_check_rectangle( 50, 60, 10, 100);
+draw_and_check_rectangle( 50, 150, 10, 110);
+draw_and_check_rectangle( 10, 200, 50, 160);
+imagesetthickness($img, 4);
+draw_and_check_rectangle( 60, 10, 100, 50);
+draw_and_check_rectangle(100, 60, 60, 100);
+draw_and_check_rectangle(100, 150, 60, 110);
+draw_and_check_rectangle( 60, 200, 100, 160);
+
+//imagepng($img, __DIR__ . '/bug53156.png'); // debug
+?>
+--EXPECT--
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
+Rectangle: ++++
diff --git a/ext/gd/tests/bug53640.phpt b/ext/gd/tests/bug53640.phpt new file mode 100644 index 0000000000..a16b7c24c0 --- /dev/null +++ b/ext/gd/tests/bug53640.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #53640 (XBM images require width to be multiple of 8) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$im = imagecreate(9, 9); +imagecolorallocate($im, 0, 0, 0); // background +$white = imagecolorallocate($im, 255, 255, 255); +imagefilledrectangle($im, 2, 2, 6, 6, $white); +imagexbm($im, NULL); +?> +--XFAIL-- +Padding is not implemented yet +--EXPECT-- +#define image_width 9 +#define image_height 9 +static unsigned char image_bits[] = { + 0xFF, 0x01, 0xFF, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, + 0x83, 0x01, 0xFF, 0x01, 0xFF, 0x01}; diff --git a/ext/gd/tests/bug66339.phpt b/ext/gd/tests/bug66339.phpt new file mode 100644 index 0000000000..a5ef5c6915 --- /dev/null +++ b/ext/gd/tests/bug66339.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #66339 (PHP segfaults in imagexbm) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$im = imagecreate(8, 8); +imagecolorallocate($im, 0, 0, 0); // background +$white = imagecolorallocate($im, 255, 255, 255); +imagefilledrectangle($im, 2, 2, 6, 6, $white); +imagexbm($im, NULL); +echo "------------\n"; +imagexbm($im, './bug66339.xbm'); +echo file_get_contents('./bug66339.xbm'); +?> +--CLEAN-- +<?php +unlink('./bug66339.xbm'); +?> +--EXPECT-- +#define image_width 8 +#define image_height 8 +static unsigned char image_bits[] = { + 0xFF, 0xFF, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFF}; +------------ +#define bug66339_width 8 +#define bug66339_height 8 +static unsigned char bug66339_bits[] = { + 0xFF, 0xFF, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFF}; diff --git a/ext/gd/tests/bug66387.phpt b/ext/gd/tests/bug66387.phpt new file mode 100644 index 0000000000..79c49a527b --- /dev/null +++ b/ext/gd/tests/bug66387.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #66387 (Stack overflow with imagefilltoborder) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available!'); +?> +--FILE-- +<?php +$im = imagecreatetruecolor(20, 20); +$c = imagecolorallocate($im, 255, 0, 0); +imagefilltoborder($im, 0, -999355, $c, $c); +echo "ready\n"; +?> +--EXPECT-- +ready diff --git a/ext/gd/tests/bug66590.phpt b/ext/gd/tests/bug66590.phpt new file mode 100644 index 0000000000..a3c5409d6b --- /dev/null +++ b/ext/gd/tests/bug66590.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #66590 (imagewebp() doesn't pad to even length) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +if (!function_exists('imagewebp')) die('skip WebP support not available'); +?> +--FILE-- +<?php +$filename = __DIR__ . '/bug66590.webp'; +$im = imagecreatetruecolor(75, 75); +$red = imagecolorallocate($im, 255, 0, 0); +imagefilledrectangle($im, 0, 0, 74, 74, $red); +imagewebp($im, $filename); +$stream = fopen($filename, 'rb'); +fread($stream, 4); // skip "RIFF" +$length = fread($stream, 4); +fclose($stream); +$length = unpack('V', $length)[1] + 8; +var_dump($length === filesize($filename)); +?> +--CLEAN-- +<?php +@unlink(__DIR__ . '/bug66590.webp'); +?> +--EXPECT-- +bool(true) diff --git a/ext/gd/tests/bug66590_1.phpt b/ext/gd/tests/bug66590_1.phpt new file mode 100644 index 0000000000..9e598d1eae --- /dev/null +++ b/ext/gd/tests/bug66590_1.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #66590 (imagewebp() doesn't pad to even length) - segfault +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +if (!function_exists('imagewebp')) die('skip WebP support not available'); +?> +--FILE-- +<?php +$im = imagecreatetruecolor(6, 6); +ob_start(); +imagewebp($im); +ob_end_clean(); +echo "ready\n"; +?> +--EXPECT-- +ready diff --git a/ext/gd/tests/bug66882.phpt b/ext/gd/tests/bug66882.phpt new file mode 100644 index 0000000000..6dfbdfe06d --- /dev/null +++ b/ext/gd/tests/bug66882.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #66882 (imagerotate by -90 degrees truncates image by 1px) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$im = imagerotate(imagecreate(10, 10), -90, 0); +var_dump(imagesy($im), imagesx($im)); +?> +--EXPECT-- +int(10) +int(10) diff --git a/ext/gd/tests/bug67447.phpt b/ext/gd/tests/bug67447.phpt new file mode 100644 index 0000000000..2caa49b623 --- /dev/null +++ b/ext/gd/tests/bug67447.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #67447 (imagecrop() adds a black line when cropping) +--FILE-- +<?php +// true color +$image = imagecreatetruecolor(500, 500); +$red = imagecolorallocate($image, 255, 0, 0); +imagefill($image, 0, 0, $red); +$cropped = imagecrop($image, ['x' => 0, 'y' => 0, 'width' => 250, 'height' => 250]); +var_dump(imagecolorat($cropped, 249, 249) === $red); +imagedestroy($image); +imagedestroy($cropped); + +// palette +$image = imagecreate(500, 500); +imagecolorallocate($image, 0, 0, 255); // first palette color = background +$red = imagecolorallocate($image, 255, 0, 0); +imagefill($image, 0, 0, $red); +$cropped = imagecrop($image, ['x' => 0, 'y' => 0, 'width' => 250, 'height' => 250]); +var_dump(imagecolorat($cropped, 249, 249) === $red); +imagedestroy($image); +imagedestroy($cropped); +?> +--EXPECT-- +bool(true) +bool(true) diff --git a/ext/gd/tests/bug69024.phpt b/ext/gd/tests/bug69024.phpt new file mode 100644 index 0000000000..f2113fc44f --- /dev/null +++ b/ext/gd/tests/bug69024.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #69024 (imagescale segfault with palette based image) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$im = imagecreate(256, 256); +imagescale($im, 32, 32, IMG_BICUBIC); +imagedestroy($im); +echo "done\n"; +?> +--EXPECT-- +done diff --git a/ext/gd/tests/bug70047.phpt b/ext/gd/tests/bug70047.phpt new file mode 100644 index 0000000000..7dbf8ab59d --- /dev/null +++ b/ext/gd/tests/bug70047.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #70047 (gd_info() doesn't report WebP support) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$info = gd_info(); +var_dump(array_key_exists('WebP Support', $info)); +var_dump($info['WebP Support'] === function_exists('imagewebp')); +?> +--EXPECT-- +bool(true) +bool(true) diff --git a/ext/gd/tests/bug70102.phpt b/ext/gd/tests/bug70102.phpt new file mode 100644 index 0000000000..b82c757ebe --- /dev/null +++ b/ext/gd/tests/bug70102.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #70102 (imagecreatefromwebm() shifts colors) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +if (!function_exists('imagewebp') || !function_exists('imagecreatefromwebp')) + die('skip WebP support not available'); +?> +--FILE-- +<?php +$filename = __DIR__ . '/bug70102.webp'; + +$im = imagecreatetruecolor(8, 8); +$white = imagecolorallocate($im, 255, 255, 255); +var_dump($white & 0xffffff); +imagefilledrectangle($im, 0, 0, 7, 7, $white); +imagewebp($im, $filename); +imagedestroy($im); + +$im = imagecreatefromwebp($filename); +$color = imagecolorat($im, 4, 4); +var_dump($color & 0xffffff); +?> +--CLEAN-- +<?php +unlink(__DIR__ . '/bug70102.webp'); +?> +--EXPECT-- +int(16777215) +int(16777215) diff --git a/ext/gd/tests/imagefilledellipse_basic.phpt b/ext/gd/tests/imagefilledellipse_basic.phpt new file mode 100644 index 0000000000..a1a578ad43 --- /dev/null +++ b/ext/gd/tests/imagefilledellipse_basic.phpt @@ -0,0 +1,25 @@ +--TEST-- +Testing imagefilledellipse() of GD library +--SKIPIF-- +<?php +if (!extension_loaded("gd")) die("skip GD not present"); +?> +--FILE-- +<?php + +$image = imagecreatetruecolor(100, 100); + +$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); + +//create an ellipse and fill it with white color +imagefilledellipse($image, 50, 50, 40, 30, $white); + +ob_start(); +imagepng($image); +$img = ob_get_contents(); +ob_end_clean(); + +echo md5(base64_encode($img)); +?> +--EXPECT-- +9ba540bba1b78c9f08efaa6fa0afd93b diff --git a/ext/gd/tests/imagewebp_nullbyte_injection.phpt b/ext/gd/tests/imagewebp_nullbyte_injection.phpt index 166beb181f..1808e8fb79 100644 --- a/ext/gd/tests/imagewebp_nullbyte_injection.phpt +++ b/ext/gd/tests/imagewebp_nullbyte_injection.phpt @@ -8,7 +8,7 @@ rmdir($tempdir); <?php if(!extension_loaded('gd')){ die('skip gd extension not available'); } $support = gd_info(); -if (!isset($support['WEBP Support']) || $support['WEBP Support'] === false) { +if (!isset($support['WebP Support']) || $support['WebP Support'] === false) { print 'skip webp support not available'; } ?> @@ -30,9 +30,9 @@ imagewebp($image, $temp); var_dump(file_exists($tempdir. "/test1")); var_dump(file_exists($tempdir. "/test1.tmp")); foreach (glob($tempdir . "/test*") as $file ) { unlink($file); } - +?> --EXPECTF-- -imagewbmp TEST +imagewebp TEST Warning: imagewebp(): Invalid 2nd parameter, filename must not contain null bytes in %s on line %d bool(false) diff --git a/ext/gd/tests/similarity.inc b/ext/gd/tests/similarity.inc new file mode 100644 index 0000000000..cb0dba77f2 --- /dev/null +++ b/ext/gd/tests/similarity.inc @@ -0,0 +1,64 @@ +<?php + +/** + * A very simple algorithm for finding the dissimilarity between images, + * mainly useful for checking lossy compression. + */ + +/** + * Gets the individual components of an RGB value. + * + * @param int $color + * @param int $red + * @param int $green + * @param int $blue + * + * @return void + */ +function get_rgb($color, &$red, &$green, &$blue) +{ + // assumes $color is an RGB value + $red = ($color >> 16) & 0xFF; + $green = ($color >> 8) & 0xFF; + $blue = $color & 0xFF; +} + +/** + * Calculates the euclidean distance of two RGB values. + * + * @param int $color1 + * @param int $color2 + * + * @return int + */ +function calc_pixel_distance($color1, $color2) +{ + get_rgb($color1, $red1, $green1, $blue1); + get_rgb($color2, $red2, $green2, $blue2); + return sqrt( + pow($red1 - $red2, 2) + pow($green1 - $green2, 2) + pow($blue1 - $blue2, 2) + ); +} + +/** + * Calculates dissimilarity of two images. + * + * @param resource $image1 + * @param resource $image2 + * + * @return int The dissimilarity. 0 means the images are identical. The higher + * the value, the more dissimilar are the images. + */ +function calc_image_dissimilarity($image1, $image2) +{ + // assumes image1 and image2 have same width and height + $dissimilarity = 0; + for ($i = 0, $n = imagesx($image1); $i < $n; $i++) { + for ($j = 0, $m = imagesy($image1); $j < $m; $j++) { + $color1 = imagecolorat($image1, $i, $j); + $color2 = imagecolorat($image2, $i, $j); + $dissimilarity += calc_pixel_distance($color1, $color2); + } + } + return $dissimilarity; +} diff --git a/ext/gd/tests/webp_basic.phpt b/ext/gd/tests/webp_basic.phpt new file mode 100644 index 0000000000..75933a9ca4 --- /dev/null +++ b/ext/gd/tests/webp_basic.phpt @@ -0,0 +1,35 @@ +--TEST--
+imagewebp() and imagecreatefromwebp() - basic test
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+if (!function_exists('imagewebp') || !function_exists('imagecreatefromwebp'))
+ die('skip WebP support not available');
+?>
+--FILE--
+<?php
+require_once __DIR__ . '/similarity.inc';
+
+$filename = __DIR__ . '/webp_basic.webp';
+
+$im1 = imagecreatetruecolor(75, 75);
+$white = imagecolorallocate($im1, 255, 255, 255);
+$red = imagecolorallocate($im1, 255, 0, 0);
+$green = imagecolorallocate($im1, 0, 255, 0);
+$blue = imagecolorallocate($im1, 0, 0, 255);
+imagefilledrectangle($im1, 0, 0, 74, 74, $white);
+imageline($im1, 3, 3, 71, 71, $red);
+imageellipse($im1, 18, 54, 36, 36, $green);
+imagerectangle($im1, 41, 3, 71, 33, $blue);
+imagewebp($im1, $filename);
+
+$im2 = imagecreatefromwebp($filename);
+imagewebp($im2, $filename);
+var_dump(calc_image_dissimilarity($im1, $im2) < 10e5);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/webp_basic.webp');
+?>
+--EXPECT--
+bool(true)
diff --git a/ext/intl/collator/collator_sort.c b/ext/intl/collator/collator_sort.c index 8727c1d8ab..ca4b7ea785 100644 --- a/ext/intl/collator/collator_sort.c +++ b/ext/intl/collator/collator_sort.c @@ -385,8 +385,6 @@ PHP_FUNCTION( collator_sort_with_sort_keys ) int utf16_buf_size = DEF_UTF16_BUF_SIZE; /* the length of utf16_buf */ int utf16_len = 0; /* length of converted string */ - HashTable* sortedHash = NULL; - COLLATOR_METHOD_INIT_VARS /* Parse parameters. */ diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 5aa68e2735..959a4fd5a0 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -104,7 +104,7 @@ PHP_FUNCTION( msgfmt_format_message ) size_t pattern_len = 0; const char *slocale = NULL; size_t slocale_len = 0; - MessageFormatter_object mf = {0}; + MessageFormatter_object mf; MessageFormatter_object *mfo = &mf; /* Parse parameters. */ @@ -117,6 +117,7 @@ PHP_FUNCTION( msgfmt_format_message ) RETURN_FALSE; } + memset(mfo, 0, sizeof(*mfo)); msgformat_data_init(&mfo->mf_data); if(pattern && pattern_len) { diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 4d63a0169a..349633912b 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -97,7 +97,7 @@ PHP_FUNCTION( msgfmt_parse_message ) size_t slocale_len = 0; char *source = NULL; size_t src_len = 0; - MessageFormatter_object mf = {0}; + MessageFormatter_object mf; MessageFormatter_object *mfo = &mf; /* Parse parameters. */ @@ -110,6 +110,7 @@ PHP_FUNCTION( msgfmt_parse_message ) RETURN_FALSE; } + memset(mfo, 0, sizeof(*mfo)); msgformat_data_init(&mfo->mf_data); if(pattern && pattern_len) { diff --git a/ext/intl/tests/calendar_before_after_error.phpt b/ext/intl/tests/calendar_before_after_error.phpt index 938c7a5fb7..7d57b93a33 100644 --- a/ext/intl/tests/calendar_before_after_error.phpt +++ b/ext/intl/tests/calendar_before_after_error.phpt @@ -67,9 +67,9 @@ bool(false) error: 2, IntlCalendar::before() expects exactly 1 parameter, 0 given error: 2, IntlCalendar::before(): intlcal_before/after: bad arguments bool(false) -error: 1, Argument 1 passed to IntlCalendar::after() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to IntlCalendar::after() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to IntlCalendar::before() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to IntlCalendar::before() must be an instance of IntlCalendar, integer given error: 2, IntlCalendar::after() expects exactly 1 parameter, 2 given error: 2, IntlCalendar::after(): intlcal_before/after: bad arguments diff --git a/ext/intl/tests/calendar_equals_error.phpt b/ext/intl/tests/calendar_equals_error.phpt index 8465541c87..a9f164d38f 100644 --- a/ext/intl/tests/calendar_equals_error.phpt +++ b/ext/intl/tests/calendar_equals_error.phpt @@ -49,10 +49,10 @@ try { error: 2, IntlCalendar::equals() expects exactly 1 parameter, 0 given error: 2, IntlCalendar::equals(): intlcal_equals: bad arguments bool(false) -error: 1, Argument 1 passed to IntlCalendar::equals() must be an instance of IntlCalendar, instance of stdClass given +error: 0, Argument 1 passed to IntlCalendar::equals() must be an instance of IntlCalendar, instance of stdClass given -error: 1, Argument 1 passed to IntlCalendar::equals() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to IntlCalendar::equals() must be an instance of IntlCalendar, integer given -error: 1, Argument 2 passed to intlcal_equals() must be an instance of IntlCalendar, array given +error: 0, Argument 2 passed to intlcal_equals() must be an instance of IntlCalendar, array given -error: 1, Argument 1 passed to intlcal_equals() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_equals() must be an instance of IntlCalendar, integer given diff --git a/ext/intl/tests/calendar_get_Least_Greatest_Minimum_Maximum_error.phpt b/ext/intl/tests/calendar_get_Least_Greatest_Minimum_Maximum_error.phpt index 3d881a781d..5d74a7d72d 100644 --- a/ext/intl/tests/calendar_get_Least_Greatest_Minimum_Maximum_error.phpt +++ b/ext/intl/tests/calendar_get_Least_Greatest_Minimum_Maximum_error.phpt @@ -98,11 +98,11 @@ bool(false) Warning: intlcal_get_minimum(): intlcal_get_minimum: invalid field in %s on line %d bool(false) -error: 1, Argument 1 passed to intlcal_get_least_maximum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_least_maximum() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_get_maximum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_maximum() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_get_greatest_minimum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_greatest_minimum() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_get_minimum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_minimum() must be an instance of IntlCalendar, integer given diff --git a/ext/intl/tests/calendar_get_getActualMaximum_Minumum_error2.phpt b/ext/intl/tests/calendar_get_getActualMaximum_Minumum_error2.phpt index b29e8ed0cb..88b03f8cdb 100644 --- a/ext/intl/tests/calendar_get_getActualMaximum_Minumum_error2.phpt +++ b/ext/intl/tests/calendar_get_getActualMaximum_Minumum_error2.phpt @@ -105,9 +105,9 @@ bool(false) error: 2, intlcal_get_actual_minimum() expects parameter 2 to be integer, string given error: 2, intlcal_get_actual_minimum(): intlcal_get_actual_minimum: bad arguments bool(false) -error: 1, Argument 1 passed to intlcal_get() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_get_actual_maximum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_actual_maximum() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_get_actual_minimum() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_get_actual_minimum() must be an instance of IntlCalendar, integer given diff --git a/ext/intl/tests/calendar_isEquivalentTo_error.phpt b/ext/intl/tests/calendar_isEquivalentTo_error.phpt index ac19e1dd90..35b8fc189a 100644 --- a/ext/intl/tests/calendar_isEquivalentTo_error.phpt +++ b/ext/intl/tests/calendar_isEquivalentTo_error.phpt @@ -50,16 +50,16 @@ try { } --EXPECT-- -error: 1, Argument 1 passed to IntlCalendar::isEquivalentTo() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to IntlCalendar::isEquivalentTo() must be an instance of IntlCalendar, integer given error: 2, IntlCalendar::isEquivalentTo() expects exactly 1 parameter, 2 given error: 2, IntlCalendar::isEquivalentTo(): intlcal_is_equivalent_to: bad arguments bool(false) -error: 1, Argument 1 passed to IntlCalendar::isEquivalentTo() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to IntlCalendar::isEquivalentTo() must be an instance of IntlCalendar, integer given error: 2, intlcal_is_equivalent_to() expects exactly 2 parameters, 1 given error: 2, intlcal_is_equivalent_to(): intlcal_is_equivalent_to: bad arguments bool(false) -error: 1, Argument 2 passed to intlcal_is_equivalent_to() must be an instance of IntlCalendar, integer given +error: 0, Argument 2 passed to intlcal_is_equivalent_to() must be an instance of IntlCalendar, integer given -error: 1, Argument 1 passed to intlcal_is_equivalent_to() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_is_equivalent_to() must be an instance of IntlCalendar, integer given diff --git a/ext/intl/tests/calendar_setTimeZone_error.phpt b/ext/intl/tests/calendar_setTimeZone_error.phpt index 410dc86c60..4dee131ef7 100644 --- a/ext/intl/tests/calendar_setTimeZone_error.phpt +++ b/ext/intl/tests/calendar_setTimeZone_error.phpt @@ -51,4 +51,4 @@ bool(false) error: 2, intlcal_set_time_zone() expects exactly 2 parameters, 3 given error: 2, intlcal_set_time_zone(): intlcal_set_time_zone: bad arguments bool(false) -error: 1, Argument 1 passed to intlcal_set_time_zone() must be an instance of IntlCalendar, integer given +error: 0, Argument 1 passed to intlcal_set_time_zone() must be an instance of IntlCalendar, integer given diff --git a/ext/intl/tests/timezone_hasSameRules_error.phpt b/ext/intl/tests/timezone_hasSameRules_error.phpt index 5fb5bdde7a..0e9b4a8bd6 100644 --- a/ext/intl/tests/timezone_hasSameRules_error.phpt +++ b/ext/intl/tests/timezone_hasSameRules_error.phpt @@ -31,9 +31,9 @@ try { } --EXPECT-- -int(1) +int(0) string(99) "Argument 1 passed to IntlTimeZone::hasSameRules() must be an instance of IntlTimeZone, string given" -int(1) +int(0) string(92) "Argument 1 passed to intltz_has_same_rules() must be an instance of IntlTimeZone, null given" diff --git a/ext/json/json_parser.tab.c b/ext/json/json_parser.tab.c index ad19e4fa10..14ccd77d4e 100644 --- a/ext/json/json_parser.tab.c +++ b/ext/json/json_parser.tab.c @@ -1,19 +1,19 @@ -/* A Bison parser, made by GNU Bison 2.6.5. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -26,7 +26,7 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.6.5" +#define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -101,25 +101,23 @@ int json_yydebug = 1; - /* Substitute the variable and function names. */ #define yyparse php_json_yyparse #define yylex php_json_yylex #define yyerror php_json_yyerror -#define yylval php_json_yylval -#define yychar php_json_yychar #define yydebug php_json_yydebug #define yynerrs php_json_yynerrs + /* Copy the first part of user declarations. */ -# ifndef YY_NULL +# ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr +# define YY_NULLPTR nullptr # else -# define YY_NULL 0 +# define YY_NULLPTR 0 # endif # endif @@ -133,9 +131,9 @@ int json_yydebug = 1; /* In a future release of Bison, this section will be replaced by #include "json_parser.tab.h". */ -#ifndef YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED -# define YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED -/* Enabling traces. */ +#ifndef YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED +# define YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -143,22 +141,21 @@ int json_yydebug = 1; extern int php_json_yydebug; #endif -/* Tokens. */ +/* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - PHP_JSON_T_NUL = 258, - PHP_JSON_T_TRUE = 259, - PHP_JSON_T_FALSE = 260, - PHP_JSON_T_INT = 261, - PHP_JSON_T_DOUBLE = 262, - PHP_JSON_T_STRING = 263, - PHP_JSON_T_ESTRING = 264, - PHP_JSON_T_EOI = 265, - PHP_JSON_T_ERROR = 266 - }; + enum yytokentype + { + PHP_JSON_T_NUL = 258, + PHP_JSON_T_TRUE = 259, + PHP_JSON_T_FALSE = 260, + PHP_JSON_T_INT = 261, + PHP_JSON_T_DOUBLE = 262, + PHP_JSON_T_STRING = 263, + PHP_JSON_T_ESTRING = 264, + PHP_JSON_T_EOI = 265, + PHP_JSON_T_ERROR = 266 + }; #endif /* Tokens. */ #define PHP_JSON_T_NUL 258 @@ -171,10 +168,10 @@ extern int php_json_yydebug; #define PHP_JSON_T_EOI 265 #define PHP_JSON_T_ERROR 266 - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE + +union YYSTYPE { @@ -185,29 +182,18 @@ typedef union YYSTYPE } pair; +}; -} YYSTYPE; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int php_json_yyparse (void *YYPARSE_PARAM); -#else -int php_json_yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus + int php_json_yyparse (php_json_parser *parser); -#else -int php_json_yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED */ +#endif /* !YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED */ /* Copy the second part of user declarations. */ @@ -232,7 +218,6 @@ void php_json_parser_array_append(zval *array, zval *zvalue); - #ifdef short # undef short #endif @@ -245,11 +230,8 @@ typedef unsigned char yytype_uint8; #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; #else -typedef short int yytype_int8; +typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 @@ -269,8 +251,7 @@ typedef short int yytype_int16; # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif ! defined YYSIZE_T # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else @@ -292,6 +273,33 @@ typedef short int yytype_int16; # endif #endif +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -299,24 +307,26 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -static int -YYID (yyi) - int yyi; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return yyi; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif + #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -334,8 +344,7 @@ YYID (yyi) # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS @@ -347,8 +356,8 @@ YYID (yyi) # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -364,7 +373,7 @@ YYID (yyi) # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@ -372,15 +381,13 @@ YYID (yyi) # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif @@ -390,7 +397,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc @@ -415,16 +422,16 @@ union yyalloc elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) #endif @@ -443,7 +450,7 @@ union yyalloc for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ - while (YYID (0)) + while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ @@ -459,17 +466,19 @@ union yyalloc #define YYNNTS 16 /* YYNRULES -- Number of rules. */ #define YYNRULES 36 -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES 45 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 266 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -502,31 +511,7 @@ static const yytype_uint8 yytranslate[] = }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 6, 9, 10, 15, 17, 19, 20, - 22, 24, 28, 31, 35, 38, 39, 44, 46, 48, - 49, 51, 53, 57, 60, 62, 64, 66, 68, 70, - 72, 74, 76, 78, 80, 82, 84 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 19, 0, -1, 32, 10, -1, 32, 33, -1, -1, - 12, 21, 23, 22, -1, 13, -1, 14, -1, -1, - 24, -1, 25, -1, 24, 15, 25, -1, 24, 33, - -1, 31, 16, 32, -1, 31, 33, -1, -1, 17, - 27, 29, 28, -1, 14, -1, 13, -1, -1, 30, - -1, 32, -1, 30, 15, 32, -1, 30, 33, -1, - 8, -1, 9, -1, 20, -1, 26, -1, 8, -1, - 9, -1, 6, -1, 7, -1, 3, -1, 4, -1, - 5, -1, 33, -1, 11, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 92, 92, 98, 105, 105, 113, 114, 123, 126, @@ -547,13 +532,13 @@ static const char *const yytname[] = "PHP_JSON_T_ERROR", "'{'", "'}'", "']'", "','", "':'", "'['", "$accept", "start", "object", "$@1", "object_end", "members", "member", "pair", "array", "$@2", "array_end", "elements", "element", "key", "value", - "errlex", YY_NULL + "errlex", YY_NULLPTR }; #endif # ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, @@ -561,46 +546,18 @@ static const yytype_uint16 yytoknum[] = }; # endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 18, 19, 19, 21, 20, 22, 22, 23, 23, - 24, 24, 24, 25, 25, 27, 26, 28, 28, 29, - 29, 30, 30, 30, 31, 31, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 33 -}; +#define YYPACT_NINF -18 -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 2, 2, 0, 4, 1, 1, 0, 1, - 1, 3, 2, 3, 2, 0, 4, 1, 1, 0, - 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1 -}; +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-18))) -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 32, 33, 34, 30, 31, 28, 29, 36, 4, - 15, 0, 26, 27, 0, 35, 8, 19, 1, 2, - 3, 24, 25, 0, 9, 10, 0, 0, 20, 21, - 6, 7, 5, 0, 12, 0, 14, 18, 17, 16, - 0, 23, 11, 13, 22 -}; +#define YYTABLE_NINF -1 -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 11, 12, 16, 32, 23, 24, 25, 13, 17, - 39, 27, 28, 26, 14, 15 -}; +#define yytable_value_is_error(Yytable_value) \ + 0 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -18 + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ static const yytype_int8 yypact[] = { -2, -18, -18, -18, -18, -18, -18, -18, -18, -18, @@ -610,17 +567,35 @@ static const yytype_int8 yypact[] = -2, -18, -18, -18, -18 }; -/* YYPGOTO[NTERM-NUM]. */ + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 32, 33, 34, 30, 31, 28, 29, 36, 4, + 15, 0, 26, 27, 0, 35, 8, 19, 1, 2, + 3, 24, 25, 0, 9, 10, 0, 0, 20, 21, + 6, 7, 5, 0, 12, 0, 14, 18, 17, 16, + 0, 23, 11, 13, 22 +}; + + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -18, -18, -18, -18, -18, -18, -18, -11, -18, -18, -18, -18, -18, -18, -17, 0 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 11, 12, 16, 32, 23, 24, 25, 13, 17, + 39, 27, 28, 26, 14, 15 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { 29, 1, 2, 3, 4, 5, 6, 7, 8, 8, @@ -629,12 +604,6 @@ static const yytype_uint8 yytable[] = 22, 30, 31, 37, 38 }; -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-18))) - -#define yytable_value_is_error(Yytable_value) \ - YYID (0) - static const yytype_int8 yycheck[] = { 17, 3, 4, 5, 6, 7, 8, 9, 11, 11, @@ -643,8 +612,8 @@ static const yytype_int8 yycheck[] = 9, 13, 14, 13, 14 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 11, 12, @@ -654,30 +623,34 @@ static const yytype_uint8 yystos[] = 15, 33, 25, 32, 32 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ - -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 18, 19, 19, 21, 20, 22, 22, 23, 23, + 24, 24, 24, 25, 25, 27, 26, 28, 28, 29, + 29, 30, 30, 30, 31, 31, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 33 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 2, 0, 4, 1, 1, 0, 1, + 1, 3, 2, 3, 2, 0, 4, 1, 1, 0, + 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1 +}; + + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + #define YYRECOVERING() (!!yyerrstatus) @@ -694,28 +667,16 @@ do \ else \ { \ yyerror (parser, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) + YYERROR; \ + } \ +while (0) /* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - +#define YYTERROR 1 +#define YYERRCODE 256 -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif -/* YYLEX -- calling `yylex' with the right arguments. */ -#ifdef YYLEX_PARAM -# define YYLEX yylex (&yylval, YYLEX_PARAM) -#else -# define YYLEX yylex (&yylval, parser) -#endif - /* Enable debugging if requested. */ #if YYDEBUG @@ -724,58 +685,47 @@ while (YYID (0)) # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, parser); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) +/* This macro is provided for backward compatibility. */ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, parser); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, php_json_parser *parser) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep, parser) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - php_json_parser *parser; -#endif { FILE *yyo = yyoutput; YYUSE (yyo); + YYUSE (parser); if (!yyvaluep) return; - YYUSE (parser); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); # endif - switch (yytype) - { - default: - break; - } + YYUSE (yytype); } @@ -783,23 +733,11 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, parser) | Print this symbol on YYOUTPUT. | `--------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, php_json_parser *parser) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep, parser) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - php_json_parser *parser; -#endif { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, parser); YYFPRINTF (yyoutput, ")"); @@ -810,16 +748,8 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, parser) | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@ -830,50 +760,42 @@ yy_stack_print (yybottom, yytop) YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule, php_json_parser *parser) -#else -static void -yy_reduce_print (yyvsp, yyrule, parser) - YYSTYPE *yyvsp; - int yyrule; - php_json_parser *parser; -#endif +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, php_json_parser *parser) { + unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , parser); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , parser); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule, parser); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, parser); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -887,7 +809,7 @@ int yydebug; /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -910,15 +832,8 @@ int yydebug; # define yystrlen strlen # else /* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) @@ -934,16 +849,8 @@ yystrlen (yystr) # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif { char *yyd = yydest; const char *yys = yysrc; @@ -973,27 +880,27 @@ yytnamerr (char *yyres, const char *yystr) char const *yyp = yystr; for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } do_not_strip_quotes: ; } @@ -1016,12 +923,11 @@ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULL; + const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -1029,10 +935,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, int yycount = 0; /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html> - for details. YYERROR is fine as it does not invoke this - function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected @@ -1081,11 +983,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, break; } yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } } } } @@ -1105,10 +1009,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, # undef YYCASE_ } - yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } if (*yymsg_alloc < yysize) { @@ -1145,133 +1051,143 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, php_json_parser *parser) -#else -static void -yydestruct (yymsg, yytype, yyvaluep, parser) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; - php_json_parser *parser; -#endif { YYUSE (yyvaluep); YYUSE (parser); - if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN switch (yytype) { - case 3: /* PHP_JSON_T_NUL */ + case 3: /* PHP_JSON_T_NUL */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 4: /* PHP_JSON_T_TRUE */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 5: /* PHP_JSON_T_FALSE */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 6: /* PHP_JSON_T_INT */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 7: /* PHP_JSON_T_DOUBLE */ + + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 4: /* PHP_JSON_T_TRUE */ + case 8: /* PHP_JSON_T_STRING */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } - break; - case 5: /* PHP_JSON_T_FALSE */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 9: /* PHP_JSON_T_ESTRING */ - break; - case 6: /* PHP_JSON_T_INT */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 7: /* PHP_JSON_T_DOUBLE */ + case 10: /* PHP_JSON_T_EOI */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } - break; - case 8: /* PHP_JSON_T_STRING */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 11: /* PHP_JSON_T_ERROR */ - break; - case 9: /* PHP_JSON_T_ESTRING */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 10: /* PHP_JSON_T_EOI */ + case 19: /* start */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } - break; - case 11: /* PHP_JSON_T_ERROR */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 20: /* object */ - break; - case 19: /* start */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 20: /* object */ + case 23: /* members */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } - break; - case 23: /* members */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 24: /* member */ - break; - case 24: /* member */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 25: /* pair */ + case 25: /* pair */ - { zend_string_release(((*yyvaluep).pair).key); zval_dtor(&((*yyvaluep).pair).val); }; + { zend_string_release(((*yyvaluep).pair).key); zval_dtor(&((*yyvaluep).pair).val); } - break; - case 26: /* array */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 26: /* array */ - break; - case 29: /* elements */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 30: /* element */ + case 29: /* elements */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } - break; - case 31: /* key */ + break; - { zval_dtor(&((*yyvaluep).value)); }; + case 30: /* element */ - break; - case 32: /* value */ + { zval_dtor(&((*yyvaluep).value)); } - { zval_dtor(&((*yyvaluep).value)); }; + break; - break; - case 33: /* errlex */ + case 31: /* key */ - { zval_dtor(&((*yyvaluep).value)); }; + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 32: /* value */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; + + case 33: /* errlex */ + + { zval_dtor(&((*yyvaluep).value)); } + + break; - break; default: - break; + break; } + YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -1281,56 +1197,18 @@ yydestruct (yymsg, yytype, yyvaluep, parser) | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (php_json_parser *parser) -#else -int -yyparse (parser) - php_json_parser *parser; -#endif -#endif { /* The lookahead symbol. */ int yychar; -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else +/* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ -static YYSTYPE yyval_default; -# define YY_INITIAL_VALUE(Value) = Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Number of syntax errors so far. */ int yynerrs; @@ -1340,8 +1218,8 @@ YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); int yyerrstatus; /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. + 'yyss': related to states. + 'yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ @@ -1409,23 +1287,23 @@ YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); #ifdef yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE @@ -1433,22 +1311,22 @@ YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ @@ -1457,10 +1335,10 @@ YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@ -1489,7 +1367,7 @@ yybackup: if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + yychar = yylex (&yylval, parser); } if (yychar <= YYEOF) @@ -1554,7 +1432,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1570,30 +1448,34 @@ yyreduce: case 2: { - ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[(1) - (2)].value)); - ZVAL_COPY_VALUE(parser->return_value, &(yyvsp[(1) - (2)].value)); - PHP_JSON_USE((yyvsp[(2) - (2)].value)); YYACCEPT; + ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[-1].value)); + ZVAL_COPY_VALUE(parser->return_value, &(yyvsp[-1].value)); + PHP_JSON_USE((yyvsp[0].value)); YYACCEPT; } + break; case 3: { - PHP_JSON_USE_2((yyval.value), (yyvsp[(1) - (2)].value), (yyvsp[(2) - (2)].value)); + PHP_JSON_USE_2((yyval.value), (yyvsp[-1].value), (yyvsp[0].value)); } + break; case 4: { PHP_JSON_DEPTH_INC; } + break; case 5: { PHP_JSON_DEPTH_DEC; - (yyval.value) = (yyvsp[(3) - (4)].value); + (yyval.value) = (yyvsp[-1].value); } + break; case 7: @@ -1602,6 +1484,7 @@ yyreduce: parser->scanner.errcode = PHP_JSON_ERROR_STATE_MISMATCH; YYERROR; } + break; case 8: @@ -1609,59 +1492,67 @@ yyreduce: { php_json_parser_object_init(parser, &(yyval.value)); } + break; case 10: { php_json_parser_object_init(parser, &(yyval.value)); - if (php_json_parser_object_update(parser, &(yyval.value), (yyvsp[(1) - (1)].pair).key, &(yyvsp[(1) - (1)].pair).val) == FAILURE) + if (php_json_parser_object_update(parser, &(yyval.value), (yyvsp[0].pair).key, &(yyvsp[0].pair).val) == FAILURE) YYERROR; } + break; case 11: { - if (php_json_parser_object_update(parser, &(yyvsp[(1) - (3)].value), (yyvsp[(3) - (3)].pair).key, &(yyvsp[(3) - (3)].pair).val) == FAILURE) + if (php_json_parser_object_update(parser, &(yyvsp[-2].value), (yyvsp[0].pair).key, &(yyvsp[0].pair).val) == FAILURE) YYERROR; - ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[(1) - (3)].value)); + ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[-2].value)); } + break; case 12: { - PHP_JSON_USE_2((yyval.value), (yyvsp[(1) - (2)].value), (yyvsp[(2) - (2)].value)); + PHP_JSON_USE_2((yyval.value), (yyvsp[-1].value), (yyvsp[0].value)); } + break; case 13: { - (yyval.pair).key = Z_STR((yyvsp[(1) - (3)].value)); - ZVAL_COPY_VALUE(&(yyval.pair).val, &(yyvsp[(3) - (3)].value)); + (yyval.pair).key = Z_STR((yyvsp[-2].value)); + ZVAL_COPY_VALUE(&(yyval.pair).val, &(yyvsp[0].value)); } + break; case 14: { - PHP_JSON_USE_2((yyval.pair), (yyvsp[(1) - (2)].value), (yyvsp[(2) - (2)].value)); + PHP_JSON_USE_2((yyval.pair), (yyvsp[-1].value), (yyvsp[0].value)); } + break; case 15: { PHP_JSON_DEPTH_INC; } + break; case 16: { PHP_JSON_DEPTH_DEC; - ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[(3) - (4)].value)); + ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[-1].value)); } + break; case 18: @@ -1670,6 +1561,7 @@ yyreduce: parser->scanner.errcode = PHP_JSON_ERROR_STATE_MISMATCH; YYERROR; } + break; case 19: @@ -1677,37 +1569,42 @@ yyreduce: { php_json_parser_array_init(&(yyval.value)); } + break; case 21: { php_json_parser_array_init(&(yyval.value)); - php_json_parser_array_append(&(yyval.value), &(yyvsp[(1) - (1)].value)); + php_json_parser_array_append(&(yyval.value), &(yyvsp[0].value)); } + break; case 22: { - php_json_parser_array_append(&(yyvsp[(1) - (3)].value), &(yyvsp[(3) - (3)].value)); - ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[(1) - (3)].value)); + php_json_parser_array_append(&(yyvsp[-2].value), &(yyvsp[0].value)); + ZVAL_COPY_VALUE(&(yyval.value), &(yyvsp[-2].value)); } + break; case 23: { - PHP_JSON_USE_2((yyval.value), (yyvsp[(1) - (2)].value), (yyvsp[(2) - (2)].value)); + PHP_JSON_USE_2((yyval.value), (yyvsp[-1].value), (yyvsp[0].value)); } + break; case 36: { - PHP_JSON_USE_1((yyval.value), (yyvsp[(1) - (1)].value)); + PHP_JSON_USE_1((yyval.value), (yyvsp[0].value)); YYERROR; } + break; @@ -1733,7 +1630,7 @@ yyreduce: *++yyvsp = yyval; - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ @@ -1748,9 +1645,9 @@ yyreduce: goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ @@ -1801,20 +1698,20 @@ yyerrlab: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval, parser); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval, parser); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@ -1833,7 +1730,7 @@ yyerrorlab: if (/*CONSTCOND*/ 0) goto yyerrorlab; - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -1846,29 +1743,29 @@ yyerrorlab: | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp, parser); + yystos[yystate], yyvsp, parser); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -1919,14 +1816,14 @@ yyreturn: yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, parser); } - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, parser); + yystos[*yyssp], yyvsp, parser); YYPOPSTACK (1); } #ifndef yyoverflow @@ -1937,12 +1834,9 @@ yyreturn: if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif - /* Make sure YYID is used. */ - return YYID (yyresult); + return yyresult; } - - /* Functions */ void php_json_parser_init(php_json_parser *parser, zval *return_value, char *str, size_t str_len, int options, int max_depth) diff --git a/ext/json/json_parser.tab.h b/ext/json/json_parser.tab.h index 20651ce8fb..56bc2c40c9 100644 --- a/ext/json/json_parser.tab.h +++ b/ext/json/json_parser.tab.h @@ -1,19 +1,19 @@ -/* A Bison parser, made by GNU Bison 2.6.5. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -26,13 +26,13 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED -# define YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED -/* Enabling traces. */ +#ifndef YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED +# define YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -40,22 +40,21 @@ extern int php_json_yydebug; #endif -/* Tokens. */ +/* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - PHP_JSON_T_NUL = 258, - PHP_JSON_T_TRUE = 259, - PHP_JSON_T_FALSE = 260, - PHP_JSON_T_INT = 261, - PHP_JSON_T_DOUBLE = 262, - PHP_JSON_T_STRING = 263, - PHP_JSON_T_ESTRING = 264, - PHP_JSON_T_EOI = 265, - PHP_JSON_T_ERROR = 266 - }; + enum yytokentype + { + PHP_JSON_T_NUL = 258, + PHP_JSON_T_TRUE = 259, + PHP_JSON_T_FALSE = 260, + PHP_JSON_T_INT = 261, + PHP_JSON_T_DOUBLE = 262, + PHP_JSON_T_STRING = 263, + PHP_JSON_T_ESTRING = 264, + PHP_JSON_T_EOI = 265, + PHP_JSON_T_ERROR = 266 + }; #endif /* Tokens. */ #define PHP_JSON_T_NUL 258 @@ -68,10 +67,10 @@ extern int php_json_yydebug; #define PHP_JSON_T_EOI 265 #define PHP_JSON_T_ERROR 266 - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE + +union YYSTYPE { @@ -82,26 +81,15 @@ typedef union YYSTYPE } pair; +}; -} YYSTYPE; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int php_json_yyparse (void *YYPARSE_PARAM); -#else -int php_json_yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus + int php_json_yyparse (php_json_parser *parser); -#else -int php_json_yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_PHP_JSON_YY_HOME_DMITRY_PHP_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED */ +#endif /* !YY_PHP_JSON_YY_HOME_JAKUB_PROG_PHP_MASTER_EXT_JSON_JSON_PARSER_TAB_H_INCLUDED */ diff --git a/ext/json/json_scanner.c b/ext/json/json_scanner.c index 7e8ee8b933..8c7cad7c64 100644 --- a/ext/json/json_scanner.c +++ b/ext/json/json_scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 */ +/* Generated by re2c 0.14.3 */ /* +----------------------------------------------------------------------+ | PHP Version 7 | @@ -147,47 +147,46 @@ yyc_JS: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - yych = *YYCURSOR; if (yych <= ']') { if (yych <= '"') { if (yych <= '\f') { if (yych <= 0x08) { - if (yych >= 0x01) goto yy4; + if (yych >= 0x01) goto yy5; } else { - if (yych <= '\t') goto yy6; - if (yych <= '\n') goto yy8; - goto yy4; + if (yych <= '\t') goto yy7; + if (yych <= '\n') goto yy9; + goto yy5; } } else { if (yych <= 0x1F) { - if (yych <= '\r') goto yy9; - goto yy4; + if (yych <= '\r') goto yy10; + goto yy5; } else { - if (yych <= ' ') goto yy10; - if (yych <= '!') goto yy11; - goto yy13; + if (yych <= ' ') goto yy11; + if (yych <= '!') goto yy12; + goto yy14; } } } else { if (yych <= '0') { if (yych <= ',') { - if (yych <= '+') goto yy11; - goto yy15; + if (yych <= '+') goto yy12; + goto yy16; } else { - if (yych <= '-') goto yy17; - if (yych <= '/') goto yy11; - goto yy18; + if (yych <= '-') goto yy18; + if (yych <= '/') goto yy12; + goto yy19; } } else { if (yych <= 'Z') { - if (yych <= '9') goto yy20; - if (yych <= ':') goto yy21; - goto yy11; + if (yych <= '9') goto yy21; + if (yych <= ':') goto yy22; + goto yy12; } else { - if (yych <= '[') goto yy23; - if (yych <= '\\') goto yy11; - goto yy25; + if (yych <= '[') goto yy24; + if (yych <= '\\') goto yy12; + goto yy26; } } } @@ -195,41 +194,41 @@ yyc_JS: if (yych <= '}') { if (yych <= 's') { if (yych <= 'f') { - if (yych <= 'e') goto yy11; - goto yy27; + if (yych <= 'e') goto yy12; + goto yy28; } else { - if (yych == 'n') goto yy28; - goto yy11; + if (yych == 'n') goto yy29; + goto yy12; } } else { if (yych <= 'z') { - if (yych <= 't') goto yy29; - goto yy11; + if (yych <= 't') goto yy30; + goto yy12; } else { - if (yych <= '{') goto yy30; - if (yych <= '|') goto yy11; - goto yy32; + if (yych <= '{') goto yy31; + if (yych <= '|') goto yy12; + goto yy33; } } } else { if (yych <= 0xEC) { if (yych <= 0xC1) { - if (yych <= 0x7F) goto yy11; - goto yy34; + if (yych <= 0x7F) goto yy12; + goto yy35; } else { - if (yych <= 0xDF) goto yy36; - if (yych <= 0xE0) goto yy37; - goto yy38; + if (yych <= 0xDF) goto yy37; + if (yych <= 0xE0) goto yy38; + goto yy39; } } else { if (yych <= 0xF0) { - if (yych <= 0xED) goto yy39; - if (yych <= 0xEF) goto yy40; - goto yy41; + if (yych <= 0xED) goto yy40; + if (yych <= 0xEF) goto yy41; + goto yy42; } else { - if (yych <= 0xF3) goto yy42; - if (yych <= 0xF4) goto yy43; - goto yy34; + if (yych <= 0xF3) goto yy43; + if (yych <= 0xF4) goto yy44; + goto yy35; } } } @@ -243,36 +242,36 @@ yyc_JS: return PHP_JSON_T_ERROR; } } -yy4: +yy5: ++YYCURSOR; { s->errcode = PHP_JSON_ERROR_CTRL_CHAR; return PHP_JSON_T_ERROR; } -yy6: +yy7: ++YYCURSOR; yych = *YYCURSOR; - goto yy81; -yy7: - { goto std; } + goto yy82; yy8: - yych = *++YYCURSOR; - goto yy7; + { goto std; } yy9: yych = *++YYCURSOR; - if (yych == '\n') goto yy82; - goto yy81; + goto yy8; yy10: yych = *++YYCURSOR; - goto yy81; + if (yych == '\n') goto yy83; + goto yy82; yy11: - ++YYCURSOR; + yych = *++YYCURSOR; + goto yy82; yy12: + ++YYCURSOR; +yy13: { s->errcode = PHP_JSON_ERROR_SYNTAX; return PHP_JSON_T_ERROR; } -yy13: +yy14: ++YYCURSOR; { s->str_start = s->cursor; @@ -280,25 +279,25 @@ yy13: PHP_JSON_CONDITION_SET(STR_P1); PHP_JSON_CONDITION_GOTO(STR_P1); } -yy15: +yy16: ++YYCURSOR; { return ','; } -yy17: - yych = *++YYCURSOR; - if (yych <= '/') goto yy12; - if (yych <= '0') goto yy79; - if (yych <= '9') goto yy69; - goto yy12; yy18: + yych = *++YYCURSOR; + if (yych <= '/') goto yy13; + if (yych <= '0') goto yy80; + if (yych <= '9') goto yy70; + goto yy13; +yy19: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { - if (yych == '.') goto yy71; + if (yych == '.') goto yy72; } else { - if (yych <= 'E') goto yy72; - if (yych == 'e') goto yy72; + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; } -yy19: +yy20: { zend_bool bigint = 0, negative = s->token[0] == '-'; size_t digits = (size_t) (s->cursor - s->token - negative); @@ -323,305 +322,305 @@ yy19: return PHP_JSON_T_DOUBLE; } } -yy20: +yy21: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - goto yy70; -yy21: + goto yy71; +yy22: ++YYCURSOR; { return ':'; } -yy23: +yy24: ++YYCURSOR; { return '['; } -yy25: +yy26: ++YYCURSOR; { return ']'; } -yy27: - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'a') goto yy64; - goto yy12; yy28: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'u') goto yy60; - goto yy12; + if (yych == 'a') goto yy65; + goto yy13; yy29: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'r') goto yy56; - goto yy12; + if (yych == 'u') goto yy61; + goto yy13; yy30: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'r') goto yy57; + goto yy13; +yy31: ++YYCURSOR; { return '{'; } -yy32: +yy33: ++YYCURSOR; { return '}'; } -yy34: - ++YYCURSOR; yy35: + ++YYCURSOR; +yy36: { s->errcode = PHP_JSON_ERROR_UTF8; return PHP_JSON_T_ERROR; } -yy36: - yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy35; - if (yych <= 0xBF) goto yy47; - goto yy35; yy37: - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x9F) goto yy35; - if (yych <= 0xBF) goto yy55; - goto yy35; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy48; + goto yy36; yy38: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy35; - if (yych <= 0xBF) goto yy54; - goto yy35; + if (yych <= 0x9F) goto yy36; + if (yych <= 0xBF) goto yy56; + goto yy36; yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy35; - if (yych <= 0x9F) goto yy53; - goto yy35; + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy55; + goto yy36; yy40: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy35; - if (yych <= 0xBF) goto yy52; - goto yy35; + if (yych <= 0x7F) goto yy36; + if (yych <= 0x9F) goto yy54; + goto yy36; yy41: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x8F) goto yy35; - if (yych <= 0xBF) goto yy50; - goto yy35; + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy53; + goto yy36; yy42: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy35; - if (yych <= 0xBF) goto yy48; - goto yy35; + if (yych <= 0x8F) goto yy36; + if (yych <= 0xBF) goto yy51; + goto yy36; yy43: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy35; - if (yych >= 0x90) goto yy35; + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy49; + goto yy36; +yy44: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych >= 0x90) goto yy36; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy46; -yy45: + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy47; +yy46: YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy19; + if (yyaccept == 0) { + goto yy20; } else { - goto yy12; + goto yy13; } } else { - if (yyaccept <= 2) { - goto yy35; + if (yyaccept == 2) { + goto yy36; } else { - goto yy76; + goto yy77; } } -yy46: - yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych >= 0xC0) goto yy45; yy47: yych = *++YYCURSOR; - goto yy12; + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; yy48: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych >= 0xC0) goto yy45; + goto yy13; +yy49: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; -yy50: + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych >= 0xC0) goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy51: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; -yy52: + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; yy53: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; yy54: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; yy55: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy45; - if (yych <= 0xBF) goto yy47; - goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; yy56: yych = *++YYCURSOR; - if (yych != 'u') goto yy45; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy57: yych = *++YYCURSOR; - if (yych != 'e') goto yy45; + if (yych != 'u') goto yy46; + yych = *++YYCURSOR; + if (yych != 'e') goto yy46; ++YYCURSOR; { ZVAL_TRUE(&s->value); return PHP_JSON_T_TRUE; } -yy60: +yy61: yych = *++YYCURSOR; - if (yych != 'l') goto yy45; + if (yych != 'l') goto yy46; yych = *++YYCURSOR; - if (yych != 'l') goto yy45; + if (yych != 'l') goto yy46; ++YYCURSOR; { ZVAL_NULL(&s->value); return PHP_JSON_T_NUL; } -yy64: +yy65: yych = *++YYCURSOR; - if (yych != 'l') goto yy45; + if (yych != 'l') goto yy46; yych = *++YYCURSOR; - if (yych != 's') goto yy45; + if (yych != 's') goto yy46; yych = *++YYCURSOR; - if (yych != 'e') goto yy45; + if (yych != 'e') goto yy46; ++YYCURSOR; { ZVAL_FALSE(&s->value); return PHP_JSON_T_FALSE; } -yy69: +yy70: yyaccept = 0; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy70: +yy71: if (yybm[0+yych] & 64) { - goto yy69; + goto yy70; } if (yych <= 'D') { - if (yych != '.') goto yy19; + if (yych != '.') goto yy20; } else { - if (yych <= 'E') goto yy72; - if (yych == 'e') goto yy72; - goto yy19; + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy20; } -yy71: - yych = *++YYCURSOR; - if (yych <= '/') goto yy45; - if (yych <= '9') goto yy77; - goto yy45; yy72: yych = *++YYCURSOR; + if (yych <= '/') goto yy46; + if (yych <= '9') goto yy78; + goto yy46; +yy73: + yych = *++YYCURSOR; if (yych <= ',') { - if (yych != '+') goto yy45; + if (yych != '+') goto yy46; } else { - if (yych <= '-') goto yy73; - if (yych <= '/') goto yy45; - if (yych <= '9') goto yy74; - goto yy45; + if (yych <= '-') goto yy74; + if (yych <= '/') goto yy46; + if (yych <= '9') goto yy75; + goto yy46; } -yy73: - yych = *++YYCURSOR; - if (yych <= '/') goto yy45; - if (yych >= ':') goto yy45; yy74: + yych = *++YYCURSOR; + if (yych <= '/') goto yy46; + if (yych >= ':') goto yy46; +yy75: ++YYCURSOR; yych = *YYCURSOR; - if (yych <= '/') goto yy76; - if (yych <= '9') goto yy74; -yy76: + if (yych <= '/') goto yy77; + if (yych <= '9') goto yy75; +yy77: { ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL)); return PHP_JSON_T_DOUBLE; } -yy77: +yy78: yyaccept = 3; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; if (yych <= 'D') { - if (yych <= '/') goto yy76; - if (yych <= '9') goto yy77; - goto yy76; + if (yych <= '/') goto yy77; + if (yych <= '9') goto yy78; + goto yy77; } else { - if (yych <= 'E') goto yy72; - if (yych == 'e') goto yy72; - goto yy76; + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy77; } -yy79: +yy80: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { - if (yych == '.') goto yy71; - goto yy19; + if (yych == '.') goto yy72; + goto yy20; } else { - if (yych <= 'E') goto yy72; - if (yych == 'e') goto yy72; - goto yy19; + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy20; } -yy80: +yy81: ++YYCURSOR; yych = *YYCURSOR; -yy81: +yy82: if (yybm[0+yych] & 128) { - goto yy80; + goto yy81; } - goto yy7; -yy82: + goto yy8; +yy83: ++YYCURSOR; yych = *YYCURSOR; - goto yy7; + goto yy8; } /* *********************************** */ yyc_STR_P1: yych = *YYCURSOR; if (yych <= 0xDF) { if (yych <= '[') { - if (yych <= 0x1F) goto yy85; - if (yych == '"') goto yy89; - goto yy87; + if (yych <= 0x1F) goto yy86; + if (yych == '"') goto yy90; + goto yy88; } else { - if (yych <= '\\') goto yy91; - if (yych <= 0x7F) goto yy87; - if (yych <= 0xC1) goto yy93; - goto yy95; + if (yych <= '\\') goto yy92; + if (yych <= 0x7F) goto yy88; + if (yych <= 0xC1) goto yy94; + goto yy96; } } else { if (yych <= 0xEF) { - if (yych <= 0xE0) goto yy96; - if (yych <= 0xEC) goto yy97; - if (yych <= 0xED) goto yy98; - goto yy99; + if (yych <= 0xE0) goto yy97; + if (yych <= 0xEC) goto yy98; + if (yych <= 0xED) goto yy99; + goto yy100; } else { - if (yych <= 0xF0) goto yy100; - if (yych <= 0xF3) goto yy101; - if (yych <= 0xF4) goto yy102; - goto yy93; + if (yych <= 0xF0) goto yy101; + if (yych <= 0xF3) goto yy102; + if (yych <= 0xF4) goto yy103; + goto yy94; } } -yy85: +yy86: ++YYCURSOR; { s->errcode = PHP_JSON_ERROR_CTRL_CHAR; return PHP_JSON_T_ERROR; } -yy87: - ++YYCURSOR; yy88: - { PHP_JSON_CONDITION_GOTO(STR_P1); } + ++YYCURSOR; yy89: + { PHP_JSON_CONDITION_GOTO(STR_P1); } +yy90: ++YYCURSOR; { zend_string *str; @@ -645,392 +644,392 @@ yy89: return PHP_JSON_T_STRING; } } -yy91: +yy92: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'e') { if (yych <= '/') { - if (yych == '"') goto yy115; - if (yych >= '/') goto yy115; + if (yych == '"') goto yy116; + if (yych >= '/') goto yy116; } else { if (yych <= '\\') { - if (yych >= '\\') goto yy115; + if (yych >= '\\') goto yy116; } else { - if (yych == 'b') goto yy115; + if (yych == 'b') goto yy116; } } } else { if (yych <= 'q') { - if (yych <= 'f') goto yy115; - if (yych == 'n') goto yy115; + if (yych <= 'f') goto yy116; + if (yych == 'n') goto yy116; } else { if (yych <= 's') { - if (yych <= 'r') goto yy115; + if (yych <= 'r') goto yy116; } else { - if (yych <= 't') goto yy115; - if (yych <= 'u') goto yy117; + if (yych <= 't') goto yy116; + if (yych <= 'u') goto yy118; } } } -yy92: +yy93: { s->errcode = PHP_JSON_ERROR_SYNTAX; return PHP_JSON_T_ERROR; } -yy93: - ++YYCURSOR; yy94: + ++YYCURSOR; +yy95: { s->errcode = PHP_JSON_ERROR_UTF8; return PHP_JSON_T_ERROR; } -yy95: - yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy94; - if (yych <= 0xBF) goto yy106; - goto yy94; yy96: - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x9F) goto yy94; - if (yych <= 0xBF) goto yy114; - goto yy94; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy107; + goto yy95; yy97: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy94; - if (yych <= 0xBF) goto yy113; - goto yy94; + if (yych <= 0x9F) goto yy95; + if (yych <= 0xBF) goto yy115; + goto yy95; yy98: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy94; - if (yych <= 0x9F) goto yy112; - goto yy94; + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy114; + goto yy95; yy99: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy94; - if (yych <= 0xBF) goto yy111; - goto yy94; + if (yych <= 0x7F) goto yy95; + if (yych <= 0x9F) goto yy113; + goto yy95; yy100: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x8F) goto yy94; - if (yych <= 0xBF) goto yy109; - goto yy94; + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy112; + goto yy95; yy101: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy94; - if (yych <= 0xBF) goto yy107; - goto yy94; + if (yych <= 0x8F) goto yy95; + if (yych <= 0xBF) goto yy110; + goto yy95; yy102: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x7F) goto yy94; - if (yych >= 0x90) goto yy94; + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy108; + goto yy95; +yy103: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych >= 0x90) goto yy95; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy105; -yy104: + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy106; +yy105: YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy92; + if (yyaccept == 0) { + goto yy93; } else { - goto yy94; + goto yy95; } } else { - goto yy126; + goto yy127; } -yy105: - yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych >= 0xC0) goto yy104; yy106: yych = *++YYCURSOR; - goto yy88; + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; yy107: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych >= 0xC0) goto yy104; + goto yy89; +yy108: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; -yy109: + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych >= 0xC0) goto yy104; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy110: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; -yy111: + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; yy112: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; yy113: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; yy114: yych = *++YYCURSOR; - if (yych <= 0x7F) goto yy104; - if (yych <= 0xBF) goto yy106; - goto yy104; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; yy115: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy116: ++YYCURSOR; { s->str_esc++; PHP_JSON_CONDITION_GOTO(STR_P1); } -yy117: +yy118: yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= '9') { - if (yych <= '/') goto yy104; - if (yych >= '1') goto yy119; + if (yych <= '/') goto yy105; + if (yych >= '1') goto yy120; } else { - if (yych <= '@') goto yy104; - if (yych <= 'C') goto yy119; - goto yy120; + if (yych <= '@') goto yy105; + if (yych <= 'C') goto yy120; + goto yy121; } } else { if (yych <= 'c') { - if (yych <= 'F') goto yy119; - if (yych <= '`') goto yy104; - goto yy119; + if (yych <= 'F') goto yy120; + if (yych <= '`') goto yy105; + goto yy120; } else { - if (yych <= 'd') goto yy120; - if (yych <= 'f') goto yy119; - goto yy104; + if (yych <= 'd') goto yy121; + if (yych <= 'f') goto yy120; + goto yy105; } } yych = *++YYCURSOR; if (yych <= '9') { - if (yych <= '/') goto yy104; - if (yych <= '0') goto yy139; - if (yych <= '7') goto yy140; - goto yy121; + if (yych <= '/') goto yy105; + if (yych <= '0') goto yy140; + if (yych <= '7') goto yy141; + goto yy122; } else { if (yych <= 'F') { - if (yych <= '@') goto yy104; - goto yy121; + if (yych <= '@') goto yy105; + goto yy122; } else { - if (yych <= '`') goto yy104; - if (yych <= 'f') goto yy121; - goto yy104; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy122; + goto yy105; } } -yy119: +yy120: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy121; - goto yy104; + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy122; + goto yy105; } else { - if (yych <= 'F') goto yy121; - if (yych <= '`') goto yy104; - if (yych <= 'f') goto yy121; - goto yy104; + if (yych <= 'F') goto yy122; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy122; + goto yy105; } -yy120: +yy121: yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= '7') { - if (yych <= '/') goto yy104; + if (yych <= '/') goto yy105; } else { - if (yych <= '9') goto yy122; - if (yych <= '@') goto yy104; - goto yy122; + if (yych <= '9') goto yy123; + if (yych <= '@') goto yy105; + goto yy123; } } else { if (yych <= '`') { - if (yych <= 'F') goto yy123; - goto yy104; + if (yych <= 'F') goto yy124; + goto yy105; } else { - if (yych <= 'b') goto yy122; - if (yych <= 'f') goto yy123; - goto yy104; + if (yych <= 'b') goto yy123; + if (yych <= 'f') goto yy124; + goto yy105; } } -yy121: - yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy136; - goto yy104; - } else { - if (yych <= 'F') goto yy136; - if (yych <= '`') goto yy104; - if (yych <= 'f') goto yy136; - goto yy104; - } yy122: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy127; - goto yy104; + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy137; + goto yy105; } else { - if (yych <= 'F') goto yy127; - if (yych <= '`') goto yy104; - if (yych <= 'f') goto yy127; - goto yy104; + if (yych <= 'F') goto yy137; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy137; + goto yy105; } yy123: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy128; + goto yy105; } else { - if (yych <= 'F') goto yy124; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= 'F') goto yy128; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy128; + goto yy105; } yy124: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { if (yych <= 'F') goto yy125; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } yy125: - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy126; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } yy126: + ++YYCURSOR; +yy127: { s->errcode = PHP_JSON_ERROR_UTF16; return PHP_JSON_T_ERROR; } -yy127: +yy128: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { - if (yych <= 'F') goto yy128; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= 'F') goto yy129; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } -yy128: +yy129: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if (yych != '\\') goto yy126; - yych = *++YYCURSOR; - if (yych != 'u') goto yy104; + if (yych != '\\') goto yy127; yych = *++YYCURSOR; - if (yych == 'D') goto yy131; - if (yych != 'd') goto yy104; -yy131: + if (yych != 'u') goto yy105; yych = *++YYCURSOR; - if (yych <= 'B') goto yy104; - if (yych <= 'F') goto yy132; - if (yych <= 'b') goto yy104; - if (yych >= 'g') goto yy104; + if (yych == 'D') goto yy132; + if (yych != 'd') goto yy105; yy132: yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; - } else { - if (yych <= 'F') goto yy133; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; - } + if (yych <= 'B') goto yy105; + if (yych <= 'F') goto yy133; + if (yych <= 'b') goto yy105; + if (yych >= 'g') goto yy105; yy133: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { if (yych <= 'F') goto yy134; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } yy134: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy135; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy135: ++YYCURSOR; { s->str_esc += 8; PHP_JSON_CONDITION_GOTO(STR_P1); } -yy136: +yy137: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { - if (yych <= 'F') goto yy137; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= 'F') goto yy138; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } -yy137: +yy138: ++YYCURSOR; { s->str_esc += 3; PHP_JSON_CONDITION_GOTO(STR_P1); } -yy139: - yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych <= '7') goto yy144; - if (yych <= '9') goto yy141; - goto yy104; - } else { - if (yych <= 'F') goto yy141; - if (yych <= '`') goto yy104; - if (yych <= 'f') goto yy141; - goto yy104; - } yy140: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych <= '7') goto yy145; + if (yych <= '9') goto yy142; + goto yy105; } else { - if (yych <= 'F') goto yy141; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= 'F') goto yy142; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy142; + goto yy105; } yy141: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { if (yych <= 'F') goto yy142; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } yy142: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy143; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy143: ++YYCURSOR; { s->str_esc += 4; PHP_JSON_CONDITION_GOTO(STR_P1); } -yy144: +yy145: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy104; - if (yych >= ':') goto yy104; + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; } else { - if (yych <= 'F') goto yy145; - if (yych <= '`') goto yy104; - if (yych >= 'g') goto yy104; + if (yych <= 'F') goto yy146; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; } -yy145: +yy146: ++YYCURSOR; { s->str_esc += 5; @@ -1039,22 +1038,22 @@ yy145: /* *********************************** */ yyc_STR_P2: yych = *YYCURSOR; - if (yych == '"') goto yy151; - if (yych == '\\') goto yy153; + if (yych == '"') goto yy152; + if (yych == '\\') goto yy154; ++YYCURSOR; { PHP_JSON_CONDITION_GOTO(STR_P2); } -yy151: +yy152: ++YYCURSOR; YYSETCONDITION(yycJS); { PHP_JSON_SCANNER_COPY_ESC(); return PHP_JSON_T_STRING; } -yy153: +yy154: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'u') goto yy155; -yy154: + if (yych == 'u') goto yy156; +yy155: { char esc; PHP_JSON_SCANNER_COPY_ESC(); @@ -1088,103 +1087,103 @@ yy154: s->str_start = s->cursor; PHP_JSON_CONDITION_GOTO(STR_P2); } -yy155: +yy156: yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= '9') { - if (yych <= '/') goto yy156; - if (yych <= '0') goto yy157; - goto yy158; - } else { - if (yych <= '@') goto yy156; - if (yych <= 'C') goto yy158; + if (yych <= '/') goto yy157; + if (yych <= '0') goto yy158; goto yy159; + } else { + if (yych <= '@') goto yy157; + if (yych <= 'C') goto yy159; + goto yy160; } } else { if (yych <= 'c') { - if (yych <= 'F') goto yy158; - if (yych >= 'a') goto yy158; + if (yych <= 'F') goto yy159; + if (yych >= 'a') goto yy159; } else { - if (yych <= 'd') goto yy159; - if (yych <= 'f') goto yy158; + if (yych <= 'd') goto yy160; + if (yych <= 'f') goto yy159; } } -yy156: - YYCURSOR = YYMARKER; - goto yy154; yy157: + YYCURSOR = YYMARKER; + goto yy155; +yy158: yych = *++YYCURSOR; if (yych <= '9') { - if (yych <= '/') goto yy156; - if (yych <= '0') goto yy174; - if (yych <= '7') goto yy175; - goto yy161; + if (yych <= '/') goto yy157; + if (yych <= '0') goto yy175; + if (yych <= '7') goto yy176; + goto yy162; } else { if (yych <= 'F') { - if (yych <= '@') goto yy156; - goto yy161; + if (yych <= '@') goto yy157; + goto yy162; } else { - if (yych <= '`') goto yy156; - if (yych <= 'f') goto yy161; - goto yy156; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy162; + goto yy157; } } -yy158: - yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych <= '9') goto yy161; - goto yy156; - } else { - if (yych <= 'F') goto yy161; - if (yych <= '`') goto yy156; - if (yych <= 'f') goto yy161; - goto yy156; - } yy159: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych <= '7') goto yy161; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych <= '9') goto yy162; + goto yy157; } else { - if (yych <= 'B') goto yy160; - if (yych <= '`') goto yy156; - if (yych >= 'c') goto yy156; + if (yych <= 'F') goto yy162; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy162; + goto yy157; } yy160: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych <= '9') goto yy165; - goto yy156; + if (yych <= '/') goto yy157; + if (yych <= '7') goto yy162; + if (yych >= ':') goto yy157; } else { - if (yych <= 'F') goto yy165; - if (yych <= '`') goto yy156; - if (yych <= 'f') goto yy165; - goto yy156; + if (yych <= 'B') goto yy161; + if (yych <= '`') goto yy157; + if (yych >= 'c') goto yy157; } yy161: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych <= '9') goto yy166; + goto yy157; } else { - if (yych <= 'F') goto yy162; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= 'F') goto yy166; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy166; + goto yy157; } yy162: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; } else { if (yych <= 'F') goto yy163; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; } yy163: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy164; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy164: ++YYCURSOR; { int utf16 = php_json_ucs2_to_int(s, 4); @@ -1195,51 +1194,51 @@ yy163: s->str_start = s->cursor; PHP_JSON_CONDITION_GOTO(STR_P2); } -yy165: +yy166: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; } else { - if (yych <= 'F') goto yy166; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= 'F') goto yy167; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; } -yy166: +yy167: yych = *++YYCURSOR; - if (yych != '\\') goto yy156; + if (yych != '\\') goto yy157; yych = *++YYCURSOR; - if (yych != 'u') goto yy156; + if (yych != 'u') goto yy157; yych = *++YYCURSOR; - if (yych == 'D') goto yy169; - if (yych != 'd') goto yy156; -yy169: - yych = *++YYCURSOR; - if (yych <= 'B') goto yy156; - if (yych <= 'F') goto yy170; - if (yych <= 'b') goto yy156; - if (yych >= 'g') goto yy156; + if (yych == 'D') goto yy170; + if (yych != 'd') goto yy157; yy170: yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; - } else { - if (yych <= 'F') goto yy171; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; - } + if (yych <= 'B') goto yy157; + if (yych <= 'F') goto yy171; + if (yych <= 'b') goto yy157; + if (yych >= 'g') goto yy157; yy171: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; } else { if (yych <= 'F') goto yy172; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; } yy172: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy173; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy173: ++YYCURSOR; { int utf32, utf16_hi, utf16_lo; @@ -1254,40 +1253,40 @@ yy172: s->str_start = s->cursor; PHP_JSON_CONDITION_GOTO(STR_P2); } -yy174: - yych = *++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych <= '7') goto yy179; - if (yych <= '9') goto yy176; - goto yy156; - } else { - if (yych <= 'F') goto yy176; - if (yych <= '`') goto yy156; - if (yych <= 'f') goto yy176; - goto yy156; - } yy175: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych <= '7') goto yy180; + if (yych <= '9') goto yy177; + goto yy157; } else { - if (yych <= 'F') goto yy176; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= 'F') goto yy177; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy177; + goto yy157; } yy176: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; } else { if (yych <= 'F') goto yy177; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; } yy177: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy178; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy178: ++YYCURSOR; { int utf16 = php_json_ucs2_to_int(s, 3); @@ -1297,17 +1296,17 @@ yy177: s->str_start = s->cursor; PHP_JSON_CONDITION_GOTO(STR_P2); } -yy179: +yy180: yych = *++YYCURSOR; if (yych <= '@') { - if (yych <= '/') goto yy156; - if (yych >= ':') goto yy156; + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; } else { - if (yych <= 'F') goto yy180; - if (yych <= '`') goto yy156; - if (yych >= 'g') goto yy156; + if (yych <= 'F') goto yy181; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; } -yy180: +yy181: ++YYCURSOR; { int utf16 = php_json_ucs2_to_int(s, 2); diff --git a/ext/json/php_json_scanner_defs.h b/ext/json/php_json_scanner_defs.h index b3867433a7..a75e766a65 100644 --- a/ext/json/php_json_scanner_defs.h +++ b/ext/json/php_json_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 */ +/* Generated by re2c 0.14.3 */ enum YYCONDTYPE { yycJS, diff --git a/ext/json/tests/json_last_error_error.phpt b/ext/json/tests/json_last_error_error.phpt new file mode 100644 index 0000000000..bb00388a2e --- /dev/null +++ b/ext/json/tests/json_last_error_error.phpt @@ -0,0 +1,22 @@ +--TEST-- +json_last_error() failures +--SKIPIF-- +<?php !extension_loaded('json') && die('skip json extension not available') ?> +--FILE-- +<?php + +var_dump(json_last_error()); +var_dump(json_last_error(TRUE)); +var_dump(json_last_error('some', 4, 'args', 'here')); + + +?> +--EXPECTF-- +int(0) + +Warning: json_last_error() expects exactly 0 parameters, 1 given in %s on line %d +NULL + +Warning: json_last_error() expects exactly 0 parameters, 4 given in %s on line %d +NULL + diff --git a/ext/json/tests/json_last_error_msg_error.phpt b/ext/json/tests/json_last_error_msg_error.phpt new file mode 100644 index 0000000000..8135cf1ded --- /dev/null +++ b/ext/json/tests/json_last_error_msg_error.phpt @@ -0,0 +1,21 @@ +--TEST-- +json_last_error_msg() failures +--SKIPIF-- +<?php !extension_loaded('json') && die('skip json extension not available') ?> +--FILE-- +<?php + +var_dump(json_last_error_msg()); +var_dump(json_last_error_msg(TRUE)); +var_dump(json_last_error_msg('some', 4, 'args', 'here')); + +?> +--EXPECTF-- +string(8) "No error" + +Warning: json_last_error_msg() expects exactly 0 parameters, 1 given in %s on line %d +NULL + +Warning: json_last_error_msg() expects exactly 0 parameters, 4 given in %s on line %d +NULL + diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index a5260807d4..e0d5543882 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -48,7 +48,7 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = { mbfl_no_encoding_2022jp_kddi, "ISO-2022-JP-MOBILE#KDDI", "ISO-2022-JP", - mbfl_encoding_2022jp_kddi_aliases, + &mbfl_encoding_2022jp_kddi_aliases, NULL, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE | MBFL_ENCTYPE_GL_UNSAFE }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c index a9c141bbfe..e81e0860d2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c @@ -101,6 +101,7 @@ int mbfl_filt_put_invalid_char(int c, mbfl_convert_filter *filter) filter->status = 0; filter->cache = 0; CK((*filter->output_function)(w, filter->data)); + return 0; } @@ -109,7 +110,7 @@ int mbfl_filt_put_invalid_char(int c, mbfl_convert_filter *filter) */ int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter) { - int s, c1, w = 0, flag = 0; + int s, c1; retry: switch (filter->status & 0xff) { @@ -126,7 +127,7 @@ retry: filter->status = 0x30; filter->cache = c & 0x7; } else { - mbfl_filt_put_invalid_char(c, filter); + CK(mbfl_filt_put_invalid_char(c, filter)); } break; case 0x10: /* 2byte code 2nd char: 0x80-0xbf */ @@ -138,7 +139,7 @@ retry: filter->cache = 0; CK((*filter->output_function)(s, filter->data)); } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -153,7 +154,7 @@ retry: filter->cache = s; filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -168,7 +169,7 @@ retry: filter->cache = s; filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -177,7 +178,7 @@ retry: filter->cache = (filter->cache<<6) | (c & 0x3f); filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -200,7 +201,7 @@ int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter) filter->cache = 0; if (status != 0) { - mbfl_filt_put_invalid_char(cache, filter); + CK(mbfl_filt_put_invalid_char(cache, filter)); } if (filter->flush_function != NULL) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c index c449d3132a..41e02bf314 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c @@ -183,14 +183,14 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf8_sb = { }; #define CK(statement) do { if ((statement) < 0) return (-1); } while (0) +int mbfl_filt_put_invalid_char(int c, mbfl_convert_filter *filter); /* * UTF-8 => wchar */ int mbfl_filt_conv_utf8_mobile_wchar(int c, mbfl_convert_filter *filter) { - int s, w = 0, flag = 0; - int s1 = 0, c1 = 0, snd = 0; + int s, s1 = 0, c1 = 0, snd = 0; retry: switch (filter->status & 0xff) { @@ -207,7 +207,7 @@ retry: filter->status = 0x30; filter->cache = c & 0x7; } else { - mbfl_filt_put_invalid_char(c, filter); + CK(mbfl_filt_put_invalid_char(c, filter)); } break; case 0x10: /* 2byte code 2nd char: 0x80-0xbf */ @@ -237,7 +237,7 @@ retry: } CK((*filter->output_function)(s, filter->data)); } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -252,7 +252,7 @@ retry: filter->cache = s; filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -267,7 +267,7 @@ retry: filter->cache = s; filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; @@ -276,7 +276,7 @@ retry: filter->cache = (filter->cache<<6) | (c & 0x3f); filter->status++; } else { - mbfl_filt_put_invalid_char(filter->cache, filter); + CK(mbfl_filt_put_invalid_char(filter->cache, filter)); goto retry; } break; diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index 88f8772d34..35a986ac2a 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -909,7 +909,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp } #endif /* copy the part of the string before the match */ - smart_str_appendl(&out_buf, pos, (size_t)((OnigUChar *)(string + regs->beg[0]) - pos)); + smart_str_appendl(&out_buf, (char *)pos, (size_t)((OnigUChar *)(string + regs->beg[0]) - pos)); if (!is_callable) { /* copy replacement and backrefs */ @@ -992,14 +992,14 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp pos = (OnigUChar *)string + n; } else { if (pos < string_lim) { - smart_str_appendl(&out_buf, pos, 1); + smart_str_appendl(&out_buf, (char *)pos, 1); } pos++; } } else { /* nomatch */ /* stick that last bit of string on our output */ if (string_lim - pos > 0) { - smart_str_appendl(&out_buf, pos, string_lim - pos); + smart_str_appendl(&out_buf, (char *)pos, string_lim - pos); } } onig_region_free(regs, 0); diff --git a/ext/mysqli/tests/mysqli_fetch_object.phpt b/ext/mysqli/tests/mysqli_fetch_object.phpt index 11dd0a5a4f..9706ceac84 100644 --- a/ext/mysqli/tests/mysqli_fetch_object.phpt +++ b/ext/mysqli/tests/mysqli_fetch_object.phpt @@ -150,6 +150,6 @@ NULL NULL [E_WARNING] mysqli_fetch_object(): Couldn't fetch mysqli_result in %s on line %d NULL -[E_ERROR] Argument 3 passed to mysqli_fetch_object() must be of the type array, string given in %s on line %d +[0] Argument 3 passed to mysqli_fetch_object() must be of the type array, string given in %s on line %d Fatal error: Class 'this_class_does_not_exist' not found in %s on line %d diff --git a/ext/mysqli/tests/mysqli_fetch_object_oo.phpt b/ext/mysqli/tests/mysqli_fetch_object_oo.phpt index 2b3f76c993..82e311cc72 100644 --- a/ext/mysqli/tests/mysqli_fetch_object_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_object_oo.phpt @@ -129,9 +129,9 @@ require_once('skipifconnectfailure.inc'); %s on line %d [E_WARNING] mysqli_result::fetch_object(): Couldn't fetch mysqli_result in %s on line %d [E_WARNING] mysqli_result::fetch_object() expects parameter 1 to be string, object given in %s on line %d -[E_ERROR] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, object given in %s on line %d -[E_ERROR] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, object given in %s on line %d -[E_ERROR] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, null given in %s on line %d +[0] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, object given in %s on line %d +[0] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, object given in %s on line %d +[0] Argument 2 passed to mysqli_result::fetch_object() must be of the type array, null given in %s on line %d [E_WARNING] Missing argument 2 for mysqli_fetch_object_construct::__construct() in %s on line %d [E_NOTICE] Undefined variable: b in %s on line %d NULL diff --git a/ext/mysqlnd/mysqlnd_debug.h b/ext/mysqlnd/mysqlnd_debug.h index 1e6d0c17a6..1a57143507 100644 --- a/ext/mysqlnd/mysqlnd_debug.h +++ b/ext/mysqlnd/mysqlnd_debug.h @@ -115,6 +115,7 @@ PHPAPI MYSQLND_DEBUG * mysqlnd_debug_init(const char * skip_functions[]); struct timeval __dbg_prof_tp = {0}; \ uint64_t __dbg_prof_start = 0; /* initialization is needed */ \ zend_bool dbg_skip_trace = TRUE; \ + ((void)__dbg_prof_start); \ if ((dbg_obj1)) { \ dbg_skip_trace = !(dbg_obj1)->m->func_enter((dbg_obj1), __LINE__, __FILE__, func_name, strlen(func_name)); \ } \ diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 70e0cf3d55..0923a988ed 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -582,9 +582,8 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn) { zend_string * key; - zend_ulong unused_num_key; zval * entry_value; - ZEND_HASH_FOREACH_KEY_VAL(packet->connect_attr, unused_num_key, key, entry_value) { + ZEND_HASH_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { if (key) { /* HASH_KEY_IS_STRING */ size_t value_len = Z_STRLEN_P(entry_value); @@ -621,9 +620,8 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn) #else { zend_string * key; - zend_ulong unused_num_key; zval * entry_value; - ZEND_HASH_FOREACH_KEY_VAL(packet->connect_attr, unused_num_key, key, entry_value) { + ZEND_HASH_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { if (key) { /* HASH_KEY_IS_STRING */ size_t value_len = Z_STRLEN_P(entry_value); diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index f431dcaba9..2c65ea94f9 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1453,14 +1453,16 @@ static void php_oci_pconnection_list_np_dtor(zend_resource *entry) OCI_G(in_call)) { /* Remove the hash entry if present */ - zvp = zend_hash_find(&EG(persistent_list), connection->hash_key); - le = Z_RES_P(zvp); /* PHPNG TODO check for null zvp */ - if (le != NULL && le->type == le_pconnection && le->ptr == connection) { - zend_hash_del(&EG(persistent_list), connection->hash_key); - } - else { - php_oci_connection_close(connection); - OCI_G(num_persistent)--; + if (connection->hash_key) { + zvp = zend_hash_find(&EG(persistent_list), connection->hash_key); + le = zvp ? Z_RES_P(zvp) : NULL; /* PHPNG TODO check for null zvp */ + if (le != NULL && le->type == le_pconnection && le->ptr == connection) { + zend_hash_del(&EG(persistent_list), connection->hash_key); + } + else { + php_oci_connection_close(connection); + OCI_G(num_persistent)--; + } } #ifdef HAVE_OCI8_DTRACE @@ -1534,12 +1536,14 @@ void php_oci_define_hash_dtor(zval *data) { php_oci_define *define = (php_oci_define *) Z_PTR_P(data); - zval_ptr_dtor(&define->zval); + zval_ptr_dtor(define->zval); if (define->name) { efree(define->name); define->name = NULL; } + + efree(define); } /* }}} */ @@ -1562,8 +1566,9 @@ void php_oci_bind_hash_dtor(zval *data) if (bind->array.indicators) { efree(bind->array.indicators); } + efree(bind); - /*zval_ptr_dtor(&bind->zval); */ + zval_ptr_dtor(bind->zval); } /* }}} */ @@ -1579,7 +1584,7 @@ void php_oci_column_hash_dtor(zval *data) zend_list_close(column->stmtid); } - if (column->is_descr) { + if (column->descid) { zend_list_close(column->descid); } @@ -1703,6 +1708,7 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf) text err_buf[PHP_OCI_ERRBUF_LEN]; memset(err_buf, 0, sizeof(err_buf)); + *error_buf = (text *)0; PHP_OCI_CALL(OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR)); if (error_code) { @@ -1946,7 +1952,6 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char le = Z_RES_P(zvp); found = 1; if (le->type == le_index_ptr) { - int type, link; void *ptr; ptr = le->ptr; /* PHPNG TODO */ @@ -1984,7 +1989,6 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char if (connection->is_open) { /* found an open connection. now ping it */ if (connection->is_persistent) { - int rsrc_type; /* Check connection liveness in the following order: * 1) always check OCI_ATTR_SERVER_STATUS @@ -2008,7 +2012,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char connection->used_this_request = 1; tmp = (php_oci_connection *)connection->id->ptr; - if (tmp != NULL && rsrc_type == le_pconnection && tmp->hash_key->len == hashed_details.s->len && + if (tmp != NULL && tmp->hash_key->len == hashed_details.s->len && memcmp(tmp->hash_key->val, hashed_details.s->val, tmp->hash_key->len) == 0 && ++GC_REFCOUNT(connection->id) == SUCCESS) { /* do nothing */ } else { @@ -2039,7 +2043,6 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char * if ping fails */ if (persistent){ - int rsrc_type; connection->is_open = 0; connection->used_this_request = 1; @@ -2047,7 +2050,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* We have to do a hash_del but need to preserve the resource if there is a positive * refcount. Set the data pointer in the list entry to NULL */ - if (connection == connection->id->ptr && rsrc_type == le_pconnection) { + if (connection == connection->id->ptr) { le->ptr = NULL; } @@ -2369,14 +2372,17 @@ static int php_oci_connection_close(php_oci_connection *connection) * (like env) on the session pool */ php_oci_spool_close(connection->private_spool); + connection->private_spool = NULL; } if (connection->hash_key) { pefree(connection->hash_key, connection->is_persistent); + connection->hash_key = NULL; } #ifdef HAVE_OCI8_DTRACE if (connection->client_id) { pefree(connection->client_id, connection->is_persistent); + connection->client_id = NULL; } #endif /* HAVE_OCI8_DTRACE */ pefree(connection, connection->is_persistent); @@ -2568,12 +2574,11 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode) } else if (column->is_descr) { if (column->data_type != SQLT_RDD) { - int rsrc_type; /* reset descriptor's length */ descriptor = (php_oci_descriptor *) column->descid->ptr; - if (!descriptor || rsrc_type != le_descriptor) { + if (!descriptor) { php_error_docref(NULL, E_WARNING, "Unable to find LOB descriptor #%d", column->descid); return 1; } @@ -2770,7 +2775,7 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg } if (fetch_mode & PHP_OCI_ASSOC) { if (fetch_mode & PHP_OCI_NUM) { - Z_ADDREF(element); + Z_TRY_ADDREF_P(&element); } add_assoc_zval(return_value, column->name, &element); } @@ -2972,7 +2977,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * { smart_str spool_hashed_details = {0}; php_oci_spool *session_pool = NULL; - zend_resource spool_le = {0}; + zend_resource spool_le = {{0}}; zend_resource *spool_out_le = NULL; zend_bool iserror = 0; zval *spool_out_zv = NULL; diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index bccab92a48..441dd448a5 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -54,7 +54,7 @@ PHP_FUNCTION(oci_define_by_name) size_t name_len; zend_long type = 0; php_oci_statement *statement; - php_oci_define *define, *tmp_define; + php_oci_define *define; zend_string *zvtmp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz/|l", &stmt, &name, &name_len, &var, &type) == FAILURE) { @@ -72,15 +72,16 @@ PHP_FUNCTION(oci_define_by_name) ALLOC_HASHTABLE(statement->defines); zend_hash_init(statement->defines, 13, NULL, php_oci_define_hash_dtor, 0); } + else if (zend_hash_str_exists(statement->defines, (const char *)name, name_len)) { + RETURN_FALSE; + } define = ecalloc(1,sizeof(php_oci_define)); /* if (zend_hash_add(statement->defines, name, name_len, define, sizeof(php_oci_define), (void **)&tmp_define) == SUCCESS) { */ zvtmp = zend_string_init(name, name_len, 0); - if ((tmp_define = zend_hash_add_new_ptr(statement->defines, zvtmp, define)) != NULL) { - efree(define); + if ((define = zend_hash_add_new_ptr(statement->defines, zvtmp, define)) != NULL) { zend_string_release(zvtmp); - define = tmp_define; } else { efree(define); zend_string_release(zvtmp); @@ -90,8 +91,8 @@ PHP_FUNCTION(oci_define_by_name) define->name = (text*) estrndup(name, name_len); define->name_len = name_len; define->type = type; - memmove(&define->zval, var, sizeof(zval)); - Z_ADDREF_P(var); + define->zval = var; + Z_TRY_ADDREF_P(define->zval); RETURN_TRUE; } @@ -175,7 +176,7 @@ PHP_FUNCTION(oci_free_descriptor) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -209,7 +210,7 @@ PHP_FUNCTION(oci_lob_save) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -264,7 +265,7 @@ PHP_FUNCTION(oci_lob_import) } #endif - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -293,7 +294,7 @@ PHP_FUNCTION(oci_lob_load) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -333,7 +334,7 @@ PHP_FUNCTION(oci_lob_read) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -371,7 +372,7 @@ PHP_FUNCTION(oci_lob_eof) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -400,7 +401,7 @@ PHP_FUNCTION(oci_lob_tell) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -424,7 +425,7 @@ PHP_FUNCTION(oci_lob_rewind) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -457,7 +458,7 @@ PHP_FUNCTION(oci_lob_seek) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -503,7 +504,7 @@ PHP_FUNCTION(oci_lob_size) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -547,7 +548,7 @@ PHP_FUNCTION(oci_lob_write) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -583,12 +584,12 @@ PHP_FUNCTION(oci_lob_append) } } - if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); RETURN_FALSE; } - if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); RETURN_FALSE; } @@ -624,7 +625,7 @@ PHP_FUNCTION(oci_lob_truncate) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -684,7 +685,7 @@ PHP_FUNCTION(oci_lob_erase) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -717,7 +718,7 @@ PHP_FUNCTION(oci_lob_flush) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -755,7 +756,7 @@ PHP_FUNCTION(ocisetbufferinglob) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -782,7 +783,7 @@ PHP_FUNCTION(ocigetbufferinglob) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -808,12 +809,12 @@ PHP_FUNCTION(oci_lob_copy) return; } - if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); RETURN_FALSE; } - if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); RETURN_FALSE; } @@ -850,12 +851,12 @@ PHP_FUNCTION(oci_lob_is_equal) return; } - if ((tmp_first = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_first), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_first = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_first), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); RETURN_FALSE; } - if ((tmp_second = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_second), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_second = zend_hash_str_find(Z_OBJPROP_P(z_descriptor_second), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); RETURN_FALSE; } @@ -932,7 +933,7 @@ PHP_FUNCTION(oci_lob_export) } #endif - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -1028,7 +1029,7 @@ PHP_FUNCTION(oci_lob_write_temporary) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -1055,7 +1056,7 @@ PHP_FUNCTION(oci_lob_close) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); RETURN_FALSE; } @@ -1436,7 +1437,7 @@ PHP_FUNCTION(oci_fetch_all) zend_string *zvtmp; zvtmp = zend_string_init(columns[ i ]->name, columns[ i ]->name_len, 0); zend_symtable_update(Z_ARRVAL(row), zvtmp, &element); - zend_string_release(zvtmp); + zend_string_release(zvtmp); } } @@ -1467,9 +1468,9 @@ PHP_FUNCTION(oci_fetch_all) columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0); array_init(&tmp); - zvtmp = zend_string_init(columns[ i ]->name, columns[ i ]->name_len, 0); + zvtmp = zend_string_init(columns[ i ]->name, columns[ i ]->name_len, 0); outarrs[ i ] = zend_symtable_update(Z_ARRVAL_P(array), zvtmp, &tmp); - zend_string_release(zvtmp); + zend_string_release(zvtmp); } } @@ -1669,7 +1670,8 @@ go_out: add_assoc_long(return_value, "code", errcode); /* TODO: avoid reallocation ??? */ add_assoc_string(return_value, "message", (char*) errbuf); - efree(errbuf); + if (errbuf) + efree(errbuf); add_assoc_long(return_value, "offset", error_offset); add_assoc_string(return_value, "sqltext", sqltext ? (char *) sqltext : ""); } else { @@ -2180,7 +2182,7 @@ PHP_FUNCTION(oci_free_collection) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2212,7 +2214,7 @@ PHP_FUNCTION(oci_collection_append) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2246,7 +2248,7 @@ PHP_FUNCTION(oci_collection_element_get) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2279,12 +2281,12 @@ PHP_FUNCTION(oci_collection_assign) } } - if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_collection_dest), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_dest = zend_hash_str_find(Z_OBJPROP_P(z_collection_dest), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property. The first argument should be valid collection object"); RETURN_FALSE; } - if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_collection_from), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp_from = zend_hash_str_find(Z_OBJPROP_P(z_collection_from), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property. The second argument should be valid collection object"); RETURN_FALSE; } @@ -2320,7 +2322,7 @@ PHP_FUNCTION(oci_collection_element_assign) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2348,7 +2350,7 @@ PHP_FUNCTION(oci_collection_size) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2376,7 +2378,7 @@ PHP_FUNCTION(oci_collection_max) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } @@ -2409,7 +2411,7 @@ PHP_FUNCTION(oci_collection_trim) } } - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); RETURN_FALSE; } diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 3f5e826a7b..d27a728d3c 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -166,8 +166,8 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement) statement2->has_descr = 0; statement2->stmttype = 0; - Z_ADDREF_P(statement->id); - Z_ADDREF_P(statement2->connection->id); + GC_REFCOUNT(statement->id)++; + GC_REFCOUNT(statement2->connection->id)++; php_oci_statement_set_prefetch(statement2, statement->prefetch_count); @@ -359,8 +359,8 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows) continue; } - zval_dtor(&column->define->zval); - php_oci_column_to_zval(column, &column->define->zval, 0); + zval_dtor(column->define->zval); + php_oci_column_to_zval(column, column->define->zval, 0); } return 0; @@ -875,17 +875,17 @@ void php_oci_statement_free(php_oci_statement *statement) if (statement->columns) { zend_hash_destroy(statement->columns); - FREE_HASHTABLE(statement->columns); + efree(statement->columns); } if (statement->binds) { zend_hash_destroy(statement->binds); - FREE_HASHTABLE(statement->binds); + efree(statement->binds); } if (statement->defines) { zend_hash_destroy(statement->defines); - FREE_HASHTABLE(statement->defines); + efree(statement->defines); } if (statement->parent_stmtid) { @@ -907,7 +907,7 @@ int php_oci_bind_pre_exec(zval *data, void *result) *(int *)result = 0; - if (Z_TYPE(bind->zval) == IS_ARRAY) { + if (Z_TYPE_P(bind->zval) == IS_ARRAY) { /* These checks are currently valid for oci_bind_by_name, not * oci_bind_array_by_name. Also bind->type and * bind->indicator are not used for oci_bind_array_by_name. @@ -921,7 +921,7 @@ int php_oci_bind_pre_exec(zval *data, void *result) case SQLT_CLOB: case SQLT_BLOB: case SQLT_RDD: - if (Z_TYPE(bind->zval) != IS_OBJECT) { + if (Z_TYPE_P(bind->zval) != IS_OBJECT) { php_error_docref(NULL, E_WARNING, "Invalid variable used for bind"); *(int *)result = 1; } @@ -937,14 +937,14 @@ int php_oci_bind_pre_exec(zval *data, void *result) case SQLT_LBI: case SQLT_BIN: case SQLT_LNG: - if (Z_TYPE(bind->zval) == IS_RESOURCE || Z_TYPE(bind->zval) == IS_OBJECT) { + if (Z_TYPE_P(bind->zval) == IS_RESOURCE || Z_TYPE_P(bind->zval) == IS_OBJECT) { php_error_docref(NULL, E_WARNING, "Invalid variable used for bind"); *(int *)result = 1; } break; case SQLT_RSET: - if (Z_TYPE(bind->zval) != IS_RESOURCE) { + if (Z_TYPE_P(bind->zval) != IS_RESOURCE) { php_error_docref(NULL, E_WARNING, "Invalid variable used for bind"); *(int *)result = 1; } @@ -967,27 +967,27 @@ int php_oci_bind_post_exec(zval *data) sword errstatus; if (bind->indicator == -1) { /* NULL */ - zval *val = &bind->zval; + zval *val = bind->zval; if (Z_TYPE_P(val) == IS_STRING) { *Z_STRVAL_P(val) = '\0'; /* XXX avoid warning in debug mode */ } zval_dtor(val); ZVAL_NULL(val); - } else if (Z_TYPE(bind->zval) == IS_STRING - && Z_STRLEN(bind->zval) > 0 - && Z_STRVAL(bind->zval)[ Z_STRLEN(bind->zval) ] != '\0') { + } else if (Z_TYPE_P(bind->zval) == IS_STRING + && Z_STRLEN_P(bind->zval) > 0 + && Z_STRVAL_P(bind->zval)[ Z_STRLEN_P(bind->zval) ] != '\0') { /* The post- PHP 5.3 feature for "interned" strings disallows * their reallocation but (i) any IN binds either interned or * not should already be null terminated and (ii) for OUT * binds, php_oci_bind_out_callback() should have allocated a * new string that we can modify here. */ - Z_STR(bind->zval) = zend_string_extend(Z_STR(bind->zval), Z_STRLEN(bind->zval)+1, 0); - Z_STRVAL(bind->zval)[ Z_STRLEN(bind->zval) ] = '\0'; - } else if (Z_TYPE(bind->zval) == IS_ARRAY) { + Z_STR_P(bind->zval) = zend_string_extend(Z_STR_P(bind->zval), Z_STRLEN_P(bind->zval)+1, 0); + Z_STRVAL_P(bind->zval)[ Z_STRLEN_P(bind->zval) ] = '\0'; + } else if (Z_TYPE_P(bind->zval) == IS_ARRAY) { int i; zval *entry = NULL; - HashTable *hash = HASH_OF(&bind->zval); + HashTable *hash = HASH_OF(bind->zval); zend_hash_internal_pointer_reset(hash); @@ -1001,7 +1001,7 @@ int php_oci_bind_post_exec(zval *data) ZVAL_LONG(entry, ((ub4 *)(bind->array.elements))[i]); zend_hash_move_forward(hash); } else { - add_next_index_long(&bind->zval, ((ub4 *)(bind->array.elements))[i]); + add_next_index_long(bind->zval, ((ub4 *)(bind->array.elements))[i]); } } break; @@ -1012,7 +1012,7 @@ int php_oci_bind_post_exec(zval *data) ZVAL_DOUBLE(entry, ((double *)(bind->array.elements))[i]); zend_hash_move_forward(hash); } else { - add_next_index_double(&bind->zval, ((double *)(bind->array.elements))[i]); + add_next_index_double(bind->zval, ((double *)(bind->array.elements))[i]); } } break; @@ -1041,10 +1041,10 @@ int php_oci_bind_post_exec(zval *data) if (errstatus != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, errstatus); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); - add_next_index_null(&bind->zval); + add_next_index_null(bind->zval); } else { connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ - add_next_index_stringl(&bind->zval, (char *)buff, buff_len); + add_next_index_stringl(bind->zval, (char *)buff, buff_len); } } } @@ -1064,11 +1064,16 @@ int php_oci_bind_post_exec(zval *data) ZVAL_STRINGL(entry, (char *)(((text *)bind->array.elements)+i*bind->array.max_length), curr_element_length); zend_hash_move_forward(hash); } else { - add_next_index_stringl(&bind->zval, (char *)(((text *)bind->array.elements)+i*bind->array.max_length), curr_element_length); + add_next_index_stringl(bind->zval, (char *)(((text *)bind->array.elements)+i*bind->array.max_length), curr_element_length); } } break; } + } else if ((Z_TYPE_P(bind->zval) == IS_TRUE) || (Z_TYPE_P(bind->zval) == IS_FALSE)) { + if (Z_LVAL_P(bind->zval) == 0) + ZVAL_BOOL(bind->zval, FALSE); + else if (Z_LVAL_P(bind->zval) == 1) + ZVAL_BOOL(bind->zval, TRUE); } return 0; @@ -1086,7 +1091,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, /* dvoid *php_oci_collection = NULL; */ OCIStmt *oci_stmt = NULL; dvoid *bind_data = NULL; - php_oci_bind bind, *old_bind, *bindp; + php_oci_bind *old_bind, *bindp; int mode = OCI_DATA_AT_EXEC; sb4 value_sz = -1; sword errstatus; @@ -1096,7 +1101,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, { zval *tmp; - if (Z_TYPE_P(var) != IS_OBJECT || (tmp = zend_hash_str_find(Z_OBJPROP_P(var), "collection", sizeof("collection"))) == NULL) { + if (Z_TYPE_P(var) != IS_OBJECT || (tmp = zend_hash_str_find(Z_OBJPROP_P(var), "collection", sizeof("collection")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find collection property"); return 1; } @@ -1118,7 +1123,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, { zval *tmp; - if (Z_TYPE_P(var) != IS_OBJECT || (tmp = zend_hash_str_find(Z_OBJPROP_P(var), "descriptor", sizeof("descriptor"))) == NULL) { + if (Z_TYPE_P(var) != IS_OBJECT || (tmp = zend_hash_str_find(Z_OBJPROP_P(var), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find descriptor property"); return 1; } @@ -1212,10 +1217,12 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, if ((old_bind = zend_hash_str_find_ptr(statement->binds, name, name_len)) != NULL) { bindp = old_bind; - zval_ptr_dtor(&bindp->zval); + if (bindp->zval) { + zval_ptr_dtor(bindp->zval); + } } else { zend_string *zvtmp; - zvtmp = zend_string_init(name, name_len + 1, 0); + zvtmp = zend_string_init(name, name_len, 0); bindp = (php_oci_bind *) ecalloc(1, sizeof(php_oci_bind)); bindp = zend_hash_update_ptr(statement->binds, zvtmp, bindp); zend_string_release(zvtmp); @@ -1224,9 +1231,9 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, bindp->descriptor = oci_desc; bindp->statement = oci_stmt; bindp->parent_statement = statement; - ZVAL_COPY(&bindp->zval, var); + bindp->zval = var; bindp->type = type; - Z_TRY_ADDREF_P(var); + Z_TRY_ADDREF_P(bindp->zval); PHP_OCI_CALL_RETURN(errstatus, OCIBindByName, @@ -1314,7 +1321,7 @@ sb4 php_oci_bind_in_callback( php_oci_bind *phpbind; zval *val; - if (!(phpbind=(php_oci_bind *)ictxp) || !(val = &phpbind->zval)) { + if (!(phpbind=(php_oci_bind *)ictxp) || !(val = phpbind->zval)) { php_error_docref(NULL, E_WARNING, "Invalid phpbind pointer value"); return OCI_ERROR; } @@ -1367,7 +1374,7 @@ sb4 php_oci_bind_out_callback( zval *val; sb4 retval = OCI_ERROR; - if (!(phpbind=(php_oci_bind *)octxp) || !(val = &phpbind->zval)) { + if (!(phpbind=(php_oci_bind *)octxp) || !(val = phpbind->zval)) { php_error_docref(NULL, E_WARNING, "Invalid phpbind pointer value"); return retval; } @@ -1394,7 +1401,7 @@ sb4 php_oci_bind_out_callback( * out-bind as the contents would have been changed for in/out * binds (Bug #46994). */ - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(val), "descriptor", sizeof("descriptor"))) == NULL) { + if ((tmp = zend_hash_str_find(Z_OBJPROP_P(val), "descriptor", sizeof("descriptor")-1)) == NULL) { php_error_docref(NULL, E_WARNING, "Unable to find object outbind descriptor property"); return OCI_ERROR; } @@ -1411,16 +1418,21 @@ sb4 php_oci_bind_out_callback( convert_to_string(val); zval_dtor(val); -#if 0 + { + char *p = ecalloc(1, PHP_OCI_PIECE_SIZE); + ZVAL_STRINGL(val, p, PHP_OCI_PIECE_SIZE); + efree(p); + } +#if 0 Z_STRLEN_P(val) = PHP_OCI_PIECE_SIZE; /* 64K-1 is max XXX */ - Z_STRVAL_P(val) = ecalloc(1, Z_STRLEN_P(phpbind->zval) + 1); + Z_STRVAL_P(val) = ecalloc(1, Z_STRLEN_P(val) + 1); /* XXX is this right? */ -#endif ZVAL_STRINGL(val, NULL, Z_STRLEN(phpbind->zval) + 1); +#endif /* XXX we assume that zend-zval len has 4 bytes */ - *alenpp = (ub4*) &Z_STRLEN(phpbind->zval); - *bufpp = Z_STRVAL(phpbind->zval); + *alenpp = (ub4*) &Z_STRLEN_P(phpbind->zval); + *bufpp = Z_STRVAL_P(phpbind->zval); *piecep = OCI_ONE_PIECE; *rcodepp = &phpbind->retcode; *indpp = &phpbind->indicator; @@ -1580,7 +1592,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam zend_hash_init(statement->binds, 13, NULL, php_oci_bind_hash_dtor, 0); } - zvtmp = zend_string_init(name, name_len + 1, 0); + zvtmp = zend_string_init(name, name_len, 0); bindp = zend_hash_update_ptr(statement->binds, zvtmp, bind); zend_string_release(zvtmp); @@ -1588,12 +1600,12 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam bindp->statement = NULL; bindp->parent_statement = statement; bindp->bind = NULL; - ZVAL_COPY(&bindp->zval, var); + bindp->zval = var; bindp->array.type = type; bindp->indicator = 0; /* not used for array binds */ bindp->type = 0; /* not used for array binds */ - Z_ADDREF_P(var); + Z_TRY_ADDREF_P(var); PHP_OCI_CALL_RETURN(errstatus, OCIBindByName, @@ -1617,6 +1629,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam if (errstatus != OCI_SUCCESS) { + efree(bindp); statement->errcode = php_oci_error(statement->err, errstatus); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 9f1da48cd1..4a23f06168 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -202,7 +202,7 @@ typedef struct { /* {{{ php_oci_define */ typedef struct { - zval zval; /* zval used in define */ + zval *zval; /* zval used in define */ text *name; /* placeholder's name */ ub4 name_len; /* placeholder's name length */ ub4 type; /* define type */ @@ -237,7 +237,7 @@ typedef struct { /* {{{ php_oci_bind */ typedef struct { OCIBind *bind; /* bind handle */ - zval zval; /* value */ + zval *zval; /* value */ dvoid *descriptor; /* used for binding of LOBS etc */ OCIStmt *statement; /* used for binding REFCURSORs */ php_oci_statement *parent_statement; /* pointer to the parent statement */ diff --git a/ext/opcache/Optimizer/optimize_temp_vars_5.c b/ext/opcache/Optimizer/optimize_temp_vars_5.c index 77b4d66f94..f60f61cb45 100644 --- a/ext/opcache/Optimizer/optimize_temp_vars_5.c +++ b/ext/opcache/Optimizer/optimize_temp_vars_5.c @@ -77,7 +77,6 @@ void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *c while (opline >= end) { if ((ZEND_OP1_TYPE(opline) & (IS_VAR | IS_TMP_VAR))) { - currT = VAR_NUM(ZEND_OP1(opline).var) - offset; if (opline->opcode == ZEND_ROPE_END) { int num = (((opline->extended_value + 1) * sizeof(zend_string*)) + (sizeof(zval) - 1)) / sizeof(zval); @@ -153,7 +152,12 @@ void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *c currT = VAR_NUM(ZEND_RESULT(opline).var) - offset; if (valid_T[currT]) { if (start_of_T[currT] == opline) { - taken_T[map_T[currT]] = 0; + /* ZEND_FAST_CALL can not share temporary var with others + * since the fast_var could also be set by ZEND_HANDLE_EXCEPTION + * which could be ahead of it */ + if (opline->opcode != ZEND_FAST_CALL) { + taken_T[map_T[currT]] = 0; + } } ZEND_RESULT(opline).var = NUM_VAR(map_T[currT] + offset); if (opline->opcode == ZEND_ROPE_INIT) { diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2234d5ee56..01e9eca28f 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1068,15 +1068,6 @@ int zend_accel_invalidate(const char *filename, int filename_len, zend_bool forc zend_persistent_script *persistent_script; if (!ZCG(enabled) || !accel_startup_ok || !ZCSG(accelerator_enabled) || accelerator_shm_read_lock() != SUCCESS) { -#ifdef HAVE_OPCACHE_FILE_CACHE - if (ZCG(accel_directives).file_cache) { - realpath = accelerator_orig_zend_resolve_path(filename, filename_len); - if (realpath) { - zend_file_cache_invalidate(realpath); - zend_string_release(realpath); - } - } -#endif return FAILURE; } @@ -2290,7 +2281,7 @@ static void accel_deactivate(void) ZCG(counted) = 0; #if !ZEND_DEBUG - if (ZCG(accel_directives).fast_shutdown) { + if (ZCG(accel_directives).fast_shutdown && is_zend_mm()) { zend_accel_fast_shutdown(); } #endif diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index a737e8db6b..e20f3d16f6 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -30,8 +30,8 @@ # define accel_xlat_set(old, new) zend_hash_index_add_new_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old), (new)) # define accel_xlat_get(old) zend_hash_index_find_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old)) #else -# define accel_xlat_set(old, new) (zend_hash_str_add_new_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*), (zend_ulong)(zend_uintptr_t)(old), (void**)&(new)) -# define accel_xlat_get(old, new) ((new) = zend_hash_str_find_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*), (zend_ulong)(zend_uintptr_t)(old), (void**)&(new))) +# define accel_xlat_set(old, new) zend_hash_str_add_new_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*), (old)) +# define accel_xlat_get(old) zend_hash_str_find_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*)) #endif #define ARENA_REALLOC(ptr) \ diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 0781b91c9d..c3ee95960a 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -665,9 +665,40 @@ static void zend_file_cache_serialize(zend_persistent_script *script, new_script->mem = NULL; } -int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) +static char *zend_file_cache_get_bin_file_path(zend_string *script_path) { size_t len; + char *filename; + + len = strlen(ZCG(accel_directives).file_cache); + filename = emalloc(len + 33 + ZSTR_LEN(script_path) + sizeof(SUFFIX)); + memcpy(filename, ZCG(accel_directives).file_cache, len); +#ifndef ZEND_WIN32 + filename[len] = '/'; + memcpy(filename + len + 1, ZCG(system_id), 32); + memcpy(filename + len + 33, ZSTR_VAL(script_path), ZSTR_LEN(script_path)); + memcpy(filename + len + 33 + ZSTR_LEN(script_path), SUFFIX, sizeof(SUFFIX)); +#else + filename[len] = '\\'; + memcpy(filename + len + 1, ZCG(system_id), 32); + if (ZSTR_LEN(script_path) >= 2 && ':' == ZSTR_VAL(script_path)[1]) { + /* local fs */ + *(filename + len + 33) = '\\'; + *(filename + len + 34) = ZSTR_VAL(script_path)[0]; + memcpy(filename + len + 35, ZSTR_VAL(script_path) + 2, ZSTR_LEN(script_path) - 2); + memcpy(filename + len + 35 + ZSTR_LEN(script_path) - 2, SUFFIX, sizeof(SUFFIX)); + } else { + /* network path */ + memcpy(filename + len + 33, ZSTR_VAL(script_path), ZSTR_LEN(script_path)); + memcpy(filename + len + 33 + ZSTR_LEN(script_path), SUFFIX, sizeof(SUFFIX)); + } +#endif + + return filename; +} + +int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) +{ int fd; char *filename; zend_file_cache_metainfo info; @@ -676,15 +707,9 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) #endif void *mem, *buf; - len = strlen(ZCG(accel_directives).file_cache); - filename = emalloc(len + 33 + ZSTR_LEN(script->full_path) + sizeof(SUFFIX)); - memcpy(filename, ZCG(accel_directives).file_cache, len); - filename[len] = '/'; - memcpy(filename + len + 1, ZCG(system_id), 32); - memcpy(filename + len + 33, ZSTR_VAL(script->full_path), ZSTR_LEN(script->full_path)); - memcpy(filename + len + 33 + ZSTR_LEN(script->full_path), SUFFIX, sizeof(SUFFIX)); + filename = zend_file_cache_get_bin_file_path(script->full_path); - if (zend_file_cache_mkdir(filename, len) != SUCCESS) { + if (zend_file_cache_mkdir(filename, strlen(ZCG(accel_directives).file_cache)) != SUCCESS) { zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot create directory for file '%s'\n", filename); efree(filename); return FAILURE; @@ -1164,7 +1189,6 @@ static void zend_file_cache_unserialize(zend_persistent_script *script, zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle) { zend_string *full_path = file_handle->opened_path; - size_t len; int fd; char *filename; zend_persistent_script *script; @@ -1176,13 +1200,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl if (!full_path) { return NULL; } - len = strlen(ZCG(accel_directives).file_cache); - filename = emalloc(len + 33 + ZSTR_LEN(full_path) + sizeof(SUFFIX)); - memcpy(filename, ZCG(accel_directives).file_cache, len); - filename[len] = '/'; - memcpy(filename + len + 1, ZCG(system_id), 32); - memcpy(filename + len + 33, ZSTR_VAL(full_path), ZSTR_LEN(full_path)); - memcpy(filename + len + 33 + ZSTR_LEN(full_path), SUFFIX, sizeof(SUFFIX)); + filename = zend_file_cache_get_bin_file_path(full_path); fd = open(filename, O_RDONLY | O_BINARY); if (fd < 0) { @@ -1328,16 +1346,9 @@ use_process_mem: void zend_file_cache_invalidate(zend_string *full_path) { - size_t len; char *filename; - len = strlen(ZCG(accel_directives).file_cache); - filename = emalloc(len + 33 + ZSTR_LEN(full_path) + sizeof(SUFFIX)); - memcpy(filename, ZCG(accel_directives).file_cache, len); - filename[len] = '/'; - memcpy(filename + len + 1, ZCG(system_id), 32); - memcpy(filename + len + 33, ZSTR_VAL(full_path), ZSTR_LEN(full_path)); - memcpy(filename + len + 33 + ZSTR_LEN(full_path), SUFFIX, sizeof(SUFFIX)); + filename = zend_file_cache_get_bin_file_path(full_path); unlink(filename); efree(filename); diff --git a/ext/pdo/tests/bug65946.phpt b/ext/pdo/tests/bug65946.phpt index 4b63a14bb5..af6088cea9 100644 --- a/ext/pdo/tests/bug65946.phpt +++ b/ext/pdo/tests/bug65946.phpt @@ -18,6 +18,9 @@ $db->exec('CREATE TABLE test(id int)'); $db->exec('INSERT INTO test VALUES(1)'); if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'firebird') { $sql = 'SELECT FIRST :limit * FROM test'; +} else if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'oci') { + //$sql = 'SELECT * FROM test FETCH FIRST :limit ROWS ONLY'; // Oracle 12c syntax + $sql = "select id from (select a.*, rownum rnum from (SELECT * FROM test) a where rownum <= :limit)"; } else { $sql = 'SELECT * FROM test LIMIT :limit'; } diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index 17bace7882..3d4108dd59 100644 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -43,7 +43,12 @@ #define PDO_DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) #define PDO_DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) #define PDO_DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) -#define PDO_DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (PDO_MYSQL_G(dbg)) dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); +#define PDO_DBG_ENTER(func_name) \ + zend_bool dbg_skip_trace = TRUE; \ + ((void) dbg_skip_trace); \ + if (PDO_MYSQL_G(dbg)) \ + dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); + #define PDO_DBG_RETURN(value) do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__, 0); return (value); } while (0) #define PDO_DBG_VOID_RETURN do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__, 0); return; } while (0) diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c index 3148162d61..9c2e149935 100644 --- a/ext/pdo_oci/oci_statement.c +++ b/ext/pdo_oci/oci_statement.c @@ -51,7 +51,7 @@ } \ } while(0) -static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob); +static php_stream *oci_create_lob_stream(zval *dbh, pdo_stmt_t *stmt, OCILobLocator *lob); static int oci_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ { @@ -254,13 +254,12 @@ static sb4 oci_bind_output_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, d convert_to_string(parameter); zval_dtor(parameter); - Z_STRLEN_P(parameter) = param->max_value_len; - Z_STR_P(parameter) = ecalloc(1, Z_STRLEN_P(parameter)+1); + Z_STR_P(parameter) = zend_string_alloc(param->max_value_len, 1); P->used_for_output = 1; P->actual_len = (ub4) Z_STRLEN_P(parameter); *alenpp = &P->actual_len; - *bufpp = Z_STRVAL_P(parameter); + *bufpp = (Z_STR_P(parameter))->val; *piecep = OCI_ONE_PIECE; *rcodepp = &P->retcode; *indpp = &P->indicator; @@ -368,9 +367,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa zval_dtor(parameter); ZVAL_UNDEF(parameter); } else if (Z_TYPE_P(parameter) == IS_STRING) { - Z_STRLEN_P(parameter) = P->actual_len; - Z_STR_P(parameter) = erealloc(Z_STRVAL_P(parameter), P->actual_len+1); - Z_STRVAL_P(parameter)[P->actual_len] = '\0'; + Z_STR_P(parameter) = zend_string_init(Z_STRVAL_P(parameter), P->actual_len, 1); } } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB && P->thing) { php_stream *stm; @@ -380,7 +377,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa * wanted to bind a lob locator into it from the query * */ - stm = oci_create_lob_stream(stmt, (OCILobLocator*)P->thing); + stm = oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)P->thing); if (stm) { OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE); php_stream_to_zval(stm, parameter); @@ -610,10 +607,18 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */ return 1; } /* }}} */ +struct _oci_lob_env { + OCISvcCtx *svc; + OCIError *err; +}; +typedef struct _oci_lob_env oci_lob_env; + struct oci_lob_self { + zval dbh; pdo_stmt_t *stmt; pdo_oci_stmt *S; OCILobLocator *lob; + oci_lob_env *E; ub4 offset; }; @@ -624,7 +629,7 @@ static size_t oci_blob_write(php_stream *stream, const char *buf, size_t count) sword r; amt = (ub4) count; - r = OCILobWrite(self->S->H->svc, self->S->err, self->lob, + r = OCILobWrite(self->E->svc, self->E->err, self->lob, &amt, self->offset, (char*)buf, (ub4) count, OCI_ONE_PIECE, NULL, NULL, 0, SQLCS_IMPLICIT); @@ -644,7 +649,7 @@ static size_t oci_blob_read(php_stream *stream, char *buf, size_t count) sword r; amt = (ub4) count; - r = OCILobRead(self->S->H->svc, self->S->err, self->lob, + r = OCILobRead(self->E->svc, self->E->err, self->lob, &amt, self->offset, buf, (ub4) count, NULL, NULL, 0, SQLCS_IMPLICIT); @@ -662,10 +667,15 @@ static size_t oci_blob_read(php_stream *stream, char *buf, size_t count) static int oci_blob_close(php_stream *stream, int close_handle) { struct oci_lob_self *self = (struct oci_lob_self *)stream->abstract; - /* pdo_stmt_t *stmt = self->stmt; */ + pdo_stmt_t *stmt = self->stmt; if (close_handle) { - OCILobClose(self->S->H->svc, self->S->err, self->lob); + zend_object *obj = &stmt->std; + + OCILobClose(self->E->svc, self->E->err, self->lob); + zval_ptr_dtor(&self->dbh); + GC_REFCOUNT(obj)--; + efree(self->E); efree(self); } @@ -676,7 +686,7 @@ static int oci_blob_close(php_stream *stream, int close_handle) static int oci_blob_flush(php_stream *stream) { struct oci_lob_self *self = (struct oci_lob_self*)stream->abstract; - OCILobFlushBuffer(self->S->H->svc, self->S->err, self->lob, 0); + OCILobFlushBuffer(self->E->svc, self->E->err, self->lob, 0); return 0; } @@ -704,18 +714,27 @@ static php_stream_ops oci_blob_stream_ops = { NULL }; -static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob) +static php_stream *oci_create_lob_stream(zval *dbh, pdo_stmt_t *stmt, OCILobLocator *lob) { php_stream *stm; struct oci_lob_self *self = ecalloc(1, sizeof(*self)); + + ZVAL_COPY_VALUE(&self->dbh, dbh); self->lob = lob; self->offset = 1; /* 1-based */ self->stmt = stmt; self->S = (pdo_oci_stmt*)stmt->driver_data; + self->E = ecalloc(1, sizeof(oci_lob_env)); + self->E->svc = self->S->H->svc; + self->E->err = self->S->err; stm = php_stream_alloc(&oci_blob_stream_ops, self, 0, "r+b"); if (stm) { + zend_object *obj; + obj = &stmt->std; + Z_ADDREF(self->dbh); + GC_REFCOUNT(obj)++; return stm; } @@ -739,7 +758,7 @@ static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len if (C->dtype == SQLT_BLOB || C->dtype == SQLT_CLOB) { if (C->data) { - *ptr = (char*)oci_create_lob_stream(stmt, (OCILobLocator*)C->data); + *ptr = (char*)oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)C->data); OCILobOpen(S->H->svc, S->err, (OCILobLocator*)C->data, OCI_LOB_READONLY); } *len = (size_t) 0; diff --git a/ext/pdo_oci/tests/bug44301.phpt b/ext/pdo_oci/tests/bug44301.phpt index c0f79356af..1a3d8ad797 100644 --- a/ext/pdo_oci/tests/bug44301.phpt +++ b/ext/pdo_oci/tests/bug44301.phpt @@ -22,4 +22,4 @@ try { $db = null; --EXPECTF-- SQLSTATE[HY000]: General error: 942 OCIStmtExecute: ORA-00942: table or view does not exist - (%s/ext/pdo_oci/oci_statement.c:%d) + (%s%epdo_oci%eoci_statement.c:%d) diff --git a/ext/pdo_oci/tests/bug57702.phpt b/ext/pdo_oci/tests/bug57702.phpt index 0060bb0f2e..d0abc6ff8c 100644 --- a/ext/pdo_oci/tests/bug57702.phpt +++ b/ext/pdo_oci/tests/bug57702.phpt @@ -81,7 +81,6 @@ while ($stmt->fetch(PDO::FETCH_BOUND)) { var_dump($clob1); var_dump($clob2); } -print "done\n"; //////////////////// @@ -123,6 +122,22 @@ for ($i = 0; $i < count($a); $i++) { var_dump(stream_get_contents($a[$i][1])); } +//////////////////// + +echo "\nSixth Query\n"; + +$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); // Let's use streams + +$a = array(); +$i = 0; +foreach($db->query("select data1 as d4_1, data2 as d4_2 from bug57702 order by id") as $row) { + $a[$i][0] = $row['d4_1']; + $a[$i][1] = $row['d4_2']; + var_dump(stream_get_contents($a[$i][0])); + var_dump(stream_get_contents($a[$i][1])); + $i++; +} + // Cleanup $query = "drop table bug57702"; $stmt = $db->prepare($query); @@ -149,7 +164,6 @@ string(11) "row 1 col 1" string(11) "row 1 col 2" string(11) "row 2 col 1" string(11) "row 2 col 2" -done Fourth Query string(11) "row 1 col 1" @@ -162,4 +176,10 @@ string(11) "row 2 col 1" string(11) "row 2 col 2" string(11) "row 2 col 1" string(11) "row 2 col 2" + +Sixth Query +string(11) "row 1 col 1" +string(11) "row 1 col 2" +string(11) "row 2 col 1" +string(11) "row 2 col 2" done diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c index 53d12a719d..9b74b24212 100644 --- a/ext/pdo_sqlite/sqlite_statement.c +++ b/ext/pdo_sqlite/sqlite_statement.c @@ -233,7 +233,7 @@ static int pdo_sqlite_stmt_fetch(pdo_stmt_t *stmt, static int pdo_sqlite_stmt_describe(pdo_stmt_t *stmt, int colno) { pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data; - char *str; + const char *str; if(colno >= sqlite3_column_count(S->stmt)) { /* error invalid column */ diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 9282d48364..1172682bbc 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5803,7 +5803,6 @@ static int php_pgsql_add_quotes(zval *src, zend_bool should_free) PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result, zend_ulong opt) { zend_string *field = NULL; - zend_ulong num_idx = -1; zval meta, *def, *type, *not_null, *has_default, *is_enum, *val, new_val; int err = 0, skip_field; php_pgsql_data_type data_type; @@ -5824,7 +5823,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con return FAILURE; } - ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(values), num_idx, field, val) { + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), field, val) { skip_field = 0; ZVAL_NULL(&new_val); @@ -6550,7 +6549,6 @@ PHP_PGSQL_API int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var char *tmp; smart_str querystr = {0}; int ret = FAILURE; - zend_ulong num_idx; zend_string *fld; assert(pg_link != NULL); @@ -6579,7 +6577,7 @@ PHP_PGSQL_API int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var build_tablename(&querystr, pg_link, table); smart_str_appends(&querystr, " ("); - ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(var_array), num_idx, fld) { + ZEND_HASH_FOREACH_STR_KEY(Z_ARRVAL_P(var_array), fld) { if (fld == NULL) { php_error_docref(NULL, E_NOTICE, "Expects associative array for values to be inserted"); goto cleanup; @@ -6748,11 +6746,10 @@ static inline int build_assignment_string(PGconn *pg_link, smart_str *querystr, { char *tmp; char buf[256]; - zend_ulong num_idx; zend_string *fld; zval *val; - ZEND_HASH_FOREACH_KEY_VAL(ht, num_idx, fld, val) { + ZEND_HASH_FOREACH_STR_KEY_VAL(ht, fld, val) { if (fld == NULL) { php_error_docref(NULL, E_NOTICE, "Expects associative array for values to be inserted"); return -1; diff --git a/ext/posix/config.m4 b/ext/posix/config.m4 index 82b80ce972..9dfa70d1db 100644 --- a/ext/posix/config.m4 +++ b/ext/posix/config.m4 @@ -11,7 +11,7 @@ if test "$PHP_POSIX" = "yes"; then AC_CHECK_HEADERS(sys/mkdev.h) - AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo mknod getrlimit getlogin getgroups makedev initgroups getpwuid_r getgrgid_r) + AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo mknod setrlimit getrlimit getlogin getgroups makedev initgroups getpwuid_r getgrgid_r) AC_MSG_CHECKING([for working ttyname_r() implementation]) AC_TRY_RUN([ diff --git a/ext/posix/php_posix.h b/ext/posix/php_posix.h index ced4afe2c6..2132c7e7ca 100644 --- a/ext/posix/php_posix.h +++ b/ext/posix/php_posix.h @@ -113,6 +113,10 @@ PHP_FUNCTION(posix_getpwuid); PHP_FUNCTION(posix_getrlimit); #endif +#ifdef HAVE_SETRLIMIT +PHP_FUNCTION(posix_setrlimit); +#endif + #ifdef HAVE_INITGROUPS PHP_FUNCTION(posix_initgroups); #endif diff --git a/ext/posix/posix.c b/ext/posix/posix.c index 12fb3f3e36..547e93e58e 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -199,6 +199,14 @@ ZEND_BEGIN_ARG_INFO(arginfo_posix_getrlimit, 0) ZEND_END_ARG_INFO() #endif +#ifdef HAVE_SETRLIMIT +ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setrlimit, 0, 0, 3) + ZEND_ARG_INFO(0, resource) + ZEND_ARG_INFO(0, softlimit) + ZEND_ARG_INFO(0, hardlimit) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_INFO(arginfo_posix_get_last_error, 0) ZEND_END_ARG_INFO() @@ -293,6 +301,9 @@ const zend_function_entry posix_functions[] = { #ifdef HAVE_GETRLIMIT PHP_FE(posix_getrlimit, arginfo_posix_getrlimit) #endif +#ifdef HAVE_SETRLIMIT + PHP_FE(posix_setrlimit, arginfo_posix_setrlimit) +#endif PHP_FE(posix_get_last_error, arginfo_posix_get_last_error) PHP_FALIAS(posix_errno, posix_get_last_error, arginfo_posix_get_last_error) @@ -344,7 +355,57 @@ static PHP_MINIT_FUNCTION(posix) #ifdef S_IFSOCK REGISTER_LONG_CONSTANT("POSIX_S_IFSOCK", S_IFSOCK, CONST_CS | CONST_PERSISTENT); #endif - +#ifdef RLIMIT_AS + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_AS", RLIMIT_AS, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_CORE + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_CORE", RLIMIT_CORE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_CPU + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_CPU", RLIMIT_CPU, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_DATA + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_DATA", RLIMIT_DATA, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_FSIZE + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_FSIZE", RLIMIT_FSIZE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_LOCKS + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_LOCKS", RLIMIT_LOCKS, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_MEMLOCK + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_MEMLOCK", RLIMIT_MEMLOCK, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_MSGQUEUE + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_MSGQUEUE", RLIMIT_MSGQUEUE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_NICE + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NICE", RLIMIT_NICE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_NOFILE + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NOFILE", RLIMIT_NOFILE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_NPROC + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NPROC", RLIMIT_NPROC, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_RSS + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RSS", RLIMIT_RSS, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_RTPRIO + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RTPRIO", RLIMIT_RTPRIO, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_RTTIME + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RTTIME", RLIMIT_RTTIME, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_SIGPENDING + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_SIGPENDING", RLIMIT_SIGPENDING, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef RLIMIT_STACK + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_STACK", RLIMIT_STACK, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef HAVE_SETRLIMIT + REGISTER_LONG_CONSTANT("POSIX_RLIMIT_INFINITY", RLIM_INFINITY, CONST_CS | CONST_PERSISTENT); +#endif return SUCCESS; } /* }}} */ @@ -1322,6 +1383,33 @@ PHP_FUNCTION(posix_getrlimit) #endif /* HAVE_GETRLIMIT */ +#ifdef HAVE_SETRLIMIT +/* {{{ proto bool posix_setrlimit(int resource, int softlimit, int hardlimit) + Set system resource consumption limits (POSIX.1-2001) */ +PHP_FUNCTION(posix_setrlimit) +{ + struct rlimit rl; + zend_long res, cur, max; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &res, &cur, &max) == FAILURE) { + RETURN_FALSE; + } + + rl.rlim_cur = cur; + rl.rlim_max = max; + + if (setrlimit(res, &rl) == -1) { + POSIX_G(last_error) = errno; + RETURN_FALSE; + } + + RETURN_TRUE; +} +/* }}} */ + +#endif /* HAVE_SETRLIMIT */ + + /* {{{ proto int posix_get_last_error(void) Retrieve the error number set by the last posix function which failed. */ PHP_FUNCTION(posix_get_last_error) diff --git a/ext/posix/tests/posix_setrlimit.phpt b/ext/posix/tests/posix_setrlimit.phpt new file mode 100644 index 0000000000..4806fcfb4d --- /dev/null +++ b/ext/posix/tests/posix_setrlimit.phpt @@ -0,0 +1,18 @@ +--TEST-- +posix_setrlimit(): Basic tests +--SKIPIF-- +<?php +if (!extension_loaded('posix')) die('skip - POSIX extension not loaded'); +if (!function_exists('posix_setrlimit')) die('skip posix_setrlimit() not found'); +?> +--FILE-- +<?php + +var_dump(posix_setrlimit(POSIX_RLIMIT_NOFILE, 128, 128)); +var_dump(posix_setrlimit(POSIX_RLIMIT_NOFILE, 129, 128)); + +?> +--EXPECTF-- +bool(true) +bool(false) + diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c index 125b09e920..eaec591d9a 100644 --- a/ext/readline/readline_cli.c +++ b/ext/readline/readline_cli.c @@ -587,7 +587,7 @@ static int readline_shell_run(void) /* {{{ */ if (PG(auto_prepend_file) && PG(auto_prepend_file)[0]) { zend_file_handle *prepend_file_p; - zend_file_handle prepend_file = {0}; + zend_file_handle prepend_file = {{0}}; prepend_file.filename = PG(auto_prepend_file); prepend_file.opened_path = NULL; diff --git a/ext/shmop/tests/002.phpt b/ext/shmop/tests/002.phpt new file mode 100644 index 0000000000..c67857af08 --- /dev/null +++ b/ext/shmop/tests/002.phpt @@ -0,0 +1,119 @@ +--TEST-- +shmop extension error messages +--CREDITS-- +edgarsandi - <edgar.r.sandi@gmail.com> +--SKIPIF-- +<?php + if( substr(PHP_OS, 0, 3) == "WIN") { + die('skip not for Windows'); + } + if (!extension_loaded("shmop")) { + + die("skip shmop() extension not available"); + } +?> +--FILE-- +<?php + $hex_shm_id = function(){ + return rand(0, 9999); + }; + +echo PHP_EOL, '## shmop_open function tests ##'; + // warning outputs: 4 parameters expected + var_dump($shm_id = shmop_open()); + + // warning outputs: invalid flag when the flags length != 1 + var_dump(shmop_open($hex_shm_id(), '', 0644, 1024)); + + // warning outputs: invalid access mode + var_dump(shmop_open($hex_shm_id(), 'b', 0644, 1024)); + + // warning outputs: unable to attach or create shared memory segment + var_dump(shmop_open(null, 'a', 0644, 1024)); + + // warning outputs: Shared memory segment size must be greater than zero + var_dump(shmop_open($hex_shm_id(), "c", 0666, 0)); + + // warning outputs: unable to get shared memory segment information + var_dump(shmop_open($hex_shm_id(), 'n', 0, 1024)); + +echo PHP_EOL, '## shmop_read function tests ##'; + // warning outputs: 3 parameters expected + var_dump(shmop_read()); + + // warning outputs: start is out of range + $shm_id = shmop_open($hex_shm_id(), 'n', 0600, 1024); + var_dump(shmop_read($shm_id, -10, 0)); + + // warning outputs: count is out of range + $shm_id = shmop_open($hex_shm_id(), 'n', 0600, 1024); + var_dump(shmop_read($shm_id, 0, -10)); + +echo PHP_EOL, '## shmop_write function tests ##'; + // warning outputs: 3 parameters expected + var_dump(shmop_write()); + + // warning outputs: offset out of range + $shm_id = shmop_open($hex_shm_id(), 'n', 0600, 1024); + var_dump(shmop_write($shm_id, 'text to try write', -10)); + +echo PHP_EOL, '## shmop_size function tests ##'; + // warning outputs: 1 parameter expected + var_dump(shmop_size()); + +echo PHP_EOL, '## shmop_delete function tests ##'; + // warning outputs: 1 parameter expected + var_dump(shmop_delete()); + +echo PHP_EOL, '## shmop_close function tests ##'; + // warning outputs: 1 parameter expected + var_dump(shmop_close()); +?> +--EXPECTF-- +## shmop_open function tests ## +Warning: shmop_open() expects exactly 4 parameters, 0 given in %s on line %d +NULL + +Warning: shmop_open(): is not a valid flag in %s on line %d +bool(false) + +Warning: shmop_open(): invalid access mode in %s on line %d +bool(false) + +Warning: shmop_open(): unable to attach or create shared memory segment 'Invalid argument' in %s on line %d +bool(false) + +Warning: shmop_open(): Shared memory segment size must be greater than zero in %s on line %d +bool(false) + +Warning: shmop_open(): unable to get shared memory segment information 'Permission denied' in %s on line %d +bool(false) + +## shmop_read function tests ## +Warning: shmop_read() expects exactly 3 parameters, 0 given in %s on line %d +NULL + +Warning: shmop_read(): start is out of range in %s on line %d +bool(false) + +Warning: shmop_read(): count is out of range in %s on line %d +bool(false) + +## shmop_write function tests ## +Warning: shmop_write() expects exactly 3 parameters, 0 given in %s on line %d +NULL + +Warning: shmop_write(): offset out of range in %s on line %d +bool(false) + +## shmop_size function tests ## +Warning: shmop_size() expects exactly 1 parameter, 0 given in %s on line %d +NULL + +## shmop_delete function tests ## +Warning: shmop_delete() expects exactly 1 parameter, 0 given in %s on line %d +NULL + +## shmop_close function tests ## +Warning: shmop_close() expects exactly 1 parameter, 0 given in %s on line %d +NULL diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index a54362fe4b..d7da100d18 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -64,7 +64,7 @@ static void php_sxe_iterator_rewind(zend_object_iterator *iter); /* {{{ _node_as_zval() */ -static void _node_as_zval(php_sxe_object *sxe, xmlNodePtr node, zval *value, SXE_ITER itertype, char *name, const char *nsprefix, int isprefix) +static void _node_as_zval(php_sxe_object *sxe, xmlNodePtr node, zval *value, SXE_ITER itertype, char *name, const xmlChar *nsprefix, int isprefix) { php_sxe_object *subnode; @@ -76,7 +76,7 @@ static void _node_as_zval(php_sxe_object *sxe, xmlNodePtr node, zval *value, SXE subnode->iter.name = (xmlChar*)estrdup(name); } if (nsprefix && *nsprefix) { - subnode->iter.nsprefix = (xmlChar*)estrdup(nsprefix); + subnode->iter.nsprefix = (xmlChar*)estrdup((char*)nsprefix); subnode->iter.isprefix = isprefix; } @@ -975,7 +975,7 @@ static inline zend_string *sxe_xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr li /* {{{ _get_base_node_value() */ -static void _get_base_node_value(php_sxe_object *sxe_ref, xmlNodePtr node, zval *value, char *nsprefix, int isprefix) +static void _get_base_node_value(php_sxe_object *sxe_ref, xmlNodePtr node, zval *value, xmlChar *nsprefix, int isprefix) { php_sxe_object *subnode; xmlChar *contents; @@ -991,7 +991,7 @@ static void _get_base_node_value(php_sxe_object *sxe_ref, xmlNodePtr node, zval subnode->document = sxe_ref->document; subnode->document->refcount++; if (nsprefix && *nsprefix) { - subnode->iter.nsprefix = (xmlChar*)estrdup(nsprefix); + subnode->iter.nsprefix = (xmlChar*)estrdup((char *)nsprefix); subnode->iter.isprefix = isprefix; } php_libxml_increment_node_ptr((php_libxml_node_object *)subnode, node, NULL); diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index 3b42a6bf06..60dd9dd3ae 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -507,6 +507,7 @@ try_again: if (stream) { php_stream_auto_cleanup(stream); add_property_resource(this_ptr, "httpsocket", stream->res); + GC_REFCOUNT(stream->res)++; add_property_long(this_ptr, "_use_proxy", use_proxy); } else { php_url_free(phpurl); @@ -524,6 +525,7 @@ try_again: zend_resource *ret = zend_register_resource(phpurl, le_url); add_property_resource(this_ptr, "httpurl", ret); + GC_REFCOUNT(ret)++; /*zend_list_addref(ret);*/ if (context && @@ -814,7 +816,7 @@ try_again: smart_str_append_const(&soap_headers, "Cookie: "); for (i = 0; i < n; i++) { data = zend_hash_get_current_data(Z_ARRVAL_P(cookies)); - zend_hash_get_current_key_ex(Z_ARRVAL_P(cookies), &key, NULL, NULL); + zend_hash_get_current_key(Z_ARRVAL_P(cookies), &key, NULL); if (Z_TYPE_P(data) == IS_ARRAY) { zval *value; diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index c8acaf6995..f2621f65d0 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -1446,8 +1446,8 @@ void *from_zval_run_conversions(const zval *container, zend_llist **allocations /* out */, struct err_s *err /* in/out */) { - ser_context ctx = {{0}}; - char *structure = NULL; + ser_context ctx; + char *structure; *allocations = NULL; @@ -1455,6 +1455,7 @@ void *from_zval_run_conversions(const zval *container, return NULL; } + memset(&ctx, 0, sizeof(ctx)); zend_hash_init(&ctx.params, 8, NULL, NULL, 0); zend_llist_init(&ctx.keys, sizeof(const char *), NULL, 0); zend_llist_init(&ctx.allocations, sizeof(void *), &free_from_zval_allocation, 0); @@ -1488,13 +1489,14 @@ zval *to_zval_run_conversions(const char *structure, const struct key_value *key_value_pairs, struct err_s *err, zval *zv) { - res_context ctx = {{0}, {0}}; + res_context ctx; const struct key_value *kv; if (err->has_error) { return NULL; } + memset(&ctx, 0, sizeof(ctx)); zend_llist_init(&ctx.keys, sizeof(const char *), NULL, 0); zend_llist_add_element(&ctx.keys, &top_name); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index bf23c644c9..eaaf609501 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -940,7 +940,6 @@ SPL_METHOD(SplFileInfo, getExtension) p = zend_memrchr(ZSTR_VAL(ret), '.', ZSTR_LEN(ret)); if (p) { - assert(p > ZSTR_VAL(ret)); idx = (int)(p - ZSTR_VAL(ret)); RETVAL_STRINGL(ZSTR_VAL(ret) + idx + 1, ZSTR_LEN(ret) - idx - 1); zend_string_release(ret); diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 5ad1c5d12f..6a9e27a601 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -1182,7 +1182,7 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_ add_index_zval(return_value, Z_LVAL(element->inf), &retval); break; case IS_STRING: - zend_hash_update(Z_ARRVAL_P(return_value), Z_STR(element->inf), &retval); + zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR(element->inf), &retval); break; default: zval_ptr_dtor(&retval); diff --git a/ext/spl/tests/bug70053.phpt b/ext/spl/tests/bug70053.phpt new file mode 100644 index 0000000000..2cab083c37 --- /dev/null +++ b/ext/spl/tests/bug70053.phpt @@ -0,0 +1,21 @@ +--TEST-- +SPL: ArrayObject +--FILE-- +<?php + +echo "-- Two empty iterators attached with infos that are different but same array key --\n"; +$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC); +$mit ->attachIterator(new EmptyIterator(), "2"); +$mit ->attachIterator(new EmptyIterator(), 2); +var_dump($mit->countIterators()); +$mit->rewind(); +var_dump($mit->current()); + +?> +--EXPECT-- +-- Two empty iterators attached with infos that are different but same array key -- +int(2) +array(1) { + [2]=> + NULL +} diff --git a/ext/spl/tests/spl_fileinfo_getextension_leadingdot.phpt b/ext/spl/tests/spl_fileinfo_getextension_leadingdot.phpt new file mode 100644 index 0000000000..7b2be18900 --- /dev/null +++ b/ext/spl/tests/spl_fileinfo_getextension_leadingdot.phpt @@ -0,0 +1,13 @@ +--TEST-- +SPL: Spl File Info test getExtension with leading dot +--FILE-- +<?php +$file = __DIR__ . '/.test'; +touch($file); +$fileInfo = new SplFileInfo($file); + +var_dump($fileInfo->getExtension()); +unlink($file); +?> +--EXPECT-- +string(4) "test" diff --git a/ext/standard/array.c b/ext/standard/array.c index 696ad05ff6..7ef9d73fad 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -615,13 +615,11 @@ static int php_array_user_compare(const void *a, const void *b) /* {{{ */ BG(user_compare_fci) = old_user_compare_fci; \ BG(user_compare_fci_cache) = old_user_compare_fci_cache; \ -/* {{{ proto bool usort(array array_arg, string cmp_function) - Sort an array by values using a user-defined comparison function */ -PHP_FUNCTION(usort) +static void php_usort(INTERNAL_FUNCTION_PARAMETERS, compare_func_t compare_func, zend_bool renumber) /* {{{ */ { zval *array; zend_refcounted *arr; - unsigned int refcount; + zend_bool retval; PHP_ARRAY_CMP_FUNC_VARS; PHP_ARRAY_CMP_FUNC_BACKUP(); @@ -633,30 +631,35 @@ PHP_FUNCTION(usort) /* Increase reference counter, so the attempts to modify the array in user * comparison function will create a copy of array and won't affect the - * original array. The fact of modification is detected using refcount - * comparison. The result of sorting in such case is undefined and the - * function returns FALSE. + * original array. The fact of modification is detected by comparing the + * zend_array pointer. The result of sorting in such case is undefined and + * the function returns FALSE. */ Z_ADDREF_P(array); - refcount = Z_REFCOUNT_P(array); arr = Z_COUNTED_P(array); - if (zend_hash_sort(Z_ARRVAL_P(array), php_array_user_compare, 1) == FAILURE) { - RETVAL_FALSE; - } else { - if (refcount > Z_REFCOUNT_P(array)) { - php_error_docref(NULL, E_WARNING, "Array was modified by the user comparison function"); - if (--GC_REFCOUNT(arr) <= 0) { - _zval_dtor_func(arr ZEND_FILE_LINE_CC); - } - RETVAL_FALSE; - } else { - Z_DELREF_P(array); - RETVAL_TRUE; + retval = zend_hash_sort(Z_ARRVAL_P(array), compare_func, renumber) != FAILURE; + + if (arr != Z_COUNTED_P(array)) { + php_error_docref(NULL, E_WARNING, "Array was modified by the user comparison function"); + if (--GC_REFCOUNT(arr) <= 0) { + _zval_dtor_func(arr ZEND_FILE_LINE_CC); } + retval = 0; + } else { + Z_DELREF_P(array); } PHP_ARRAY_CMP_FUNC_RESTORE(); + RETURN_BOOL(retval); +} +/* }}} */ + +/* {{{ proto bool usort(array array_arg, string cmp_function) + Sort an array by values using a user-defined comparison function */ +PHP_FUNCTION(usort) +{ + php_usort(INTERNAL_FUNCTION_PARAM_PASSTHRU, php_array_user_compare, 1); } /* }}} */ @@ -664,44 +667,7 @@ PHP_FUNCTION(usort) Sort an array with a user-defined comparison function and maintain index association */ PHP_FUNCTION(uasort) { - zval *array; - zend_refcounted *arr; - unsigned int refcount; - PHP_ARRAY_CMP_FUNC_VARS; - - PHP_ARRAY_CMP_FUNC_BACKUP(); - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/f", &array, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) { - PHP_ARRAY_CMP_FUNC_RESTORE(); - return; - } - - /* Increase reference counter, so the attempts to modify the array in user - * comparison function will create a copy of array and won't affect the - * original array. The fact of modification is detected using refcount - * comparison. The result of sorting in such case is undefined and the - * function returns FALSE. - */ - Z_ADDREF_P(array); - refcount = Z_REFCOUNT_P(array); - arr = Z_COUNTED_P(array); - - if (zend_hash_sort(Z_ARRVAL_P(array), php_array_user_compare, 0) == FAILURE) { - RETVAL_FALSE; - } else { - if (refcount > Z_REFCOUNT_P(array)) { - php_error_docref(NULL, E_WARNING, "Array was modified by the user comparison function"); - if (--GC_REFCOUNT(arr) <= 0) { - _zval_dtor_func(arr ZEND_FILE_LINE_CC); - } - RETVAL_FALSE; - } else { - Z_DELREF_P(array); - RETVAL_TRUE; - } - } - - PHP_ARRAY_CMP_FUNC_RESTORE(); + php_usort(INTERNAL_FUNCTION_PARAM_PASSTHRU, php_array_user_compare, 0); } /* }}} */ @@ -752,44 +718,7 @@ static int php_array_user_key_compare(const void *a, const void *b) /* {{{ */ Sort an array by keys using a user-defined comparison function */ PHP_FUNCTION(uksort) { - zval *array; - zend_refcounted *arr; - unsigned int refcount; - PHP_ARRAY_CMP_FUNC_VARS; - - PHP_ARRAY_CMP_FUNC_BACKUP(); - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/f", &array, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) { - PHP_ARRAY_CMP_FUNC_RESTORE(); - return; - } - - /* Increase reference counter, so the attempts to modify the array in user - * comparison function will create a copy of array and won't affect the - * original array. The fact of modification is detected using refcount - * comparison. The result of sorting in such case is undefined and the - * function returns FALSE. - */ - Z_ADDREF_P(array); - refcount = Z_REFCOUNT_P(array); - arr = Z_COUNTED_P(array); - - if (zend_hash_sort(Z_ARRVAL_P(array), php_array_user_key_compare, 0) == FAILURE) { - RETVAL_FALSE; - } else { - if (refcount > Z_REFCOUNT_P(array)) { - php_error_docref(NULL, E_WARNING, "Array was modified by the user comparison function"); - if (--GC_REFCOUNT(arr) <= 0) { - _zval_dtor_func(arr ZEND_FILE_LINE_CC); - } - RETVAL_FALSE; - } else { - Z_DELREF_P(array); - RETVAL_TRUE; - } - } - - PHP_ARRAY_CMP_FUNC_RESTORE(); + php_usort(INTERNAL_FUNCTION_PARAM_PASSTHRU, php_array_user_key_compare, 0); } /* }}} */ diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 1d5e1dd7b2..488b71b900 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2653,8 +2653,9 @@ ZEND_BEGIN_ARG_INFO(arginfo_serialize, 0) ZEND_ARG_INFO(0, var) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_unserialize, 0) +ZEND_BEGIN_ARG_INFO_EX(arginfo_unserialize, 0, 0, 1) ZEND_ARG_INFO(0, variable_representation) + ZEND_ARG_INFO(0, allowed_classes) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_memory_get_usage, 0, 0, 0) diff --git a/ext/standard/crypt_freesec.c b/ext/standard/crypt_freesec.c index b7de5a4c02..0a54e3e836 100644 --- a/ext/standard/crypt_freesec.c +++ b/ext/standard/crypt_freesec.c @@ -218,7 +218,6 @@ _crypt_extended_init(void) uint32_t *p, *il, *ir, *fl, *fr; uint32_t *bits28, *bits24; u_char inv_key_perm[64]; - u_char u_key_perm[56]; u_char inv_comp_perm[56]; u_char init_perm[64], final_perm[64]; u_char u_sbox[8][64]; @@ -260,7 +259,6 @@ _crypt_extended_init(void) * compression permutation. */ for (i = 0; i < 56; i++) { - u_key_perm[i] = key_perm[i] - 1; inv_key_perm[key_perm[i] - 1] = i; inv_comp_perm[i] = 255; } @@ -633,7 +631,7 @@ _crypt_extended_r(const char *key, const char *setting, if (*key) key++; } - if (des_setkey((u_char *) keybuf, data)) + if (des_setkey((char *) keybuf, data)) return(NULL); if (*setting == _PASSWORD_EFMT1) { @@ -662,7 +660,7 @@ _crypt_extended_r(const char *key, const char *setting, /* * Encrypt the key with itself. */ - if (des_cipher((u_char *) keybuf, (u_char *) keybuf, + if (des_cipher((char *) keybuf, (char *) keybuf, 0, 1, data)) return(NULL); /* @@ -672,7 +670,7 @@ _crypt_extended_r(const char *key, const char *setting, while (q - (u_char *) keybuf < sizeof(keybuf) && *key) *q++ ^= *key++ << 1; - if (des_setkey((u_char *) keybuf, data)) + if (des_setkey((char *) keybuf, data)) return(NULL); } memcpy(data->output, setting, 9); diff --git a/ext/standard/css.c b/ext/standard/css.c index b805915b5e..73771ed79f 100644 --- a/ext/standard/css.c +++ b/ext/standard/css.c @@ -37,7 +37,7 @@ PHPAPI void php_info_print_css(void) /* {{{ */ PUTS(".p {text-align: left;}\n"); PUTS(".e {background-color: #ccf; width: 300px; font-weight: bold;}\n"); PUTS(".h {background-color: #99c; font-weight: bold;}\n"); - PUTS(".v {background-color: #ddd; max-width: 300px; overflow-x: auto;}\n"); + PUTS(".v {background-color: #ddd; max-width: 300px; overflow-x: auto; word-wrap: break-word;}\n"); PUTS(".v i {color: #999;}\n"); PUTS("img {float: right; border: 0;}\n"); PUTS("hr {width: 934px; background-color: #ccc; border: 0; height: 1px;}\n"); diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 55d777cb92..8dd0d5dfd7 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -116,7 +116,7 @@ PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value) } else if (type == 2) { /* strip trailing whitespaces */ l = bufl; - while (l >= 1 && l-- && isspace(((unsigned char *)buf)[l])); + while (l-- > 0 && isspace(((unsigned char *)buf)[l])); if (l != (bufl - 1)) { bufl = l + 1; buf[bufl] = '\0'; @@ -129,7 +129,7 @@ PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value) /* strip trailing whitespaces if we have not done so already */ if ((type == 2 && buf != b) || type != 2) { l = bufl; - while (l >= 1 && l-- && isspace(((unsigned char *)buf)[l])); + while (l-- > 0 && isspace(((unsigned char *)buf)[l])); if (l != (bufl - 1)) { bufl = l + 1; buf[bufl] = '\0'; diff --git a/ext/standard/image.c b/ext/standard/image.c index 0ea3abace2..edb0d50ea3 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -204,7 +204,7 @@ static struct gfxinfo *php_handle_swc(php_stream * stream) unsigned long len=64, szlength; int factor = 1,maxfactor = 16; int status = 0; - char *b, *buf = NULL; + unsigned char *b, *buf = NULL; zend_string *bufz; b = ecalloc(1, len + 1); @@ -212,7 +212,7 @@ static struct gfxinfo *php_handle_swc(php_stream * stream) if (php_stream_seek(stream, 5, SEEK_CUR)) return NULL; - if (php_stream_read(stream, a, sizeof(a)) != sizeof(a)) + if (php_stream_read(stream, (char *) a, sizeof(a)) != sizeof(a)) return NULL; if (uncompress(b, &len, a, sizeof(a)) != Z_OK) { @@ -232,8 +232,8 @@ static struct gfxinfo *php_handle_swc(php_stream * stream) do { szlength = ZSTR_LEN(bufz) * (1<<factor++); - buf = (char *) erealloc(buf, szlength); - status = uncompress(buf, &szlength, ZSTR_VAL(bufz), ZSTR_LEN(bufz)); + buf = erealloc(buf, szlength); + status = uncompress(buf, &szlength, (unsigned char *) ZSTR_VAL(bufz), ZSTR_LEN(bufz)); } while ((status==Z_BUF_ERROR)&&(factor<maxfactor)); if (bufz) { diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c index 4554be32db..c47f2c2133 100644 --- a/ext/standard/iptc.c +++ b/ext/standard/iptc.c @@ -238,6 +238,7 @@ PHP_FUNCTION(iptcembed) case M_APP13: /* we are going to write a new APP13 marker, so don't output the old one */ php_iptc_skip_variable(fp, 0, 0); + fgetc(fp); /* skip already copied 0xFF byte */ php_iptc_read_remaining(fp, spool, poi?&poi:0); done = 1; break; diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 8390bd79fe..6f10e9a313 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -161,7 +161,7 @@ PHPAPI char *php_strerror(int errnum); # define php_mb_reset() memset(&BG(mblen_state), 0, sizeof(BG(mblen_state))) #else # define php_mblen(ptr, len) mblen(ptr, len) -# define php_mb_reset() mblen(NULL, 0) +# define php_mb_reset() php_ignore_value(mblen(NULL, 0)) #endif void register_string_constants(INIT_FUNC_ARGS); diff --git a/ext/standard/string.c b/ext/standard/string.c index 4d5c72404f..bb482ba7a1 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2966,15 +2966,6 @@ static zend_string *php_strtr_ex(zend_string *str, char *str_from, char *str_to, } /* }}} */ -static int php_strtr_key_compare(const void *a, const void *b) /* {{{ */ -{ - Bucket *f = (Bucket *) a; - Bucket *s = (Bucket *) b; - - return f->h > s->h ? -1 : 1; -} -/* }}} */ - /* {{{ php_strtr_array */ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *pats) { diff --git a/ext/standard/tests/general_functions/bug70018-win32.phpt b/ext/standard/tests/general_functions/bug70018-win32.phpt new file mode 100644 index 0000000000..427d816e4a --- /dev/null +++ b/ext/standard/tests/general_functions/bug70018-win32.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #70018 (exec does not strip all whitespace), var 2 +--SKIPIF-- +<?php +if (substr(PHP_OS, 0, 3) != "WIN") { + die("skip.. only for Windows"); +} +if ("cli" != php_sapi_name()) { + die("skip.. CLI only test"); +} +?> +--FILE-- +<?php +$output = array(); + +$test_fl = dirname(__FILE__) . DIRECTORY_SEPARATOR . md5(uniqid()); +file_put_contents($test_fl, '<?php echo "abc\f\n \n";'); + +exec(PHP_BINARY . " -n $test_fl", $output); + +var_dump($output); + +@unlink($test_fl); +?> +--EXPECT-- +array(2) { + [0]=> + string(3) "abc" + [1]=> + string(0) "" +} diff --git a/ext/standard/tests/general_functions/bug70018.phpt b/ext/standard/tests/general_functions/bug70018.phpt new file mode 100644 index 0000000000..8685006092 --- /dev/null +++ b/ext/standard/tests/general_functions/bug70018.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #70018 (exec does not strip all whitespace), var 1 +--SKIPIF-- +<?php +if (substr(PHP_OS, 0, 3) == "WIN") { + die("skip.. not for Windows"); +} +?> +--FILE-- +<?php +$output = array(); +exec('/bin/echo -n -e "abc\f\n \n"',$output); +var_dump($output); +?> +--EXPECT-- +array(2) { + [0]=> + string(3) "abc" + [1]=> + string(0) "" +} diff --git a/ext/standard/tests/image/bug70096.phpt b/ext/standard/tests/image/bug70096.phpt new file mode 100644 index 0000000000..1674d07a73 --- /dev/null +++ b/ext/standard/tests/image/bug70096.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #70096 (Repeated iptcembed() adds superfluous FF bytes) +--SKIPIF-- +<?php +if (!extension_loaded('gd')) die('skip gd extension not available'); +?> +--FILE-- +<?php +$filename = __DIR__ . '/bug70096.jpg'; +$im = imagecreatetruecolor(10, 10); +imagejpeg($im, $filename); +imagedestroy($im); +$data = "\x1C\x02x\x00\x0ATest image" + . "\x1C\x02t\x00\x22Copyright 2008-2009, The PHP Group"; +$content1 = iptcembed($data, $filename); +$fp = fopen($filename, "wb"); +fwrite($fp, $content1); +fclose($fp); +$content2 = iptcembed($data, $filename); +$fp = fopen($filename, "wb"); +fwrite($fp, $content2); +fclose($fp); +var_dump($content1 === $content2); +?> +--CLEAN-- +<?php +$filename = __DIR__ . '/bug70096.jpg'; +@unlink($filename); +?> +--EXPECT-- +bool(true) diff --git a/ext/standard/tests/network/getprotobyname_basic.phpt b/ext/standard/tests/network/getprotobyname_basic.phpt new file mode 100644 index 0000000000..37cc26aa2b --- /dev/null +++ b/ext/standard/tests/network/getprotobyname_basic.phpt @@ -0,0 +1,10 @@ +--TEST-- +getprotobyname function basic test +--CREDITS-- +edgarsandi - <edgar.r.sandi@gmail.com> +--FILE-- +<?php + var_dump(getprotobyname('tcp')); +?> +--EXPECT-- +int(6) diff --git a/ext/standard/tests/network/getprotobyname_error.phpt b/ext/standard/tests/network/getprotobyname_error.phpt new file mode 100644 index 0000000000..7ee366ac7a --- /dev/null +++ b/ext/standard/tests/network/getprotobyname_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +getprotobyname function errors test +--CREDITS-- +edgarsandi - <edgar.r.sandi@gmail.com> +--FILE-- +<?php + // empty protocol name + var_dump(getprotobyname()); + + // invalid protocol name + var_dump(getprotobyname('abc')); +?> +--EXPECTF-- +Warning: getprotobyname() expects exactly 1 parameter, 0 given in %s on line %d +NULL +bool(false) diff --git a/ext/standard/tests/network/getprotobynumber_basic.phpt b/ext/standard/tests/network/getprotobynumber_basic.phpt new file mode 100644 index 0000000000..7850e60ffd --- /dev/null +++ b/ext/standard/tests/network/getprotobynumber_basic.phpt @@ -0,0 +1,10 @@ +--TEST-- +getprotobynumber function basic test +--CREDITS-- +edgarsandi - <edgar.r.sandi@gmail.com> +--FILE-- +<?php + var_dump(getprotobynumber(6)); +?> +--EXPECT-- +string(3) "tcp" diff --git a/ext/standard/tests/network/getprotobynumber_error.phpt b/ext/standard/tests/network/getprotobynumber_error.phpt new file mode 100644 index 0000000000..7df12e864a --- /dev/null +++ b/ext/standard/tests/network/getprotobynumber_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +getprotobynumber function errors test +--CREDITS-- +edgarsandi - <edgar.r.sandi@gmail.com> +--FILE-- +<?php + // empty protocol number + var_dump(getprotobynumber()); + + // invalid protocol number + var_dump(getprotobynumber(999)); +?> +--EXPECTF-- +Warning: getprotobynumber() expects exactly 1 parameter, 0 given in %s on line %d +NULL +bool(false) diff --git a/ext/standard/tests/strings/basename_variation.phpt b/ext/standard/tests/strings/basename_variation.phpt index 2d74a389ab..86b1cd296b 100644 --- a/ext/standard/tests/strings/basename_variation.phpt +++ b/ext/standard/tests/strings/basename_variation.phpt @@ -66,7 +66,10 @@ $file_path_variations = array ( /* empty paths */ array(""), array(''), - array(NULL) + array(NULL), + + /* invalid paths */ + array(chr(-1)), ); function check_basename( $path_arrays ) { @@ -232,4 +235,7 @@ string(0) "" --Iteration 48-- string(0) "" + +--Iteration 49-- +string(0) "" Done diff --git a/ext/standard/var.c b/ext/standard/var.c index 055110382b..b1f368f0c3 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -994,7 +994,7 @@ PHP_FUNCTION(serialize) } /* }}} */ -/* {{{ proto mixed unserialize(string variable_representation[, bool|array allowed_classes]) +/* {{{ proto mixed unserialize(string variable_representation[, array allowed_classes]) Takes a string representation of variable and recreates it */ PHP_FUNCTION(unserialize) { diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index edd0bcf85e..f570da6d50 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -991,10 +991,9 @@ static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetyp static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options) { zval *opt_val; - zend_ulong opt_indx; zend_string *opt_name; - ZEND_HASH_FOREACH_KEY_VAL(ht_options, opt_indx, opt_name, opt_val) { + ZEND_HASH_FOREACH_STR_KEY_VAL(ht_options, opt_name, opt_val) { if (opt_name == NULL) { continue; } diff --git a/ext/tokenizer/tests/parse_errors.phpt b/ext/tokenizer/tests/parse_errors.phpt index bfa6e07ac4..700326ff41 100644 --- a/ext/tokenizer/tests/parse_errors.phpt +++ b/ext/tokenizer/tests/parse_errors.phpt @@ -7,10 +7,19 @@ Parse errors during token_get_all() function test_parse_error($code) { try { - var_dump(token_get_all($code)); + var_dump(token_get_all($code, TOKEN_PARSE)); } catch (ParseError $e) { echo $e->getMessage(), "\n"; } + + foreach (token_get_all($code) as $token) { + if (is_array($token)) { + echo token_name($token[0]), " ($token[1])\n"; + } else { + echo "$token\n"; + } + } + echo "\n"; } test_parse_error('<?php var_dump(078);'); @@ -21,6 +30,37 @@ test_parse_error('<?php var_dump(078 + 078);'); ?> --EXPECT-- Invalid numeric literal +T_OPEN_TAG (<?php ) +T_STRING (var_dump) +( +T_LNUMBER (078) +) +; + Invalid UTF-8 codepoint escape sequence +T_OPEN_TAG (<?php ) +T_STRING (var_dump) +( +T_CONSTANT_ENCAPSED_STRING ("\u{xyz}") +) +; + Invalid UTF-8 codepoint escape sequence: Codepoint too large +T_OPEN_TAG (<?php ) +T_STRING (var_dump) +( +T_CONSTANT_ENCAPSED_STRING ("\u{ffffff}") +) +; + Invalid numeric literal +T_OPEN_TAG (<?php ) +T_STRING (var_dump) +( +T_LNUMBER (078) +T_WHITESPACE ( ) ++ +T_WHITESPACE ( ) +T_LNUMBER (078) +) +; diff --git a/ext/tokenizer/tokenizer.c b/ext/tokenizer/tokenizer.c index 63405ea6cd..50b47835dd 100644 --- a/ext/tokenizer/tokenizer.c +++ b/ext/tokenizer/tokenizer.c @@ -28,6 +28,7 @@ #include "php_tokenizer.h" #include "zend.h" +#include "zend_exceptions.h" #include "zend_language_scanner.h" #include "zend_language_scanner_defs.h" #include <zend_language_parser.h> @@ -46,6 +47,7 @@ void tokenizer_token_get_all_register_constants(INIT_FUNC_ARGS) { /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO_EX(arginfo_token_get_all, 0, 0, 1) ZEND_ARG_INFO(0, source) + ZEND_ARG_INFO(0, flags) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_token_name, 0, 0, 1) @@ -111,7 +113,6 @@ static zend_bool tokenize(zval *return_value, zend_string *source) zval token; zval keyword; int token_type; - zend_bool destroy; int token_line = 1; int need_tokens = -1; /* for __halt_compiler lexing. -1 = disabled */ @@ -126,24 +127,10 @@ static zend_bool tokenize(zval *return_value, zend_string *source) LANG_SCNG(yy_state) = yycINITIAL; array_init(return_value); - ZVAL_NULL(&token); + ZVAL_UNDEF(&token); while ((token_type = lex_scan(&token))) { - - if(token_type == T_ERROR) break; - - destroy = 1; - switch (token_type) { - case T_CLOSE_TAG: - if (zendtext[zendleng - 1] != '>') { - CG(zend_lineno)++; - } - case T_OPEN_TAG: - case T_OPEN_TAG_WITH_ECHO: - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - destroy = 0; - break; + if (token_type == T_CLOSE_TAG && zendtext[zendleng - 1] != '>') { + CG(zend_lineno)++; } if (token_type >= 256) { @@ -161,10 +148,11 @@ static zend_bool tokenize(zval *return_value, zend_string *source) } else { add_next_index_stringl(return_value, (char *)zendtext, zendleng); } - if (destroy && Z_TYPE(token) != IS_NULL) { + + if (Z_TYPE(token) != IS_UNDEF) { zval_dtor(&token); + ZVAL_UNDEF(&token); } - ZVAL_NULL(&token); /* after T_HALT_COMPILER collect the next three non-dropped tokens */ if (need_tokens != -1) { @@ -203,9 +191,9 @@ void on_event(zend_php_scanner_event event, int token, int line) HashTable *tokens_ht; zval *token_zv; - switch(event) { + switch (event) { case ON_TOKEN: - if (token == T_ERROR || token == END) break; + if (token == END) break; if (token >= 256) { array_init(&keyword); add_next_index_long(&keyword, token); @@ -277,7 +265,7 @@ static zend_bool tokenize_parse(zval *return_value, zend_string *source) /* }}} */ -/* {{{ proto array token_get_all(string source) +/* {{{ proto array token_get_all(string source [, int flags]) */ PHP_FUNCTION(token_get_all) { @@ -293,6 +281,8 @@ PHP_FUNCTION(token_get_all) success = tokenize_parse(return_value, source); } else { success = tokenize(return_value, source); + /* Normal token_get_all() should not throw. */ + zend_clear_exception(); } if (!success) RETURN_FALSE; diff --git a/ext/tokenizer/tokenizer_data_gen.sh b/ext/tokenizer/tokenizer_data_gen.sh index 49ef7cbfa3..65bf0de83b 100755 --- a/ext/tokenizer/tokenizer_data_gen.sh +++ b/ext/tokenizer/tokenizer_data_gen.sh @@ -46,7 +46,7 @@ echo '/* echo 'void tokenizer_register_constants(INIT_FUNC_ARGS) {' >> $OUTFILE $AWK ' - /^#define T_ERROR/ { next } + /^#define T_(NOELSE|ERROR)/ { next } /^#define T_/ { print " REGISTER_LONG_CONSTANT(\"" $2 "\", " $2 ", CONST_CS | CONST_PERSISTENT);" } ' < $INFILE >> $OUTFILE echo ' REGISTER_LONG_CONSTANT("T_DOUBLE_COLON", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);' >> $OUTFILE @@ -64,7 +64,7 @@ $AWK ' print " case T_PAAMAYIM_NEKUDOTAYIM: return \"T_DOUBLE_COLON\";" next } - /^#define T_ERROR/ { next } + /^#define T_(NOELSE|ERROR)/ { next } /^#define T_/ { print " case " $2 ": return \"" $2 "\";" } diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index d364115799..693ccef7b1 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -390,9 +390,8 @@ static void php_wddx_serialize_string(wddx_packet *packet, zval *var) php_wddx_add_chunk_static(packet, WDDX_STRING_S); if (Z_STRLEN_P(var) > 0) { - zend_string *buf; - - buf = php_escape_html_entities(Z_STRVAL_P(var), Z_STRLEN_P(var), 0, ENT_QUOTES, NULL); + zend_string *buf = php_escape_html_entities( + (unsigned char *) Z_STRVAL_P(var), Z_STRLEN_P(var), 0, ENT_QUOTES, NULL); php_wddx_add_chunk_ex(packet, ZSTR_VAL(buf), ZSTR_LEN(buf)); @@ -589,9 +588,7 @@ void php_wddx_serialize_var(wddx_packet *packet, zval *var, zend_string *name) if (name) { char *tmp_buf; - zend_string *name_esc; - - name_esc = php_escape_html_entities(ZSTR_VAL(name), ZSTR_LEN(name), 0, ENT_QUOTES, NULL); + zend_string *name_esc = php_escape_html_entities((unsigned char *) ZSTR_VAL(name), ZSTR_LEN(name), 0, ENT_QUOTES, NULL); tmp_buf = emalloc(ZSTR_LEN(name_esc) + sizeof(WDDX_VAR_S)); snprintf(tmp_buf, ZSTR_LEN(name_esc) + sizeof(WDDX_VAR_S), WDDX_VAR_S, ZSTR_VAL(name_esc)); php_wddx_add_chunk(packet, tmp_buf); @@ -736,7 +733,7 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X char tmp_buf[2]; snprintf(tmp_buf, sizeof(tmp_buf), "%c", (char)strtol((char *)atts[i], NULL, 16)); - php_wddx_process_data(user_data, tmp_buf, strlen(tmp_buf)); + php_wddx_process_data(user_data, (XML_Char *) tmp_buf, strlen(tmp_buf)); break; } } @@ -783,7 +780,7 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X if (atts) for (i = 0; atts[i]; i++) { if (!strcmp((char *)atts[i], EL_NAME) && atts[++i] && atts[i][0]) { - stack->varname = estrdup(atts[i]); + stack->varname = estrdup((char *)atts[i]); break; } } @@ -798,9 +795,9 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X if (!strcmp((char *)atts[i], "fieldNames") && atts[++i] && atts[i][0]) { zval tmp; char *key; - char *p1, *p2, *endp; + const char *p1, *p2, *endp; - endp = (char *)atts[i] + strlen(atts[i]); + endp = (char *)atts[i] + strlen((char *)atts[i]); p1 = (char *)atts[i]; while ((p2 = php_memnstr(p1, ",", sizeof(",")-1, endp)) != NULL) { key = estrndup(p1, p2 - p1); @@ -835,7 +832,7 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X if (wddx_stack_top(stack, (void**)&recordset) == SUCCESS && recordset->type == ST_RECORDSET && - (field = zend_hash_str_find(Z_ARRVAL(recordset->data), (char*)atts[i], strlen(atts[i]))) != NULL) { + (field = zend_hash_str_find(Z_ARRVAL(recordset->data), (char*)atts[i], strlen((char *)atts[i]))) != NULL) { ZVAL_COPY_VALUE(&ent.data, field); } @@ -877,9 +874,8 @@ static void php_wddx_pop_element(void *user_data, const XML_Char *name) wddx_stack_top(stack, (void**)&ent1); if (!strcmp((char *)name, EL_BINARY)) { - zend_string *new_str; - - new_str = php_base64_decode(Z_STRVAL(ent1->data), Z_STRLEN(ent1->data)); + zend_string *new_str = php_base64_decode( + (unsigned char *)Z_STRVAL(ent1->data), Z_STRLEN(ent1->data)); zval_ptr_dtor(&ent1->data); ZVAL_STR(&ent1->data, new_str); } @@ -1045,14 +1041,14 @@ int php_wddx_deserialize_ex(const char *value, size_t vallen, zval *return_value int retval; wddx_stack_init(&stack); - parser = XML_ParserCreate("UTF-8"); + parser = XML_ParserCreate((XML_Char *) "UTF-8"); XML_SetUserData(parser, &stack); XML_SetElementHandler(parser, php_wddx_push_element, php_wddx_pop_element); XML_SetCharacterDataHandler(parser, php_wddx_process_data); /* XXX value should be parsed in the loop to exhaust size_t */ - XML_Parse(parser, value, (int)vallen, 1); + XML_Parse(parser, (const XML_Char *) value, (int)vallen, 1); XML_ParserFree(parser); @@ -1204,7 +1200,7 @@ PHP_FUNCTION(wddx_packet_end) } /* }}} */ -/* {{{ proto int wddx_add_vars(resource packet_id, mixed var_names [, mixed ...]) +/* {{{ proto bool wddx_add_vars(resource packet_id, mixed var_names [, mixed ...]) Serializes given variables and adds them to packet given by packet_id */ PHP_FUNCTION(wddx_add_vars) { diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index f5a8fa8e33..51102fbc34 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -266,7 +266,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t if (node->children) { node = xmlNewDocNode(node->doc, NULL, (char *) node->children, node->name); } else { - node = xmlNewDocNode(node->doc, NULL, "xmlns", node->name); + node = xmlNewDocNode(node->doc, NULL, (const xmlChar *) "xmlns", node->name); } node->type = XML_NAMESPACE_DECL; node->parent = nsparent; @@ -282,7 +282,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t } break; default: - str = xmlXPathCastToString(obj); + str = (char *) xmlXPathCastToString(obj); ZVAL_STRING(&args[i], str); xmlFree(str); } @@ -302,7 +302,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t if (obj->stringval == NULL) { php_error_docref(NULL, E_WARNING, "Handler name must be a string"); xmlXPathFreeObject(obj); - valuePush(ctxt, xmlXPathNewString("")); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); if (fci.param_count > 0) { for (i = 0; i < nargs - 1; i++) { zval_ptr_dtor(&args[i]); @@ -311,7 +311,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t } return; } - ZVAL_STRING(&handler, obj->stringval); + ZVAL_STRING(&handler, (char *) obj->stringval); xmlXPathFreeObject(obj); ZVAL_COPY_VALUE(&fci.function_name, &handler); @@ -322,17 +322,17 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t /*fci.function_handler_cache = &function_ptr;*/ if (!zend_make_callable(&handler, &callable)) { php_error_docref(NULL, E_WARNING, "Unable to call handler %s()", ZSTR_VAL(callable)); - valuePush(ctxt, xmlXPathNewString("")); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } else if ( intern->registerPhpFunctions == 2 && zend_hash_exists(intern->registered_phpfunctions, callable) == 0) { php_error_docref(NULL, E_WARNING, "Not allowed to call handler '%s()'", ZSTR_VAL(callable)); /* Push an empty string, so that we at least have an xslt result... */ - valuePush(ctxt, xmlXPathNewString("")); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } else { result = zend_call_function(&fci, NULL); if (result == FAILURE) { if (Z_TYPE(handler) == IS_STRING) { php_error_docref(NULL, E_WARNING, "Unable to call handler %s()", Z_STRVAL(handler)); - valuePush(ctxt, xmlXPathNewString("")); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } /* retval is == NULL, when an exception occurred, don't report anything, because PHP itself will handle that */ } else if (Z_ISUNDEF(retval)) { @@ -353,10 +353,10 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t valuePush(ctxt, xmlXPathNewBoolean(Z_LVAL(retval))); } else if (Z_TYPE(retval) == IS_OBJECT) { php_error_docref(NULL, E_WARNING, "A PHP Object cannot be converted to a XPath-string"); - valuePush(ctxt, xmlXPathNewString("")); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } else { convert_to_string_ex(&retval); - valuePush(ctxt, xmlXPathNewString(Z_STRVAL(retval))); + valuePush(ctxt, xmlXPathNewString((xmlChar *) Z_STRVAL(retval))); } zval_ptr_dtor(&retval); } @@ -445,7 +445,7 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet) nodep = xmlDocGetRootElement(sheetp->doc); if (nodep && (nodep = nodep->children)) { while (nodep) { - if (nodep->type == XML_ELEMENT_NODE && xmlStrEqual(nodep->name, "key") && xmlStrEqual(nodep->ns->href, XSLT_NAMESPACE)) { + if (nodep->type == XML_ELEMENT_NODE && xmlStrEqual(nodep->name, (const xmlChar *) "key") && xmlStrEqual(nodep->ns->href, XSLT_NAMESPACE)) { intern->hasKeys = 1; break; } @@ -728,7 +728,7 @@ PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml) if (newdocp) { ret = xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, newdocp, sheetp); if (doc_txt_ptr && doc_txt_len) { - RETVAL_STRINGL(doc_txt_ptr, doc_txt_len); + RETVAL_STRINGL((char *) doc_txt_ptr, doc_txt_len); xmlFree(doc_txt_ptr); } xmlFreeDoc(newdocp); @@ -748,7 +748,6 @@ PHP_FUNCTION(xsl_xsltprocessor_set_parameter) zval *id; zval *array_value, *entry, new_string; xsl_object *intern; - zend_ulong idx; char *namespace; size_t namespace_len; zend_string *string_key, *name, *value; @@ -756,7 +755,7 @@ PHP_FUNCTION(xsl_xsltprocessor_set_parameter) if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "sa", &namespace, &namespace_len, &array_value) == SUCCESS) { intern = Z_XSL_P(id); - ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array_value), idx, string_key, entry) { + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(array_value), string_key, entry) { if (string_key == NULL) { php_error_docref(NULL, E_WARNING, "Invalid parameter array"); RETURN_FALSE; diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index c0705f8b31..b1e5a54300 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -26,9 +26,9 @@ /* Passed as opaque in malloc callbacks */ typedef struct _php_zlib_filter_data { z_stream strm; - char *inbuf; + unsigned char *inbuf; size_t inbuf_len; - char *outbuf; + unsigned char *outbuf; size_t outbuf_len; int persistent; zend_bool finished; @@ -112,7 +112,8 @@ static php_stream_filter_status_t php_zlib_inflate_filter( if (data->strm.avail_out < data->outbuf_len) { php_stream_bucket *out_bucket; size_t bucketlen = data->outbuf_len - data->strm.avail_out; - out_bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0); + out_bucket = php_stream_bucket_new( + stream, estrndup((char *) data->outbuf, bucketlen), bucketlen, 1, 0); php_stream_bucket_append(buckets_out, out_bucket); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; @@ -136,7 +137,8 @@ static php_stream_filter_status_t php_zlib_inflate_filter( if (data->strm.avail_out < data->outbuf_len) { size_t bucketlen = data->outbuf_len - data->strm.avail_out; - bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0); + bucket = php_stream_bucket_new( + stream, estrndup((char *) data->outbuf, bucketlen), bucketlen, 1, 0); php_stream_bucket_append(buckets_out, bucket); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; @@ -226,7 +228,8 @@ static php_stream_filter_status_t php_zlib_deflate_filter( php_stream_bucket *out_bucket; size_t bucketlen = data->outbuf_len - data->strm.avail_out; - out_bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0); + out_bucket = php_stream_bucket_new( + stream, estrndup((char *) data->outbuf, bucketlen), bucketlen, 1, 0); php_stream_bucket_append(buckets_out, out_bucket); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; @@ -245,7 +248,8 @@ static php_stream_filter_status_t php_zlib_deflate_filter( if (data->strm.avail_out < data->outbuf_len) { size_t bucketlen = data->outbuf_len - data->strm.avail_out; - bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0); + bucket = php_stream_bucket_new( + stream, estrndup((char *) data->outbuf, bucketlen), bucketlen, 1, 0); php_stream_bucket_append(buckets_out, bucket); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; diff --git a/main/php.h b/main/php.h index 1d2c2dc099..3ebaa1a0b9 100644 --- a/main/php.h +++ b/main/php.h @@ -257,11 +257,7 @@ END_EXTERN_C() # endif #endif -#if defined(__GNUC__) && __GNUC__ >= 4 -# define php_ignore_value(x) (({ __typeof__ (x) __x = (x); (void) __x; })) -#else -# define php_ignore_value(x) ((void) (x)) -#endif +#define php_ignore_value(x) ZEND_IGNORE_VALUE(x) /* global variables */ #if !defined(PHP_WIN32) diff --git a/main/spprintf.c b/main/spprintf.c index 759372b370..4594fb7605 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -838,7 +838,6 @@ skip_output: PHPAPI size_t vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */ { smart_string buf = {0}; - size_t result; /* since there are places where (v)spprintf called without checking for null, a bit of defensive coding here */ @@ -855,13 +854,11 @@ PHPAPI size_t vspprintf(char **pbuf, size_t max_len, const char *format, va_list if (buf.c) { *pbuf = buf.c; - result = buf.len; + return buf.len; } else { - *pbuf = NULL; - result = 0; + *pbuf = estrndup("", 0); + return 0; } - - return result; } /* }}} */ @@ -883,11 +880,15 @@ PHPAPI zend_string *vstrpprintf(size_t max_len, const char *format, va_list ap) xbuf_format_converter(&buf, 0, format, ap); - if (max_len && buf.s && ZSTR_LEN(buf.s) > max_len) { + if (!buf.s) { + return ZSTR_EMPTY_ALLOC(); + } + + if (max_len && ZSTR_LEN(buf.s) > max_len) { ZSTR_LEN(buf.s) = max_len; } - smart_str_0(&buf); + smart_str_0(&buf); return buf.s; } /* }}} */ diff --git a/php.ini-development b/php.ini-development index 6b96d6b599..592a042732 100644 --- a/php.ini-development +++ b/php.ini-development @@ -886,7 +886,6 @@ default_socket_timeout = 60 ;extension=php_pdo_pgsql.dll ;extension=php_pdo_sqlite.dll ;extension=php_pgsql.dll -;extension=php_pspell.dll ;extension=php_shmop.dll ; The MIBS data available in the PHP distribution must be installed. diff --git a/php.ini-production b/php.ini-production index 2c23acb47d..9febdf8232 100644 --- a/php.ini-production +++ b/php.ini-production @@ -886,7 +886,6 @@ default_socket_timeout = 60 ;extension=php_pdo_pgsql.dll ;extension=php_pdo_sqlite.dll ;extension=php_pgsql.dll -;extension=php_pspell.dll ;extension=php_shmop.dll ; The MIBS data available in the PHP distribution must be installed. diff --git a/run-tests.php b/run-tests.php index 1251d3f96d..ba44ce5464 100755 --- a/run-tests.php +++ b/run-tests.php @@ -141,6 +141,7 @@ if ((substr(PHP_OS, 0, 3) == "WIN") && empty($environment["SystemRoot"])) { $php = null; $php_cgi = null; +$phpdbg = null; if (getenv('TEST_PHP_EXECUTABLE')) { $php = getenv('TEST_PHP_EXECUTABLE'); @@ -158,6 +159,16 @@ if (getenv('TEST_PHP_EXECUTABLE')) { $php_cgi = null; } } + + if (!getenv('TEST_PHPDBG_EXECUTABLE')) { + $phpdbg = $cwd . '/sapi/phpdbg/phpdbg'; + + if (file_exists($phpdbg)) { + putenv("TEST_PHP_CGI_EXECUTABLE=$phpdbg"); + } else { + $phpdbg = null; + } + } } $environment['TEST_PHP_EXECUTABLE'] = $php; } @@ -173,6 +184,17 @@ if (getenv('TEST_PHP_CGI_EXECUTABLE')) { $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi; } +if (getenv('TEST_PHPDBG_EXECUTABLE')) { + $phpdbg = getenv('TEST_PHPDBG_EXECUTABLE'); + + if ($phpdbg=='auto') { + $phpdbg = $cwd . '/sapi/phpdbg/phpdbg'; + putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg"); + } + + $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg; +} + function verify_config() { global $php; @@ -247,7 +269,7 @@ $no_file_cache = '-d opcache.file_cache= -d opcache.file_cache_only=0'; function write_information($show_html) { - global $cwd, $php, $php_cgi, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $leak_check, $valgrind_header, $no_file_cache; + global $cwd, $php, $php_cgi, $phpdbg, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $leak_check, $valgrind_header, $no_file_cache; // Get info from php $info_file = __DIR__ . '/run-test-info.php'; @@ -274,6 +296,14 @@ More .INIs : " , (function_exists(\'php_ini_scanned_files\') ? str_replace("\n" $php_cgi_info = ''; } + if ($phpdbg) { + $phpdbg_info = `$phpdbg $pass_options $info_params $no_file_cache -qrr "$info_file"`; + $php_info_sep = "\n---------------------------------------------------------------------"; + $phpdbg_info = "$php_info_sep\nPHP : $phpdbg $phpdbg_info$php_info_sep"; + } else { + $phpdbg_info = ''; + } + @unlink($info_file); // load list of enabled extensions @@ -299,7 +329,7 @@ More .INIs : " , (function_exists(\'php_ini_scanned_files\') ? str_replace("\n" // Write test context information. echo " ===================================================================== -PHP : $php $php_info $php_cgi_info +PHP : $php $php_info $php_cgi_info $phpdbg_info CWD : $cwd Extra dirs : "; foreach ($user_tests as $test_dir) { @@ -1205,6 +1235,10 @@ function run_test($php, $file, $env) $php_cgi = $env['TEST_PHP_CGI_EXECUTABLE']; } + if (isset($env['TEST_PHPDBG_EXECUTABLE'])) { + $phpdbg = $env['TEST_PHPDBG_EXECUTABLE']; + } + if (is_array($file)) { $file = $file[0]; } @@ -1290,7 +1324,7 @@ TEST $file } else { - if (@count($section_text['FILE']) + @count($section_text['FILEEOF']) + @count($section_text['FILE_EXTERNAL']) != 1) { + if (!isset($section_text['PHPDBG']) && @count($section_text['FILE']) + @count($section_text['FILEEOF']) + @count($section_text['FILE_EXTERNAL']) != 1) { $bork_info = "missing section --FILE--"; $borked = true; } @@ -1372,6 +1406,38 @@ TEST $file } } + /* For phpdbg tests, check if phpdbg sapi is available and if it is, use it. */ + if (array_key_exists('PHPDBG', $section_text)) { + if (!isset($section_text['STDIN'])) { + $section_text['STDIN'] = $section_text['PHPDBG']."\n"; + } + + if (isset($phpdbg)) { + $old_php = $php; + $php = $phpdbg . ' -qIb'; + } else if (!strncasecmp(PHP_OS, "win", 3) && file_exists(dirname($php) . "/phpdbg.exe")) { + $old_php = $php; + $php = realpath(dirname($php) . "/phpdbg.exe") . ' -qIb '; + } else { + if (file_exists(dirname($php) . "/../../sapi/phpdbg/phpdbg")) { + $old_php = $php; + $php = realpath(dirname($php) . "/../../sapi/phpdbg/phpdbg") . ' -qIb '; + } else if (file_exists("./sapi/phpdbg/phpdbg")) { + $old_php = $php; + $php = realpath("./sapi/phpdbg/phpdbg") . ' -qIb '; + } else if (file_exists(dirname($php) . "/phpdbg")) { + $old_php = $php; + $php = realpath(dirname($php) . "/phpdbg") . ' -qIb '; + } else { + show_result('SKIP', $tested, $tested_file, "reason: phpdbg not available"); + + junit_init_suite(junit_get_suitename_for($shortname)); + junit_mark_test_as('SKIP', $shortname, $tested, 0, 'phpdbg not available'); + return 'SKIPPED'; + } + } + } + if (!$SHOW_ONLY_GROUPS) { show_test($test_idx, $shortname); } @@ -1652,8 +1718,12 @@ TEST $file } // We've satisfied the preconditions - run the test! - show_file_block('php', $section_text['FILE'], 'TEST'); - save_text($test_file, $section_text['FILE'], $temp_file); + if (isset($section_text['FILE'])) { + show_file_block('php', $section_text['FILE'], 'TEST'); + save_text($test_file, $section_text['FILE'], $temp_file); + } else { + $test_file = $temp_file = ""; + } if (array_key_exists('GET', $section_text)) { $query_string = trim($section_text['GET']); @@ -1741,7 +1811,7 @@ TEST $file $env['REQUEST_METHOD'] = 'PUT'; if (empty($request)) { - junit_mark_test_as('BORK', $shortname, $tested, null, 'empty $request'); + junit_mark_test_as('BORK', $shortname, $tested, null, 'empty $request'); return 'BORKED'; } @@ -1765,34 +1835,33 @@ TEST $file $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; - } else if (array_key_exists('GZIP_POST', $section_text) && !empty($section_text['GZIP_POST'])) { - - $post = trim($section_text['GZIP_POST']); - $post = gzencode($post, 9, FORCE_GZIP); - $env['HTTP_CONTENT_ENCODING'] = 'gzip'; + } else if (array_key_exists('GZIP_POST', $section_text) && !empty($section_text['GZIP_POST'])) { - save_text($tmp_post, $post); - $content_length = strlen($post); + $post = trim($section_text['GZIP_POST']); + $post = gzencode($post, 9, FORCE_GZIP); + $env['HTTP_CONTENT_ENCODING'] = 'gzip'; - $env['REQUEST_METHOD'] = 'POST'; - $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - $env['CONTENT_LENGTH'] = $content_length; + save_text($tmp_post, $post); + $content_length = strlen($post); - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $env['REQUEST_METHOD'] = 'POST'; + $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; + $env['CONTENT_LENGTH'] = $content_length; - } else if (array_key_exists('DEFLATE_POST', $section_text) && !empty($section_text['DEFLATE_POST'])) { - $post = trim($section_text['DEFLATE_POST']); - $post = gzcompress($post, 9); - $env['HTTP_CONTENT_ENCODING'] = 'deflate'; - save_text($tmp_post, $post); - $content_length = strlen($post); + $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; - $env['REQUEST_METHOD'] = 'POST'; - $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - $env['CONTENT_LENGTH'] = $content_length; + } else if (array_key_exists('DEFLATE_POST', $section_text) && !empty($section_text['DEFLATE_POST'])) { + $post = trim($section_text['DEFLATE_POST']); + $post = gzcompress($post, 9); + $env['HTTP_CONTENT_ENCODING'] = 'deflate'; + save_text($tmp_post, $post); + $content_length = strlen($post); - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $env['REQUEST_METHOD'] = 'POST'; + $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; + $env['CONTENT_LENGTH'] = $content_length; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; } else { diff --git a/sapi/phpdbg/config.m4 b/sapi/phpdbg/config.m4 index 87d38ea8c5..1e4714e77a 100644 --- a/sapi/phpdbg/config.m4 +++ b/sapi/phpdbg/config.m4 @@ -3,7 +3,7 @@ dnl $Id$ dnl PHP_ARG_ENABLE(phpdbg, for phpdbg support, -[ --enable-phpdbg Build phpdbg], no, no) +[ --enable-phpdbg Build phpdbg], yes, yes) PHP_ARG_ENABLE(phpdbg-webhelper, for phpdbg web SAPI support, [ --enable-phpdbg-webhelper Build phpdbg web SAPI support], yes, yes) diff --git a/sapi/phpdbg/create-test.php b/sapi/phpdbg/create-test.php new file mode 100644 index 0000000000..6de10bd56f --- /dev/null +++ b/sapi/phpdbg/create-test.php @@ -0,0 +1,150 @@ +#!/usr/bin/env php +<?php + +/* + +----------------------------------------------------------------------+ + | PHP Version 7 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2015 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Bob Weinand <bwoebi@php.net> | + +----------------------------------------------------------------------+ +*/ + +##### +## This is just a helper for intercepting stdin/stdout and the file and create a half-finished test. +## The output still may need adapting to match file names etc. +##### + +error_reporting(-1); + +$phpdbg = getenv('TEST_PHPDBG_EXECUTABLE') ?: null; +$pass_options = ' -qbI -n -d "error_reporting=32767" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0"'; +$file = ""; +$cmdargv = ""; + +if (isset($argc) && $argc > 1) { + $post_ddash = false; + for ($i = 1; $i < $argc; $i++) { + if ($argv[$i][0] == "-" && !$post_ddash) { + switch (substr($argv[$i], 1)) { + case "p": + $phpdbg = $argv[++$i]; + break; + case "n": + $pass_options .= " -n"; + break; + case "d": + $pass_options .= " -d ".escapeshellarg($argv[++$i]); + $ini[] = $argv[$i]; + break; + case "-": + $post_ddash = true; + break; + } + } else { + $real_argv[] = $argv[$i]; + } + } + if (isset($real_argv[0])) { + $file = realpath($real_argv[0]); + $cmdargv = implode(" ", array_map("escapeshellarg", array_slice($real_argv, 1))); + } +} + +$proc = proc_open("$phpdbg $pass_options $file -- $cmdargv", [["pipe", "r"], ["pipe", "w"], ["pipe", "w"]], $pipes); +if (!$proc) { + die("Couldn't start phpdbg\n"); +} + +$input = $output = ""; + +stream_set_blocking(STDIN, false); + +do { + $r = [$pipes[1], STDIN]; + $w = $e = null; + $n = @stream_select($r, $w, $e, null); + + if ($n > 0) { + if ("" != $in = fread(STDIN, 1024)) { + $input .= $in; + fwrite($pipes[0], $in); + continue; + } + + if (feof(STDIN)) { + die("stdin closed?!\n"); + } + + if (feof($pipes[1])) { + $n = false; + } else { + $output .= $c = fgetc($pipes[1]); + echo $c; + } + } +} while ($n !== false); + +stream_set_blocking(STDIN, true); + +print "\n"; +if (!isset($name)) { + print "Specifiy the test description: "; + $desc = trim(fgets(STDIN)); +} +while (!isset($testfile)) { + print "Specifiy the test file name (leave empty to write to stderr): "; + $testfile = trim(fgets(STDIN)); + if ($testfile != "" && file_exists($testfile)) { + print "That file already exists. Type y or yes to overwrite: "; + $y = trim(fgets(STDIN)); + if ($y !== "y" && $y !== "yes") { + unset($testfile); + } + } +} + +$output = str_replace("string(".strlen($file).") \"$file\"", 'string(%d) "%s"', $output); +$output = str_replace($file, "%s", $output); +$input = trim($input); + +$testdata = <<<TEST +--TEST-- +$desc +--PHPDBG-- +$input +--EXPECTF-- +$output +TEST; + +if (!empty($ini)) { + $testdata .= "\n--INI--\n".implode("\n", $ini); +} +if ($cmdargv != "") { + $testdata .= "\n--ARGS--\n$cmdargv"; +} +if ($file != "") { + $testdata .= "\n--FILE--\n".file_get_contents($file); +} + +if ($testfile == "") { + print "\n"; +} elseif (file_put_contents($testfile, $testdata)) { + print "Test saved to $testfile\n"; +} else { + print "The test could not be saved to $testfile; outputting on stderr now\n"; + $testfile = ""; +} + +if ($testfile == "") { + fwrite(STDERR, $testdata); +} diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 31dab3f274..d594601f29 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -111,6 +111,8 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->sigsafe_mem.mem = NULL; pg->sigsegv_bailout = NULL; + pg->oplog_list = NULL; + #ifdef PHP_WIN32 pg->sigio_watcher_thread = INVALID_HANDLE_VALUE; memset(&pg->swd, 0, sizeof(struct win32_sigio_watcher_data)); @@ -441,16 +443,54 @@ static PHP_FUNCTION(phpdbg_start_oplog) PHPDBG_G(oplog_list)->start = PHPDBG_G(oplog_cur); } +static void phpdbg_oplog_fill_executable(zend_op_array *op_array, HashTable *insert_ht, zend_bool by_opcode) { + /* ignore RECV_* opcodes */ + zend_op *cur = op_array->opcodes + op_array->num_args + !!(op_array->fn_flags & ZEND_ACC_VARIADIC); + zend_op *end = op_array->opcodes + op_array->last; + + zend_long insert_idx; + zval zero; + ZVAL_LONG(&zero, 0); + + /* ignore autogenerated return (well, not too precise with finally branches, but that's okay) */ + if (op_array->last > 1 && (end - 1)->opcode == ZEND_RETURN && ((end - 2)->opcode == ZEND_RETURN || (end - 2)->opcode == ZEND_GENERATOR_RETURN || (end - 2)->opcode == ZEND_THROW)) { + end--; + } + + for (; cur < end; cur++) { + if (cur->opcode == ZEND_NOP || cur->opcode == ZEND_OP_DATA || cur->opcode == ZEND_FE_FREE || cur->opcode == ZEND_FREE || cur->opcode == ZEND_ASSERT_CHECK + || cur->opcode == ZEND_DECLARE_CONST || cur->opcode == ZEND_DECLARE_CLASS || cur->opcode == ZEND_DECLARE_INHERITED_CLASS || cur->opcode == ZEND_DECLARE_FUNCTION + || cur->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED || cur->opcode == ZEND_VERIFY_ABSTRACT_CLASS || cur->opcode == ZEND_ADD_TRAIT || cur->opcode == ZEND_BIND_TRAITS + || cur->opcode == ZEND_DECLARE_ANON_CLASS || cur->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS || cur->opcode == ZEND_FAST_RET || cur->opcode == ZEND_TICKS + || cur->opcode == ZEND_EXT_STMT || cur->opcode == ZEND_EXT_FCALL_BEGIN || cur->opcode == ZEND_EXT_FCALL_END || cur->opcode == ZEND_EXT_NOP || cur->opcode == ZEND_BIND_GLOBAL) { + continue; + } + + if (by_opcode) { + insert_idx = cur - op_array->opcodes; + } else { + insert_idx = cur->lineno; + } + + if (cur->opcode == ZEND_NEW && (cur + 1)->opcode == ZEND_DO_FCALL) { + cur++; + } + + zend_hash_index_update(insert_ht, insert_idx, &zero); + } +} + /* {{{ proto void phpdbg_end_oplog() */ static PHP_FUNCTION(phpdbg_end_oplog) { - phpdbg_oplog_entry *cur = PHPDBG_G(oplog_list)->start; - phpdbg_oplog_list *prev = PHPDBG_G(oplog_list)->prev; + phpdbg_oplog_entry *cur; + phpdbg_oplog_list *prev; - HashTable *options; + HashTable *options = NULL; zval *option_buffer; zend_bool by_function = 0; zend_bool by_opcode = 0; + zend_bool show_unexecuted = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|H", &options) == FAILURE) { return; @@ -461,6 +501,9 @@ static PHP_FUNCTION(phpdbg_end_oplog) return; } + cur = PHPDBG_G(oplog_list)->start; + prev = PHPDBG_G(oplog_list)->prev; + efree(PHPDBG_G(oplog_list)); PHPDBG_G(oplog_list) = prev; @@ -474,6 +517,10 @@ static PHP_FUNCTION(phpdbg_end_oplog) } } + if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("show_unexecuted")))) { + show_unexecuted = zend_is_true(option_buffer); + } + array_init(return_value); { @@ -488,6 +535,9 @@ static PHP_FUNCTION(phpdbg_end_oplog) do { zend_op_array *op_array = cur->op_array; + zval zero; + ZVAL_LONG(&zero, 0); + if (op_array->filename != last_file) { last_file = op_array->filename; file_buf = zend_hash_find(Z_ARR_P(return_value), last_file); @@ -495,28 +545,41 @@ static PHP_FUNCTION(phpdbg_end_oplog) zval ht; array_init(&ht); file_buf = zend_hash_add_new(Z_ARR_P(return_value), last_file, &ht); + + if (show_unexecuted) { + phpdbg_oplog_fill_executable(op_array, Z_ARR_P(file_buf), by_opcode); + } } + insert_ht = Z_ARR_P(file_buf); } - insert_ht = Z_ARR_P(file_buf); if (by_function) { - if (op_array->function_name != last_function || op_array->scope != last_scope) { + if (op_array->function_name == NULL) { + if (last_function != NULL) { + insert_ht = Z_ARR_P(file_buf); + } + last_function = NULL; + } else if (op_array->function_name != last_function || op_array->scope != last_scope) { zend_string *fn_name; last_function = op_array->function_name; last_scope = op_array->scope; if (last_scope == NULL) { fn_name = zend_string_copy(last_function); } else { - fn_name = strpprintf(ZSTR_LEN(last_function) + ZSTR_LEN(last_scope->name) + 2, "%.*s::%.*s", ZSTR_LEN(last_function), ZSTR_VAL(last_function), ZSTR_LEN(last_scope->name), ZSTR_VAL(last_scope->name)); + fn_name = strpprintf(ZSTR_LEN(last_function) + ZSTR_LEN(last_scope->name) + 2, "%.*s::%.*s", ZSTR_LEN(last_scope->name), ZSTR_VAL(last_scope->name), ZSTR_LEN(last_function), ZSTR_VAL(last_function)); } fn_buf = zend_hash_find(Z_ARR_P(return_value), fn_name); if (!fn_buf) { zval ht; array_init(&ht); fn_buf = zend_hash_add_new(Z_ARR_P(return_value), fn_name, &ht); + + if (show_unexecuted) { + phpdbg_oplog_fill_executable(op_array, Z_ARR_P(fn_buf), by_opcode); + } } + insert_ht = Z_ARR_P(fn_buf); } - insert_ht = Z_ARR_P(fn_buf); } if (by_opcode) { @@ -528,9 +591,7 @@ static PHP_FUNCTION(phpdbg_end_oplog) { zval *num = zend_hash_index_find(insert_ht, insert_idx); if (!num) { - zval zv; - ZVAL_LONG(&zv, 0); - num = zend_hash_index_add_new(insert_ht, insert_idx, &zv); + num = zend_hash_index_add_new(insert_ht, insert_idx, &zero); } Z_LVAL_P(num)++; } @@ -709,6 +770,8 @@ static int php_sapi_phpdbg_deactivate(void) /* {{{ */ pg->prompt[1] = PHPDBG_G(prompt)[1]; memcpy(pg->colors, PHPDBG_G(colors), sizeof(pg->colors)); pg->eol = PHPDBG_G(eol); + pg->input_buflen = PHPDBG_G(input_buflen); + memcpy(pg->input_buffer, PHPDBG_G(input_buffer), pg->input_buflen); pg->flags = PHPDBG_G(flags) & PHPDBG_PRESERVE_FLAGS_MASK; } @@ -1169,7 +1232,7 @@ int main(int argc, char **argv) /* {{{ */ char *php_optarg; int php_optind, opt, show_banner = 1; long cleaning = -1; - zend_bool quit_immediately = 0; + volatile zend_bool quit_immediately = 0; /* somehow some gcc release builds will play a bit around with order in combination with setjmp..., hence volatile */ zend_bool remote = 0; zend_phpdbg_globals *settings = NULL; char *bp_tmp = NULL; @@ -1390,11 +1453,8 @@ phpdbg_main: } /* set exec if present on command line */ - if (!exec && (argc > php_optind) && (strcmp(argv[php_optind-1], "--") != SUCCESS)) { - if (strlen(argv[php_optind])) { - if (exec) { - free(exec); - } + if (argc > php_optind && (strcmp(argv[php_optind-1], "--") != SUCCESS)) { + if (!exec && strlen(argv[php_optind])) { exec = strdup(argv[php_optind]); } php_optind++; @@ -1473,7 +1533,7 @@ phpdbg_main: /* setup remote server if necessary */ if (cleaning <= 0 && listen > 0) { server = phpdbg_open_socket(address, listen); - if (-1 > server || phpdbg_remote_init(address, listen, server, &socket, &stream) == FAILURE) { + if (-1 > server || phpdbg_remote_init(address, listen, server, &socket, &stream) == FAILURE) { exit(0); } @@ -1525,6 +1585,14 @@ phpdbg_main: PHPDBG_G(sapi_name_ptr) = sapi_name; + if (exec) { /* set execution context */ + PHPDBG_G(exec) = phpdbg_resolve_path(exec); + PHPDBG_G(exec_len) = PHPDBG_G(exec) ? strlen(PHPDBG_G(exec)) : 0; + + free(exec); + exec = NULL; + } + php_output_activate(); php_output_deactivate(); @@ -1538,7 +1606,7 @@ phpdbg_main: for (i = SG(request_info).argc; --i;) { SG(request_info).argv[i] = estrdup(argv[php_optind - 1 + i]); } - SG(request_info).argv[i] = exec ? estrdup(exec) : estrdup(""); + SG(request_info).argv[0] = PHPDBG_G(exec) ? estrdup(PHPDBG_G(exec)) : estrdup(""); php_hash_environment(); } @@ -1599,14 +1667,6 @@ phpdbg_main: php_stream_stdio_ops.write = phpdbg_stdiop_write; #endif - if (exec) { /* set execution context */ - PHPDBG_G(exec) = phpdbg_resolve_path(exec); - PHPDBG_G(exec_len) = PHPDBG_G(exec) ? strlen(PHPDBG_G(exec)) : 0; - - free(exec); - exec = NULL; - } - if (oplog_file) { /* open oplog */ PHPDBG_G(oplog) = fopen(oplog_file, "w+"); if (!PHPDBG_G(oplog)) { @@ -1654,7 +1714,7 @@ phpdbg_main: /* auto compile */ if (PHPDBG_G(exec)) { - if (settings) { + if (settings || phpdbg_startup_run > 0) { PHPDBG_G(flags) |= PHPDBG_DISCARD_OUTPUT; } @@ -1674,6 +1734,8 @@ phpdbg_main: goto phpdbg_out; } + PG(during_request_startup) = 0; + phpdbg_fully_started = 1; /* #ifndef for making compiler shutting up */ @@ -1771,7 +1833,7 @@ phpdbg_out: { int i; /* free argv */ - for (i = SG(request_info).argc; --i;) { + for (i = SG(request_info).argc; i--;) { efree(SG(request_info).argv[i]); } efree(SG(request_info).argv); @@ -1813,7 +1875,9 @@ phpdbg_out: } zend_end_try(); if ((PHPDBG_G(flags) & (PHPDBG_IS_QUITTING | PHPDBG_IS_RUNNING)) == PHPDBG_IS_RUNNING) { - phpdbg_notice("stop", "type=\"normal\"", "Script ended normally"); + if (!quit_immediately && !phpdbg_startup_run) { + phpdbg_notice("stop", "type=\"normal\"", "Script ended normally"); + } cleaning++; } @@ -1832,6 +1896,9 @@ phpdbg_out: } if ((cleaning > 0 || remote) && !quit_immediately) { + /* reset internal php_getopt state */ + php_getopt(-1, argv, OPTIONS, NULL, &php_optind, 0, 0); + goto phpdbg_main; } diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h index 7fb8083793..f900866211 100644 --- a/sapi/phpdbg/phpdbg.h +++ b/sapi/phpdbg/phpdbg.h @@ -100,9 +100,8 @@ /* {{{ strings */ #define PHPDBG_NAME "phpdbg" #define PHPDBG_AUTHORS "Felipe Pena, Joe Watkins and Bob Weinand" /* Ordered by last name */ -#define PHPDBG_URL "http://phpdbg.com" -#define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" -#define PHPDBG_VERSION "0.4.0" +#define PHPDBG_ISSUES "http://bugs.php.net/report.php" +#define PHPDBG_VERSION "0.5.0" #define PHPDBG_INIT_FILENAME ".phpdbginit" #define PHPDBG_DEFAULT_PROMPT "prompt>" /* }}} */ diff --git a/sapi/phpdbg/phpdbg_bp.c b/sapi/phpdbg/phpdbg_bp.c index 1c06646f0e..60c68e2cc3 100644 --- a/sapi/phpdbg/phpdbg_bp.c +++ b/sapi/phpdbg/phpdbg_bp.c @@ -285,7 +285,7 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num) /* { phpdbg_debug("Compare against loaded %s\n", file); if (!(pending = ((fileht = phpdbg_resolve_pending_file_break_ex(ZSTR_VAL(file), ZSTR_LEN(file), path_str, broken)) == NULL))) { - new_break = *(phpdbg_breakfile_t *) zend_hash_index_find_ptr(broken, line_num); + new_break = *(phpdbg_breakfile_t *) zend_hash_index_find_ptr(fileht, line_num); break; } } ZEND_HASH_FOREACH_END(); @@ -310,7 +310,13 @@ PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uin { phpdbg_debug("file: %s, filelen: %u, cur: %s, curlen %u, pos: %c, memcmp: %d\n", file, filelen, ZSTR_VAL(cur), ZSTR_LEN(cur), filelen > ZSTR_LEN(cur) ? file[filelen - ZSTR_LEN(cur) - 1] : '?', filelen > ZSTR_LEN(cur) ? memcmp(file + filelen - ZSTR_LEN(cur), ZSTR_VAL(cur), ZSTR_LEN(cur)) : 0); - if (((ZSTR_LEN(cur) < filelen && file[filelen - ZSTR_LEN(cur) - 1] == '/') || filelen == ZSTR_LEN(cur)) && !memcmp(file + filelen - ZSTR_LEN(cur), ZSTR_VAL(cur), ZSTR_LEN(cur))) { +#ifdef _WIN32 +# define WIN32_PATH_CHECK file[filelen - ZSTR_LEN(cur) - 1] == '\\' +#else +# define WIN32_PATH_CHECK 0 +#endif + + if (((ZSTR_LEN(cur) < filelen && (file[filelen - ZSTR_LEN(cur) - 1] == '/' || WIN32_PATH_CHECK)) || filelen == ZSTR_LEN(cur)) && !memcmp(file + filelen - ZSTR_LEN(cur), ZSTR_VAL(cur), ZSTR_LEN(cur))) { phpdbg_breakfile_t *brake, new_brake; HashTable *master; @@ -327,8 +333,7 @@ PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uin new_brake.filename = estrndup(file, filelen); PHPDBG_BREAK_UNMAPPING(brake->id); - if (master) { - zend_hash_index_update_mem(master, brake->line, &new_brake, sizeof(phpdbg_breakfile_t)); + if (zend_hash_index_add_mem(master, brake->line, &new_brake, sizeof(phpdbg_breakfile_t))) { PHPDBG_BREAK_MAPPING(brake->id, master); } } ZEND_HASH_FOREACH_END(); @@ -364,6 +369,15 @@ PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file) /* {{{ */ PHPDBG_API void phpdbg_set_breakpoint_symbol(const char *name, size_t name_len) /* {{{ */ { + char *lcname; + + if (*name == '\\') { + name++; + name_len--; + } + + lcname = zend_str_tolower_dup(name, name_len); + if (!zend_hash_str_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], name, name_len)) { phpdbg_breaksymbol_t new_break; @@ -372,7 +386,7 @@ PHPDBG_API void phpdbg_set_breakpoint_symbol(const char *name, size_t name_len) PHPDBG_BREAK_INIT(new_break, PHPDBG_BREAK_SYM); new_break.symbol = estrndup(name, name_len); - zend_hash_str_update_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t)); + zend_hash_str_update_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], lcname, name_len, &new_break, sizeof(phpdbg_breaksymbol_t)); phpdbg_notice("breakpoint", "add=\"success\" id=\"%d\" function=\"%s\"", "Breakpoint #%d added at %s", new_break.id, new_break.symbol); @@ -380,6 +394,8 @@ PHPDBG_API void phpdbg_set_breakpoint_symbol(const char *name, size_t name_len) } else { phpdbg_error("breakpoint", "type=\"exists\" add=\"fail\" function=\"%s\"", "Breakpoint exists at %s", name); } + + efree(lcname); } /* }}} */ PHPDBG_API void phpdbg_set_breakpoint_method(const char *class_name, const char *func_name) /* {{{ */ @@ -387,14 +403,22 @@ PHPDBG_API void phpdbg_set_breakpoint_method(const char *class_name, const char HashTable class_breaks, *class_table; size_t class_len = strlen(class_name); size_t func_len = strlen(func_name); - char *lcname = zend_str_tolower_dup(func_name, func_len); + char *func_lcname, *class_lcname; - if (!(class_table = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len))) { + if (*class_name == '\\') { + class_name++; + class_len--; + } + + func_lcname = zend_str_tolower_dup(func_name, func_len); + class_lcname = zend_str_tolower_dup(class_name, class_len); + + if (!(class_table = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_lcname, class_len))) { zend_hash_init(&class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); - class_table = zend_hash_str_update_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, &class_breaks, sizeof(HashTable)); + class_table = zend_hash_str_update_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_lcname, class_len, &class_breaks, sizeof(HashTable)); } - if (!zend_hash_str_exists(class_table, lcname, func_len)) { + if (!zend_hash_str_exists(class_table, func_lcname, func_len)) { phpdbg_breakmethod_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP; @@ -405,7 +429,7 @@ PHPDBG_API void phpdbg_set_breakpoint_method(const char *class_name, const char new_break.func_name = estrndup(func_name, func_len); new_break.func_len = func_len; - zend_hash_str_update_mem(class_table, lcname, func_len, &new_break, sizeof(phpdbg_breakmethod_t)); + zend_hash_str_update_mem(class_table, func_lcname, func_len, &new_break, sizeof(phpdbg_breakmethod_t)); phpdbg_notice("breakpoint", "add=\"success\" id=\"%d\" method=\"%s::%s\"", "Breakpoint #%d added at %s::%s", new_break.id, class_name, func_name); @@ -414,7 +438,8 @@ PHPDBG_API void phpdbg_set_breakpoint_method(const char *class_name, const char phpdbg_error("breakpoint", "type=\"exists\" add=\"fail\" method=\"%s::%s\"", "Breakpoint exists at %s::%s", class_name, func_name); } - efree(lcname); + efree(func_lcname); + efree(class_lcname); } /* }}} */ PHPDBG_API void phpdbg_set_breakpoint_opline(zend_ulong opline) /* {{{ */ @@ -573,6 +598,8 @@ PHPDBG_API int phpdbg_resolve_opline_break(phpdbg_breakopline_t *new_break) /* { return SUCCESS; } /* }}} */ +/* TODO ... method/function oplines need to be normalized (leading backslash, lowercase) and file oplines need to be resolved properly */ + PHPDBG_API void phpdbg_set_breakpoint_method_opline(const char *class, const char *method, zend_ulong opline) /* {{{ */ { phpdbg_breakopline_t new_break; @@ -873,8 +900,6 @@ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_file(zend_op_array *op_ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_symbol(zend_function *fbc) /* {{{ */ { - const char *fname; - size_t flen; zend_op_array *ops; if (fbc->type != ZEND_USER_FUNCTION) { @@ -889,30 +914,33 @@ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_symbol(zend_function *f } if (ops->function_name) { - fname = ZSTR_VAL(ops->function_name); - flen = ZSTR_LEN(ops->function_name); + phpdbg_breakbase_t *brake; + zend_string *fname = zend_string_tolower(ops->function_name); + + brake = zend_hash_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname); + + zend_string_release(fname); + return brake; } else { - fname = "main"; - flen = 4; + return zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], ZEND_STRL("main")); } - - return zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, flen); } /* }}} */ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_method(zend_op_array *ops) /* {{{ */ { HashTable *class_table; phpdbg_breakbase_t *brake = NULL; + zend_string *class_lcname = zend_string_tolower(ops->scope->name); - if ((class_table = zend_hash_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name))) { - size_t lcname_len = ZSTR_LEN(ops->function_name); - char *lcname = zend_str_tolower_dup(ZSTR_VAL(ops->function_name), lcname_len); + if ((class_table = zend_hash_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_lcname))) { + zend_string *lcname = zend_string_tolower(ops->function_name); - brake = zend_hash_str_find_ptr(class_table, lcname, lcname_len); + brake = zend_hash_find_ptr(class_table, lcname); - efree(lcname); + zend_string_release(lcname); } + zend_string_release(class_lcname); return brake; } /* }}} */ @@ -929,9 +957,9 @@ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_opline(phpdbg_opline_pt static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_opcode(zend_uchar opcode) /* {{{ */ { - const char *opname = phpdbg_decode_opcode(opcode); + const char *opname = zend_get_opcode_name(opcode); - if (memcmp(opname, PHPDBG_STRL("UNKNOWN")) == 0) { + if (!opname) { return NULL; } @@ -1081,8 +1109,9 @@ PHPDBG_API phpdbg_breakbase_t *phpdbg_find_breakpoint(zend_execute_data *execute } if (PHPDBG_G(flags) & (PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_SYM_BP)) { - /* check we are at the beginning of the stack */ - if (execute_data->opline == execute_data->func->op_array.opcodes) { + zend_op_array *op_array = &execute_data->func->op_array; + /* check we are at the beginning of the stack, but after argument RECV */ + if (execute_data->opline == op_array->opcodes + op_array->num_args + !!(op_array->fn_flags & ZEND_ACC_VARIADIC)) { if ((base = phpdbg_find_breakpoint_symbol(execute_data->func))) { goto result; } diff --git a/sapi/phpdbg/phpdbg_cmd.c b/sapi/phpdbg/phpdbg_cmd.c index 36f1a3f4ab..12eb3874fd 100644 --- a/sapi/phpdbg/phpdbg_cmd.c +++ b/sapi/phpdbg/phpdbg_cmd.c @@ -716,8 +716,7 @@ PHPDBG_API char *phpdbg_read_input(char *buffered) /* {{{ */ #define USE_LIB_STAR (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT)) /* note: EOF makes readline write prompt again in local console mode - and ignored if compiled without readline */ #if USE_LIB_STAR -readline: - if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) + if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE) || !isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) #endif { phpdbg_write("prompt", "", "%s", phpdbg_get_prompt()); @@ -727,13 +726,12 @@ readline: else { cmd = readline(phpdbg_get_prompt()); PHPDBG_G(last_was_newline) = 1; - } - if (!cmd) { - goto readline; - } + if (!cmd) { + PHPDBG_G(flags) |= PHPDBG_IS_QUITTING | PHPDBG_IS_DISCONNECTED; + zend_bailout(); + } - if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) { add_history(cmd); } #endif @@ -744,7 +742,7 @@ readline: buffer = estrdup(cmd); #if USE_LIB_STAR - if (!buffered && cmd && !(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) { + if (!buffered && cmd && !(PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) { free(cmd); } #endif diff --git a/sapi/phpdbg/phpdbg_frame.c b/sapi/phpdbg/phpdbg_frame.c index 189b3b20fa..4f0e5e88b0 100644 --- a/sapi/phpdbg/phpdbg_frame.c +++ b/sapi/phpdbg/phpdbg_frame.c @@ -164,7 +164,11 @@ static void phpdbg_dump_prototype(zval *tmp) /* {{{ */ } ++j; - php_printf("%s", phpdbg_short_zval_print(argstmp, 40)); + { + char *arg_print = phpdbg_short_zval_print(argstmp, 40); + php_printf("%s", arg_print); + efree(arg_print); + } phpdbg_xml("</arg>"); } ZEND_HASH_FOREACH_END(); diff --git a/sapi/phpdbg/phpdbg_info.c b/sapi/phpdbg/phpdbg_info.c index 1f78ac9173..51e12b7e82 100644 --- a/sapi/phpdbg/phpdbg_info.c +++ b/sapi/phpdbg/phpdbg_info.c @@ -153,7 +153,9 @@ PHPDBG_INFO(constants) /* {{{ */ return SUCCESS; } /* }}} */ -static int phpdbg_arm_auto_global(zend_auto_global *auto_global) { +static int phpdbg_arm_auto_global(zval *ptrzv) { + zend_auto_global *auto_global = Z_PTR_P(ptrzv); + if (auto_global->armed) { if (PHPDBG_G(flags) & PHPDBG_IN_SIGNAL_HANDLER) { phpdbg_notice("variableinfo", "unreachable=\"%.*s\"", "Cannot show information about superglobal variable %.*s", ZSTR_LEN(auto_global->name), ZSTR_VAL(auto_global->name)); @@ -204,9 +206,9 @@ static int phpdbg_print_symbols(zend_bool show_globals) { if (ops->function_name) { if (ops->scope) { - phpdbg_notice("variableinfo", "method=\"%s::%s\" num=\"%d\"", "Variables in %s::%s() (%d)", ops->scope->name, ops->function_name, zend_hash_num_elements(&vars)); + phpdbg_notice("variableinfo", "method=\"%s::%s\" num=\"%d\"", "Variables in %s::%s() (%d)", ops->scope->name->val, ops->function_name->val, zend_hash_num_elements(&vars)); } else { - phpdbg_notice("variableinfo", "function=\"%s\" num=\"%d\"", "Variables in %s() (%d)", ops->function_name, zend_hash_num_elements(&vars)); + phpdbg_notice("variableinfo", "function=\"%s\" num=\"%d\"", "Variables in %s() (%d)", ZSTR_VAL(ops->function_name), zend_hash_num_elements(&vars)); } } else { if (ops->filename) { @@ -221,8 +223,9 @@ static int phpdbg_print_symbols(zend_bool show_globals) { phpdbg_out("Address Refs Type Variable\n"); ZEND_HASH_FOREACH_STR_KEY_VAL(&vars, var, data) { phpdbg_try_access { -#define VARIABLEINFO(attrs, msg, ...) phpdbg_writeln("variable", "address=\"%p\" refcount=\"%d\" type=\"%s\" refstatus=\"%s\" name=\"%.*s\" " attrs, "%-18p %-7d %-9s %s$%.*s" msg, data, Z_REFCOUNT_P(data), zend_zval_type_name(data), Z_ISREF_P(data) ? "&": "", ZSTR_LEN(var), ZSTR_VAL(var), ##__VA_ARGS__) - + const char *isref = ""; +#define VARIABLEINFO(attrs, msg, ...) phpdbg_writeln("variable", "address=\"%p\" refcount=\"%d\" type=\"%s\" refstatus=\"%s\" name=\"%.*s\" " attrs, "%-18p %-7d %-9s %s$%.*s" msg, data, Z_REFCOUNTED_P(data) ? Z_REFCOUNT_P(data) : 1, zend_zval_type_name(data), isref, ZSTR_LEN(var), ZSTR_VAL(var), ##__VA_ARGS__) +retry_switch: switch (Z_TYPE_P(data)) { case IS_RESOURCE: phpdbg_try_access { @@ -258,6 +261,13 @@ static int phpdbg_print_symbols(zend_bool show_globals) { case IS_DOUBLE: VARIABLEINFO("value=\"%lf\"", "\ndouble (%lf)", Z_DVAL_P(data)); break; + case IS_REFERENCE: + isref = "&"; + data = Z_REFVAL_P(data); + goto retry_switch; + case IS_INDIRECT: + data = Z_INDIRECT_P(data); + goto retry_switch; default: VARIABLEINFO("", ""); } @@ -290,13 +300,13 @@ PHPDBG_INFO(literal) /* {{{ */ zend_bool in_executor = PHPDBG_G(in_execution) && EG(current_execute_data) && EG(current_execute_data)->func; if (in_executor || PHPDBG_G(ops)) { zend_op_array *ops = in_executor ? &EG(current_execute_data)->func->op_array : PHPDBG_G(ops); - int literal = 0, count = ops->last_literal-1; + int literal = 0, count = ops->last_literal - 1; if (ops->function_name) { if (ops->scope) { - phpdbg_notice("literalinfo", "method=\"%s::%s\" num=\"%d\"", "Literal Constants in %s::%s() (%d)", ops->scope->name, ops->function_name, count); + phpdbg_notice("literalinfo", "method=\"%s::%s\" num=\"%d\"", "Literal Constants in %s::%s() (%d)", ops->scope->name->val, ops->function_name->val, count); } else { - phpdbg_notice("literalinfo", "function=\"%s\" num=\"%d\"", "Literal Constants in %s() (%d)", ops->function_name, count); + phpdbg_notice("literalinfo", "function=\"%s\" num=\"%d\"", "Literal Constants in %s() (%d)", ops->function_name->val, count); } } else { if (ops->filename) { diff --git a/sapi/phpdbg/phpdbg_io.c b/sapi/phpdbg/phpdbg_io.c index 70709eadc1..246431ff2d 100644 --- a/sapi/phpdbg/phpdbg_io.c +++ b/sapi/phpdbg/phpdbg_io.c @@ -90,7 +90,6 @@ PHPDBG_API int phpdbg_consume_stdin_line(char *buf) { if (bytes <= 0) { PHPDBG_G(flags) |= PHPDBG_IS_QUITTING | PHPDBG_IS_DISCONNECTED; zend_bailout(); - return 0; } return bytes; diff --git a/sapi/phpdbg/phpdbg_lexer.c b/sapi/phpdbg/phpdbg_lexer.c index d1474dc252..6b503f04ed 100644 --- a/sapi/phpdbg/phpdbg_lexer.c +++ b/sapi/phpdbg/phpdbg_lexer.c @@ -1,5 +1,5 @@ /* Generated by re2c 0.13.5 */ -#line 1 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 1 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" /* * phpdbg_lexer.l */ @@ -16,6 +16,7 @@ #define YYGETCONDITION() LEX(state) #define YYCURSOR LEX(cursor) #define YYMARKER LEX(marker) +#define YYCTXMARKER LEX(ctxmarker) #define yyleng LEX(len) #define yytext ((char*) LEX(text)) #undef YYDEBUG @@ -44,7 +45,7 @@ restart: LEX(text) = YYCURSOR; -#line 49 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 49 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -65,38 +66,38 @@ restart: yyc_INITIAL: { static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 96, 0, 0, 192, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 192, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 96, 0, 0, 192, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 192, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, }; YYDEBUG(0, *YYCURSOR); @@ -149,14 +150,14 @@ yy2: yy3: YYDEBUG(3, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 176 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 176 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(NORMAL); YYCURSOR = LEX(text); goto restart; } -#line 161 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 161 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy4: YYDEBUG(4, *YYCURSOR); ++YYCURSOR; @@ -171,11 +172,11 @@ yy4: yy6: YYDEBUG(6, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 69 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 69 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { return 0; } -#line 180 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 180 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy7: YYDEBUG(7, *YYCURSOR); yych = *++YYCURSOR; @@ -242,13 +243,13 @@ yy16: } YYDEBUG(18, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 163 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 163 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(PRE_RAW); phpdbg_init_param(yylval, EMPTY_PARAM); return T_RUN; } -#line 253 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 253 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy19: YYDEBUG(19, *YYCURSOR); yych = *++YYCURSOR; @@ -275,13 +276,13 @@ yy20: yy22: YYDEBUG(22, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 158 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 158 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(PRE_RAW); phpdbg_init_param(yylval, EMPTY_PARAM); return T_SHELL; } -#line 286 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 286 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy23: YYDEBUG(23, *YYCURSOR); yych = *++YYCURSOR; @@ -308,13 +309,13 @@ yy24: yy26: YYDEBUG(26, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 153 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 153 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(PRE_RAW); phpdbg_init_param(yylval, EMPTY_PARAM); return T_EVAL; } -#line 319 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 319 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy27: YYDEBUG(27, *YYCURSOR); yych = *++YYCURSOR; @@ -333,50 +334,50 @@ yy29: if (yych == '\n') goto yy4; YYDEBUG(30, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 147 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 147 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { /* ignore whitespace */ goto restart; } -#line 344 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 344 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" } /* *********************************** */ yyc_NORMAL: { static const unsigned char yybm[] = { - 0, 8, 8, 8, 8, 8, 8, 8, - 8, 66, 68, 8, 8, 66, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 66, 8, 8, 0, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 24, 8, - 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 0, 8, 8, 8, 8, 8, - 8, 168, 168, 168, 168, 168, 168, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 8, 8, 8, 8, 8, - 8, 168, 168, 168, 168, 168, 168, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, + 0, 8, 8, 8, 8, 8, 8, 8, + 8, 66, 68, 8, 8, 66, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 66, 8, 8, 0, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 24, 8, + 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 0, 8, 8, 8, 8, 8, + 8, 168, 168, 168, 168, 168, 168, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 8, 8, 8, 8, 8, + 8, 168, 168, 168, 168, 168, 168, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, }; YYDEBUG(31, *YYCURSOR); YYFILL(11); @@ -482,13 +483,13 @@ yy33: if (yych == '\n') goto yy36; YYDEBUG(35, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 147 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 147 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { /* ignore whitespace */ goto restart; } -#line 493 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 493 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy36: YYDEBUG(36, *YYCURSOR); ++YYCURSOR; @@ -503,11 +504,11 @@ yy36: yy38: YYDEBUG(38, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 69 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 69 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { return 0; } -#line 512 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 512 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy39: YYDEBUG(39, *YYCURSOR); yych = *++YYCURSOR; @@ -519,25 +520,25 @@ yy40: if (yybm[0+yych] & 16) { goto yy45; } - if (yych == 'r') goto yy113; + if (yych == 'r') goto yy114; goto yy44; yy41: YYDEBUG(41, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 133 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 133 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, STR_PARAM); yylval->str = zend_strndup(yytext, yyleng); yylval->len = yyleng; return T_ID; } -#line 536 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 536 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy42: YYDEBUG(42, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'F') goto yy109; - if (yych == 'f') goto yy109; + if (yych == 'F') goto yy110; + if (yych == 'f') goto yy110; goto yy44; yy43: YYDEBUG(43, *YYCURSOR); @@ -551,7 +552,7 @@ yy44: goto yy43; } if (yych <= '9') goto yy41; - goto yy65; + goto yy67; yy45: YYDEBUG(45, *YYCURSOR); yyaccept = 1; @@ -574,20 +575,20 @@ yy45: if (yych <= ' ') goto yy47; if (yych <= '"') goto yy43; } else { - if (yych == ':') goto yy65; + if (yych == ':') goto yy67; goto yy43; } } yy47: YYDEBUG(47, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 114 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 114 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, NUMERIC_PARAM); yylval->num = atoi(yytext); return T_DIGITS; } -#line 592 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 592 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy48: YYDEBUG(48, *YYCURSOR); yyaccept = 1; @@ -610,7 +611,7 @@ yy48: if (yych <= '"') goto yy44; goto yy47; } else { - if (yych == 'x') goto yy105; + if (yych == 'x') goto yy106; goto yy44; } } @@ -618,44 +619,44 @@ yy49: YYDEBUG(49, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'I') goto yy99; - if (yych == 'i') goto yy99; + if (yych == 'I') goto yy100; + if (yych == 'i') goto yy100; goto yy44; yy50: YYDEBUG(50, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'N') goto yy94; - if (yych == 'n') goto yy94; + if (yych == 'N') goto yy95; + if (yych == 'n') goto yy95; goto yy44; yy51: YYDEBUG(51, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'A') goto yy91; - if (yych == 'a') goto yy91; + if (yych == 'A') goto yy92; + if (yych == 'a') goto yy92; goto yy44; yy52: YYDEBUG(52, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'O') goto yy87; - if (yych == 'o') goto yy87; + if (yych == 'O') goto yy88; + if (yych == 'o') goto yy88; goto yy44; yy53: YYDEBUG(53, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { - if (yych == 'F') goto yy86; + if (yych == 'F') goto yy87; if (yych <= 'M') goto yy44; - goto yy80; + goto yy81; } else { if (yych <= 'f') { if (yych <= 'e') goto yy44; - goto yy86; + goto yy87; } else { - if (yych == 'n') goto yy80; + if (yych == 'n') goto yy81; goto yy44; } } @@ -663,71 +664,46 @@ yy54: YYDEBUG(54, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'R') goto yy84; - if (yych == 'r') goto yy84; + if (yych == 'R') goto yy85; + if (yych == 'r') goto yy85; goto yy44; yy55: YYDEBUG(55, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy79; - if (yych == 'e') goto yy79; + if (yych == 'E') goto yy80; + if (yych == 'e') goto yy80; goto yy44; yy56: YYDEBUG(56, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy76; + if (yych == 'E') goto yy77; goto yy44; yy57: YYDEBUG(57, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy64; + if (yych == 'e') goto yy66; goto yy44; yy58: YYDEBUG(58, *YYCURSOR); ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 92 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 92 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { return T_POUND; } -#line 699 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 699 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy60: YYDEBUG(60, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == ':') goto yy62; - YYDEBUG(61, *YYCURSOR); - yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 98 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" - { - return T_COLON; -} -#line 710 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy62: - YYDEBUG(62, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(63, *YYCURSOR); - yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 95 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" - { - return T_DCOLON; -} -#line 720 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy64: - YYDEBUG(64, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'n') goto yy70; - goto yy44; -yy65: - YYDEBUG(65, *YYCURSOR); + YYCTXMARKER = YYCURSOR + 1; yych = *++YYCURSOR; - if (yych == '/') goto yy67; -yy66: - YYDEBUG(66, *YYCURSOR); + if (yych == ':') goto yy64; + if (yych != '\\') goto yy62; +yy61: + YYDEBUG(61, *YYCURSOR); YYCURSOR = YYMARKER; if (yyaccept <= 2) { if (yyaccept <= 1) { @@ -737,351 +713,381 @@ yy66: goto yy47; } } else { - goto yy75; + goto yy76; } } else { if (yyaccept <= 3) { - goto yy108; + goto yy109; } else { - goto yy119; + goto yy120; } } +yy62: + YYDEBUG(62, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(63, *YYCURSOR); + YYCURSOR = YYCTXMARKER; + yyleng = (size_t) YYCURSOR - (size_t) yytext; +#line 98 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" + { + return T_COLON; +} +#line 736 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(65, *YYCURSOR); + yyleng = (size_t) YYCURSOR - (size_t) yytext; +#line 95 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" + { + return T_DCOLON; +} +#line 746 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy66: + YYDEBUG(66, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'n') goto yy71; + goto yy44; yy67: YYDEBUG(67, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '/') goto yy66; + if (yych != '/') goto yy61; YYDEBUG(68, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych != '/') goto yy61; YYDEBUG(69, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(70, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 86 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 86 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, STR_PARAM); yylval->str = zend_strndup(yytext, yyleng); yylval->len = yyleng; return T_PROTO; } -#line 766 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy70: - YYDEBUG(70, *YYCURSOR); +#line 771 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy71: + YYDEBUG(71, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych != 'd') goto yy44; - YYDEBUG(71, *YYCURSOR); + YYDEBUG(72, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych != '_') goto yy44; -yy72: - YYDEBUG(72, *YYCURSOR); +yy73: + YYDEBUG(73, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy73; + goto yy74; } goto yy44; -yy73: - YYDEBUG(73, *YYCURSOR); +yy74: + YYDEBUG(74, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(74, *YYCURSOR); + YYDEBUG(75, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy73; + goto yy74; } if (yych <= 0x1F) { if (yych <= '\n') { - if (yych <= 0x00) goto yy75; + if (yych <= 0x00) goto yy76; if (yych <= 0x08) goto yy43; } else { if (yych != '\r') goto yy43; } } else { if (yych <= '#') { - if (yych <= ' ') goto yy75; + if (yych <= ' ') goto yy76; if (yych <= '"') goto yy43; } else { - if (yych == ':') goto yy65; + if (yych == ':') goto yy67; goto yy43; } } -yy75: - YYDEBUG(75, *YYCURSOR); +yy76: + YYDEBUG(76, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 126 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 126 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, OP_PARAM); yylval->str = zend_strndup(yytext, yyleng); yylval->len = yyleng; return T_OPCODE; } -#line 820 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy76: - YYDEBUG(76, *YYCURSOR); +#line 825 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy77: + YYDEBUG(77, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych != 'N') goto yy44; - YYDEBUG(77, *YYCURSOR); + YYDEBUG(78, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych != 'D') goto yy44; - YYDEBUG(78, *YYCURSOR); + YYDEBUG(79, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '_') goto yy72; + if (yych == '_') goto yy73; goto yy44; -yy79: - YYDEBUG(79, *YYCURSOR); +yy80: + YYDEBUG(80, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'S') goto yy80; + if (yych == 'S') goto yy81; if (yych != 's') goto yy44; -yy80: - YYDEBUG(80, *YYCURSOR); +yy81: + YYDEBUG(81, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy81; + goto yy82; } goto yy44; -yy81: - YYDEBUG(81, *YYCURSOR); +yy82: + YYDEBUG(82, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(82, *YYCURSOR); + YYDEBUG(83, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy81; + goto yy82; } - YYDEBUG(83, *YYCURSOR); + YYDEBUG(84, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 102 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 102 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, NUMERIC_PARAM); yylval->num = 1; return T_TRUTHY; } -#line 866 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy84: - YYDEBUG(84, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'U') goto yy85; - if (yych != 'u') goto yy44; +#line 871 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy85: YYDEBUG(85, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy80; - if (yych == 'e') goto yy80; - goto yy44; + if (yych == 'U') goto yy86; + if (yych != 'u') goto yy44; yy86: YYDEBUG(86, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'F') goto yy87; - if (yych != 'f') goto yy44; + if (yych == 'E') goto yy81; + if (yych == 'e') goto yy81; + goto yy44; yy87: YYDEBUG(87, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'F') goto yy88; + if (yych != 'f') goto yy44; +yy88: + YYDEBUG(88, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\f') { if (yych <= 0x08) goto yy44; if (yych >= '\v') goto yy44; } else { - if (yych <= '\r') goto yy88; + if (yych <= '\r') goto yy89; if (yych != ' ') goto yy44; } -yy88: - YYDEBUG(88, *YYCURSOR); +yy89: + YYDEBUG(89, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(89, *YYCURSOR); + YYDEBUG(90, *YYCURSOR); if (yych <= '\f') { - if (yych <= 0x08) goto yy90; - if (yych <= '\n') goto yy88; + if (yych <= 0x08) goto yy91; + if (yych <= '\n') goto yy89; } else { - if (yych <= '\r') goto yy88; - if (yych == ' ') goto yy88; + if (yych <= '\r') goto yy89; + if (yych == ' ') goto yy89; } -yy90: - YYDEBUG(90, *YYCURSOR); +yy91: + YYDEBUG(91, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 108 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 108 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, NUMERIC_PARAM); yylval->num = 0; return T_FALSY; } -#line 919 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy91: - YYDEBUG(91, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'L') goto yy92; - if (yych != 'l') goto yy44; +#line 924 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy92: YYDEBUG(92, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'S') goto yy93; - if (yych != 's') goto yy44; + if (yych == 'L') goto yy93; + if (yych != 'l') goto yy44; yy93: YYDEBUG(93, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy87; - if (yych == 'e') goto yy87; - goto yy44; + if (yych == 'S') goto yy94; + if (yych != 's') goto yy44; yy94: YYDEBUG(94, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'A') goto yy95; - if (yych != 'a') goto yy44; + if (yych == 'E') goto yy88; + if (yych == 'e') goto yy88; + goto yy44; yy95: YYDEBUG(95, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'B') goto yy96; - if (yych != 'b') goto yy44; + if (yych == 'A') goto yy96; + if (yych != 'a') goto yy44; yy96: YYDEBUG(96, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'L') goto yy97; - if (yych != 'l') goto yy44; + if (yych == 'B') goto yy97; + if (yych != 'b') goto yy44; yy97: YYDEBUG(97, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy98; - if (yych != 'e') goto yy44; + if (yych == 'L') goto yy98; + if (yych != 'l') goto yy44; yy98: YYDEBUG(98, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'D') goto yy80; - if (yych == 'd') goto yy80; - goto yy44; + if (yych == 'E') goto yy99; + if (yych != 'e') goto yy44; yy99: YYDEBUG(99, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'S') goto yy100; - if (yych != 's') goto yy44; + if (yych == 'D') goto yy81; + if (yych == 'd') goto yy81; + goto yy44; yy100: YYDEBUG(100, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'A') goto yy101; - if (yych != 'a') goto yy44; + if (yych == 'S') goto yy101; + if (yych != 's') goto yy44; yy101: YYDEBUG(101, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'B') goto yy102; - if (yych != 'b') goto yy44; + if (yych == 'A') goto yy102; + if (yych != 'a') goto yy44; yy102: YYDEBUG(102, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'L') goto yy103; - if (yych != 'l') goto yy44; + if (yych == 'B') goto yy103; + if (yych != 'b') goto yy44; yy103: YYDEBUG(103, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'E') goto yy104; - if (yych != 'e') goto yy44; + if (yych == 'L') goto yy104; + if (yych != 'l') goto yy44; yy104: YYDEBUG(104, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'D') goto yy87; - if (yych == 'd') goto yy87; - goto yy44; + if (yych == 'E') goto yy105; + if (yych != 'e') goto yy44; yy105: YYDEBUG(105, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy106; - } + if (yych == 'D') goto yy88; + if (yych == 'd') goto yy88; goto yy44; yy106: YYDEBUG(106, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy107; + } + goto yy44; +yy107: + YYDEBUG(107, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(107, *YYCURSOR); + YYDEBUG(108, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy106; + goto yy107; } if (yych <= 0x1F) { if (yych <= '\n') { - if (yych <= 0x00) goto yy108; + if (yych <= 0x00) goto yy109; if (yych <= 0x08) goto yy43; } else { if (yych != '\r') goto yy43; } } else { if (yych <= '#') { - if (yych <= ' ') goto yy108; + if (yych <= ' ') goto yy109; if (yych <= '"') goto yy43; } else { - if (yych == ':') goto yy65; + if (yych == ':') goto yy67; goto yy43; } } -yy108: - YYDEBUG(108, *YYCURSOR); +yy109: + YYDEBUG(109, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 120 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 120 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, ADDR_PARAM); yylval->addr = strtoul(yytext, 0, 16); return T_ADDR; } -#line 1050 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy109: - YYDEBUG(109, *YYCURSOR); +#line 1055 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy110: + YYDEBUG(110, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\f') { if (yych <= 0x08) goto yy44; if (yych >= '\v') goto yy44; } else { - if (yych <= '\r') goto yy110; + if (yych <= '\r') goto yy111; if (yych != ' ') goto yy44; } -yy110: - YYDEBUG(110, *YYCURSOR); +yy111: + YYDEBUG(111, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(111, *YYCURSOR); + YYDEBUG(112, *YYCURSOR); if (yych <= '\f') { - if (yych <= 0x08) goto yy112; - if (yych <= '\n') goto yy110; + if (yych <= 0x08) goto yy113; + if (yych <= '\n') goto yy111; } else { - if (yych <= '\r') goto yy110; - if (yych == ' ') goto yy110; + if (yych <= '\r') goto yy111; + if (yych == ' ') goto yy111; } -yy112: - YYDEBUG(112, *YYCURSOR); +yy113: + YYDEBUG(113, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 80 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 80 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(RAW); phpdbg_init_param(yylval, EMPTY_PARAM); return T_IF; } -#line 1084 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy113: - YYDEBUG(113, *YYCURSOR); +#line 1089 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy114: + YYDEBUG(114, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { @@ -1089,430 +1095,430 @@ yy113: if (yych <= 0x08) goto yy44; if (yych >= '\v') goto yy44; } else { - if (yych <= '\r') goto yy114; + if (yych <= '\r') goto yy115; if (yych <= 0x1F) goto yy44; } } else { if (yych <= '.') { if (yych <= ',') goto yy44; - if (yych <= '-') goto yy116; - goto yy117; + if (yych <= '-') goto yy117; + goto yy118; } else { if (yych <= '/') goto yy44; - if (yych <= '9') goto yy117; + if (yych <= '9') goto yy118; goto yy44; } } -yy114: - YYDEBUG(114, *YYCURSOR); +yy115: + YYDEBUG(115, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(115, *YYCURSOR); + YYDEBUG(116, *YYCURSOR); if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy66; - if (yych <= '\n') goto yy114; - goto yy66; + if (yych <= 0x08) goto yy61; + if (yych <= '\n') goto yy115; + goto yy61; } else { - if (yych <= '\r') goto yy114; - if (yych <= 0x1F) goto yy66; - goto yy114; + if (yych <= '\r') goto yy115; + if (yych <= 0x1F) goto yy61; + goto yy115; } } else { if (yych <= '.') { - if (yych <= ',') goto yy66; - if (yych <= '-') goto yy120; - goto yy121; + if (yych <= ',') goto yy61; + if (yych <= '-') goto yy121; + goto yy122; } else { - if (yych <= '/') goto yy66; - if (yych <= '9') goto yy121; - goto yy66; + if (yych <= '/') goto yy61; + if (yych <= '9') goto yy122; + goto yy61; } } -yy116: - YYDEBUG(116, *YYCURSOR); +yy117: + YYDEBUG(117, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '.') goto yy117; + if (yych == '.') goto yy118; if (yych <= '/') goto yy44; if (yych >= ':') goto yy44; -yy117: - YYDEBUG(117, *YYCURSOR); +yy118: + YYDEBUG(118, *YYCURSOR); yyaccept = 4; YYMARKER = ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(118, *YYCURSOR); + YYDEBUG(119, *YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x00) goto yy119; + if (yych <= 0x00) goto yy120; if (yych <= 0x08) goto yy43; } else { - if (yych == '\r') goto yy119; + if (yych == '\r') goto yy120; if (yych <= 0x1F) goto yy43; } } else { if (yych <= '.') { - if (yych == '#') goto yy119; + if (yych == '#') goto yy120; if (yych <= '-') goto yy43; - goto yy117; + goto yy118; } else { if (yych <= '/') goto yy43; - if (yych <= '9') goto yy117; - if (yych <= ':') goto yy65; + if (yych <= '9') goto yy118; + if (yych <= ':') goto yy67; goto yy43; } } -yy119: - YYDEBUG(119, *YYCURSOR); +yy120: + YYDEBUG(120, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 73 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 73 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { char *text = yytext + 2; while (*++text < '0'); yylval->num = atoi(text); return T_REQ_ID; } -#line 1179 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy120: - YYDEBUG(120, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '.') goto yy121; - if (yych <= '/') goto yy66; - if (yych >= ':') goto yy66; +#line 1184 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy121: YYDEBUG(121, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '.') goto yy122; + if (yych <= '/') goto yy61; + if (yych >= ':') goto yy61; +yy122: + YYDEBUG(122, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(122, *YYCURSOR); - if (yych == '.') goto yy121; - if (yych <= '/') goto yy119; - if (yych <= '9') goto yy121; - goto yy119; + YYDEBUG(123, *YYCURSOR); + if (yych == '.') goto yy122; + if (yych <= '/') goto yy120; + if (yych <= '9') goto yy122; + goto yy120; } /* *********************************** */ yyc_PRE_RAW: { static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 160, 48, 0, 0, 160, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 160, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 160, 48, 0, 0, 160, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 160, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, }; - YYDEBUG(123, *YYCURSOR); + YYDEBUG(124, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yybm[0+yych] & 16) { - goto yy127; + goto yy128; } if (yych <= '\r') { if (yych <= 0x08) { - if (yych <= 0x00) goto yy130; - goto yy132; + if (yych <= 0x00) goto yy131; + goto yy133; } else { - if (yych <= '\t') goto yy125; - if (yych <= '\f') goto yy132; + if (yych <= '\t') goto yy126; + if (yych <= '\f') goto yy133; } } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy132; + if (yych <= 0x1F) goto yy133; } else { - if (yych == '-') goto yy131; - goto yy132; + if (yych == '-') goto yy132; + goto yy133; } } -yy125: - YYDEBUG(125, *YYCURSOR); +yy126: + YYDEBUG(126, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '\f') { - if (yych <= 0x00) goto yy142; - if (yych <= 0x08) goto yy126; - if (yych <= '\n') goto yy142; + if (yych <= 0x00) goto yy143; + if (yych <= 0x08) goto yy127; + if (yych <= '\n') goto yy143; } else { - if (yych <= '\r') goto yy142; - if (yych == ' ') goto yy142; + if (yych <= '\r') goto yy143; + if (yych == ' ') goto yy143; } -yy126: - YYDEBUG(126, *YYCURSOR); +yy127: + YYDEBUG(127, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 169 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 169 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { YYSETCONDITION(RAW); YYCURSOR = LEX(text); goto restart; } -#line 1277 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy127: - YYDEBUG(127, *YYCURSOR); +#line 1282 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy128: + YYDEBUG(128, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(128, *YYCURSOR); + YYDEBUG(129, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy141; + goto yy142; } - if (yych <= 0x00) goto yy140; - if (yych == '\n') goto yy127; -yy129: - YYDEBUG(129, *YYCURSOR); + if (yych <= 0x00) goto yy141; + if (yych == '\n') goto yy128; +yy130: + YYDEBUG(130, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 69 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 69 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { return 0; } -#line 1296 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy130: - YYDEBUG(130, *YYCURSOR); - yych = *++YYCURSOR; - goto yy126; +#line 1301 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy131: YYDEBUG(131, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'r') goto yy133; - goto yy126; + yych = *++YYCURSOR; + goto yy127; yy132: YYDEBUG(132, *YYCURSOR); - yych = *++YYCURSOR; - goto yy126; + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'r') goto yy134; + goto yy127; yy133: YYDEBUG(133, *YYCURSOR); + yych = *++YYCURSOR; + goto yy127; +yy134: + YYDEBUG(134, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(134, *YYCURSOR); + YYDEBUG(135, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy133; + goto yy134; } if (yych <= '.') { - if (yych <= ',') goto yy135; - if (yych <= '-') goto yy136; - goto yy137; + if (yych <= ',') goto yy136; + if (yych <= '-') goto yy137; + goto yy138; } else { - if (yych <= '/') goto yy135; - if (yych <= '9') goto yy137; + if (yych <= '/') goto yy136; + if (yych <= '9') goto yy138; } -yy135: - YYDEBUG(135, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy126; yy136: YYDEBUG(136, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy127; +yy137: + YYDEBUG(137, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy137; + goto yy138; } - goto yy135; -yy137: - YYDEBUG(137, *YYCURSOR); + goto yy136; +yy138: + YYDEBUG(138, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(138, *YYCURSOR); + YYDEBUG(139, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy137; + goto yy138; } - YYDEBUG(139, *YYCURSOR); + YYDEBUG(140, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 73 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 73 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { char *text = yytext + 2; while (*++text < '0'); yylval->num = atoi(text); return T_REQ_ID; } -#line 1357 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy140: - YYDEBUG(140, *YYCURSOR); - yych = *++YYCURSOR; - goto yy129; +#line 1362 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy141: YYDEBUG(141, *YYCURSOR); + yych = *++YYCURSOR; + goto yy130; +yy142: + YYDEBUG(142, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy142: - YYDEBUG(142, *YYCURSOR); +yy143: + YYDEBUG(143, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy141; + goto yy142; } - if (yych <= 0x00) goto yy140; - if (yych == '\n') goto yy127; - YYDEBUG(143, *YYCURSOR); + if (yych <= 0x00) goto yy141; + if (yych == '\n') goto yy128; + YYDEBUG(144, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 147 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 147 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { /* ignore whitespace */ goto restart; } -#line 1382 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 1387 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" } /* *********************************** */ yyc_RAW: { static const unsigned char yybm[] = { - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 160, 64, 128, 128, 160, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 160, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 160, 64, 128, 128, 160, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 160, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(144, *YYCURSOR); + YYDEBUG(145, *YYCURSOR); YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 32) { - goto yy146; + goto yy147; } - if (yych <= 0x00) goto yy152; - if (yych == '\n') goto yy149; - goto yy153; -yy146: - YYDEBUG(146, *YYCURSOR); + if (yych <= 0x00) goto yy153; + if (yych == '\n') goto yy150; + goto yy154; +yy147: + YYDEBUG(147, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(147, *YYCURSOR); + YYDEBUG(148, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy146; + goto yy147; } - if (yych <= 0x00) goto yy152; - if (yych == '\n') goto yy149; - goto yy153; -yy148: - YYDEBUG(148, *YYCURSOR); + if (yych <= 0x00) goto yy153; + if (yych == '\n') goto yy150; + goto yy154; +yy149: + YYDEBUG(149, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 140 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 140 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { phpdbg_init_param(yylval, STR_PARAM); yylval->str = zend_strndup(yytext, yyleng); yylval->len = yyleng; return T_INPUT; } -#line 1452 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy149: - YYDEBUG(149, *YYCURSOR); +#line 1457 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" +yy150: + YYDEBUG(150, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(150, *YYCURSOR); + YYDEBUG(151, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy149; + goto yy150; } if (yych <= '\f') { - if (yych <= 0x00) goto yy152; - if (yych == '\t') goto yy155; + if (yych <= 0x00) goto yy153; + if (yych == '\t') goto yy156; } else { - if (yych <= '\r') goto yy155; - if (yych == ' ') goto yy155; + if (yych <= '\r') goto yy156; + if (yych == ' ') goto yy156; } -yy151: - YYDEBUG(151, *YYCURSOR); +yy152: + YYDEBUG(152, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 69 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 69 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { return 0; } -#line 1476 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" -yy152: - YYDEBUG(152, *YYCURSOR); - yych = *++YYCURSOR; - goto yy151; +#line 1481 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" yy153: YYDEBUG(153, *YYCURSOR); + yych = *++YYCURSOR; + goto yy152; +yy154: + YYDEBUG(154, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(154, *YYCURSOR); + YYDEBUG(155, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy153; + goto yy154; } - goto yy148; -yy155: - YYDEBUG(155, *YYCURSOR); + goto yy149; +yy156: + YYDEBUG(156, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(156, *YYCURSOR); + YYDEBUG(157, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy149; + goto yy150; } if (yych <= '\f') { - if (yych <= 0x00) goto yy152; - if (yych == '\t') goto yy155; + if (yych <= 0x00) goto yy153; + if (yych == '\t') goto yy156; } else { - if (yych <= '\r') goto yy155; - if (yych == ' ') goto yy155; + if (yych <= '\r') goto yy156; + if (yych == ' ') goto yy156; } - YYDEBUG(157, *YYCURSOR); + YYDEBUG(158, *YYCURSOR); yyleng = (size_t) YYCURSOR - (size_t) yytext; -#line 147 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 147 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" { /* ignore whitespace */ goto restart; } -#line 1515 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.c" +#line 1520 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.c" } } -#line 183 "/Users/Bob/php-src-5.6/sapi/phpdbg/phpdbg_lexer.l" +#line 183 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_lexer.l" } diff --git a/sapi/phpdbg/phpdbg_lexer.h b/sapi/phpdbg/phpdbg_lexer.h index 89ef7668e5..f9b75b95bf 100644 --- a/sapi/phpdbg/phpdbg_lexer.h +++ b/sapi/phpdbg/phpdbg_lexer.h @@ -28,6 +28,7 @@ typedef struct { unsigned char *text; unsigned char *cursor; unsigned char *marker; + unsigned char *ctxmarker; int state; } phpdbg_lexer_data; diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l index b9cdc65d22..7fca70f57a 100644 --- a/sapi/phpdbg/phpdbg_lexer.l +++ b/sapi/phpdbg/phpdbg_lexer.l @@ -14,6 +14,7 @@ #define YYGETCONDITION() LEX(state) #define YYCURSOR LEX(cursor) #define YYMARKER LEX(marker) +#define YYCTXMARKER LEX(ctxmarker) #define yyleng LEX(len) #define yytext ((char*) LEX(text)) #undef YYDEBUG @@ -94,7 +95,7 @@ INPUT [^\n\000]+ <NORMAL>[:]{2} { return T_DCOLON; } -<NORMAL>[:]{1} { +<NORMAL>[:]{1}/[^\\] { return T_COLON; } diff --git a/sapi/phpdbg/phpdbg_opcode.c b/sapi/phpdbg/phpdbg_opcode.c index 3af52f17cd..128dc591cf 100644 --- a/sapi/phpdbg/phpdbg_opcode.c +++ b/sapi/phpdbg/phpdbg_opcode.c @@ -27,6 +27,15 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); +static inline const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ +{ + const char *ret = zend_get_opcode_name(opcode); + if (ret) { + return ret + 5; /* Skip ZEND_ prefix */ + } + return "UNKNOWN"; +} /* }}} */ + static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t type) /* {{{ */ { char *decode = NULL; @@ -34,12 +43,14 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t switch (type) { case IS_CV: { zend_string *var = ops->vars[EX_VAR_TO_NUM(op->var)]; - asprintf(&decode, "$%.*s%c", ZSTR_LEN(var) <= 19 ? (int) ZSTR_LEN(var) : 18, ZSTR_VAL(var), ZSTR_LEN(var) <= 19 ? 0 : '+'); + spprintf(&decode, 0, "$%.*s%c", + ZSTR_LEN(var) <= 19 ? (int) ZSTR_LEN(var) : 18, + ZSTR_VAL(var), ZSTR_LEN(var) <= 19 ? 0 : '+'); } break; case IS_VAR: case IS_TMP_VAR: { - asprintf(&decode, "@%" PRIu32, EX_VAR_TO_NUM(op->var) - ops->last_var); + spprintf(&decode, 0, "@%td", EX_VAR_TO_NUM(op->var) - ops->last_var); } break; case IS_CONST: { zval *literal = RT_CONSTANT(ops, *op); @@ -51,21 +62,38 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ { - char *decode[4] = {NULL, NULL, NULL, NULL}; + const char *opcode_name = phpdbg_decode_opcode(op->opcode); + char *result, *decode[4] = {NULL, NULL, NULL, NULL}; + + /* EX */ + switch (op->opcode) { + case ZEND_FAST_CALL: + if (op->extended_value != 0) { + spprintf(&decode[0], 0, "FAST_CALL<%s>", + op->extended_value == ZEND_FAST_CALL_FROM_CATCH ? "FROM_CATCH" : "FROM_FINALLY"); + } + break; + case ZEND_FAST_RET: + if (op->extended_value != 0) { + spprintf(&decode[0], 0, "FAST_RET<%s>", + op->extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY"); + } + break; + } /* OP1 */ switch (op->opcode) { case ZEND_JMP: case ZEND_GOTO: case ZEND_FAST_CALL: - asprintf(&decode[1], "J%ld", OP_JMP_ADDR(op, op->op1) - ops->opcodes); + spprintf(&decode[1], 0, "J%td", OP_JMP_ADDR(op, op->op1) - ops->opcodes); break; case ZEND_INIT_FCALL: case ZEND_RECV: case ZEND_RECV_INIT: case ZEND_RECV_VARIADIC: - asprintf(&decode[1], "%" PRIu32, op->op1.num); + spprintf(&decode[1], 0, "%" PRIu32, op->op1.num); break; default: @@ -75,9 +103,10 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ /* OP2 */ switch (op->opcode) { - /* TODO: ZEND_FAST_CALL, ZEND_FAST_RET op2 */ case ZEND_JMPZNZ: - asprintf(&decode[2], "J%u or J%" PRIu32, OP_JMP_ADDR(op, op->op2) - ops->opcodes, ZEND_OFFSET_TO_OPLINE(op, op->extended_value) - ops->opcodes); + spprintf(&decode[2], 0, "J%td or J%td", + OP_JMP_ADDR(op, op->op2) - ops->opcodes, + ZEND_OFFSET_TO_OPLINE(op, op->extended_value) - ops->opcodes); break; case ZEND_JMPZ: @@ -86,7 +115,14 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ case ZEND_JMPNZ_EX: case ZEND_JMP_SET: case ZEND_ASSERT_CHECK: - asprintf(&decode[2], "J%ld", OP_JMP_ADDR(op, op->op2) - ops->opcodes); + spprintf(&decode[2], 0, "J%td", OP_JMP_ADDR(op, op->op2) - ops->opcodes); + break; + + case ZEND_FAST_CALL: + case ZEND_FAST_RET: + if (op->extended_value != 0) { + spprintf(&decode[2], 0, "J%" PRIu32, op->op2.opline_num); + } break; case ZEND_SEND_VAL: @@ -96,7 +132,7 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ case ZEND_SEND_REF: case ZEND_SEND_VAR_EX: case ZEND_SEND_USER: - asprintf(&decode[2], "%" PRIu32, op->op2.num); + spprintf(&decode[2], 0, "%" PRIu32, op->op2.num); break; default: @@ -107,27 +143,30 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ /* RESULT */ switch (op->opcode) { case ZEND_CATCH: - asprintf(&decode[2], "%" PRIu32, op->result.num); + spprintf(&decode[2], 0, "%" PRIu32, op->result.num); break; default: decode[3] = phpdbg_decode_op(ops, &op->result, op->result_type); break; } - asprintf(&decode[0], - "%-20s %-20s %-20s", + spprintf(&result, 0, + "%-23s %-20s %-20s %-20s", + decode[0] ? decode[0] : opcode_name, decode[1] ? decode[1] : "", decode[2] ? decode[2] : "", decode[3] ? decode[3] : ""); + if (decode[0]) + efree(decode[0]); if (decode[1]) - free(decode[1]); + efree(decode[1]); if (decode[2]) - free(decode[2]); + efree(decode[2]); if (decode[3]) - free(decode[3]); + efree(decode[3]); - return decode[0]; + return result; } /* }}} */ void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_flags) /* {{{ */ @@ -143,26 +182,22 @@ void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_fl if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { /* output line info */ - phpdbg_notice("opline", "line=\"%u\" opline=\"%p\" opcode=\"%s\" op=\"%s\" file=\"%s\"", "L%-5u %16p %-30s %s %s", + phpdbg_notice("opline", "line=\"%u\" opline=\"%p\" op=\"%s\" file=\"%s\"", "L%-5u %16p %s %s", opline->lineno, opline, - phpdbg_decode_opcode(opline->opcode), decode, execute_data->func->op_array.filename ? ZSTR_VAL(execute_data->func->op_array.filename) : "unknown"); } if (!ignore_flags && PHPDBG_G(oplog)) { - phpdbg_log_ex(fileno(PHPDBG_G(oplog)), "L%-5u %16p %-30s %s %s", + phpdbg_log_ex(fileno(PHPDBG_G(oplog)), "L%-5u %16p %s %s", opline->lineno, opline, - phpdbg_decode_opcode(opline->opcode), decode, execute_data->func->op_array.filename ? ZSTR_VAL(execute_data->func->op_array.filename) : "unknown"); } - if (decode) { - free(decode); - } + efree(decode); } if (PHPDBG_G(oplog_list)) { @@ -179,9 +214,3 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags { phpdbg_print_opline_ex(execute_data, ignore_flags); } /* }}} */ - -const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ -{ - const char *ret = zend_get_opcode_name(opcode); - return ret?ret:"UNKNOWN"; -} /* }}} */ diff --git a/sapi/phpdbg/phpdbg_opcode.h b/sapi/phpdbg/phpdbg_opcode.h index ab7e9e261d..34c9c37e50 100644 --- a/sapi/phpdbg/phpdbg_opcode.h +++ b/sapi/phpdbg/phpdbg_opcode.h @@ -23,7 +23,6 @@ #include "zend_types.h" -const char *phpdbg_decode_opcode(zend_uchar); char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op); void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags); void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_flags); diff --git a/sapi/phpdbg/phpdbg_print.c b/sapi/phpdbg/phpdbg_print.c index 95e0caf784..4a00189b46 100644 --- a/sapi/phpdbg/phpdbg_print.c +++ b/sapi/phpdbg/phpdbg_print.c @@ -82,16 +82,11 @@ static inline void phpdbg_print_function_helper(zend_function *method) /* {{{ */ do { char *decode = phpdbg_decode_opline(op_array, opline); - if (decode != NULL) { - phpdbg_writeln("print", "line=\"%u\" opnum=\"%u\" opcode=\"%s\" op=\"%s\"", " L%-4u #%-5u %-23s %s", - opline->lineno, - opcode, - phpdbg_decode_opcode(opline->opcode) + 5, /* remove ZEND_ prefix */ - decode); - free(decode); - } else { - phpdbg_error("print", "type=\"decodefailure\" opline=\"%16p\"", "Failed to decode opline %16p", opline); - } + phpdbg_writeln("print", "line=\"%u\" opnum=\"%u\" op=\"%s\"", " L%-4u #%-5u %s", + opline->lineno, + opcode, + decode); + efree(decode); opline++; } while (opcode++ < end); } @@ -271,23 +266,27 @@ void phpdbg_print_opcodes_function(const char *function, size_t len) { zend_function *func = zend_hash_str_find_ptr(EG(function_table), function, len); if (!func) { + zend_string *rt_name; + ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), rt_name, func) { + if (func->type == ZEND_USER_FUNCTION && *rt_name->val == '\0') { + if (func->op_array.function_name->len == len && !zend_binary_strcasecmp(function, len, func->op_array.function_name->val, func->op_array.function_name->len)) { + phpdbg_print_opcodes_function(rt_name->val, rt_name->len); + } + } + } ZEND_HASH_FOREACH_END(); + return; } - phpdbg_out("function name: %.*s\n", (int) len, function); + phpdbg_out("function name: %.*s\n", ZSTR_LEN(func->op_array.function_name), ZSTR_VAL(func->op_array.function_name)); phpdbg_print_function_helper(func); } -void phpdbg_print_opcodes_method(const char *class, const char *function) { - zend_class_entry *ce; +static void phpdbg_print_opcodes_method_ce(zend_class_entry *ce, const char *function) { zend_function *func; - if (phpdbg_safe_class_lookup(class, strlen(class), &ce) != SUCCESS) { - return; - } - if (ce->type != ZEND_USER_CLASS) { - phpdbg_out("function name: %s::%s (internal)\n", class, function); + phpdbg_out("function name: %s::%s (internal)\n", ce->name->val, function); return; } @@ -295,20 +294,34 @@ void phpdbg_print_opcodes_method(const char *class, const char *function) { return; } - phpdbg_out("function name: %s::%s\n", class, function); + phpdbg_out("function name: %s::%s\n", ce->name->val, function); phpdbg_print_function_helper(func); } -void phpdbg_print_opcodes_class(const char *class) { +void phpdbg_print_opcodes_method(const char *class, const char *function) { zend_class_entry *ce; - zend_function *method; - zend_string *method_name; - zend_bool first = 1; if (phpdbg_safe_class_lookup(class, strlen(class), &ce) != SUCCESS) { + zend_string *rt_name; + ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), rt_name, ce) { + if (ce->type == ZEND_USER_CLASS && *rt_name->val == '\0') { + if (ce->name->len == strlen(class) && !zend_binary_strcasecmp(class, strlen(class), ce->name->val, ce->name->len)) { + phpdbg_print_opcodes_method_ce(ce, function); + } + } + } ZEND_HASH_FOREACH_END(); + return; } + phpdbg_print_opcodes_method_ce(ce, function); +} + +static void phpdbg_print_opcodes_ce(zend_class_entry *ce) { + zend_function *method; + zend_string *method_name; + zend_bool first = 1; + phpdbg_out("%s %s: %s\n", (ce->type == ZEND_USER_CLASS) ? "user" : "internal", @@ -343,10 +356,28 @@ void phpdbg_print_opcodes_class(const char *class) { } ZEND_HASH_FOREACH_END(); } +void phpdbg_print_opcodes_class(const char *class) { + zend_class_entry *ce; + + if (phpdbg_safe_class_lookup(class, strlen(class), &ce) != SUCCESS) { + zend_string *rt_name; + ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), rt_name, ce) { + if (ce->type == ZEND_USER_CLASS && *rt_name->val == '\0') { + if (ce->name->len == strlen(class) && !zend_binary_strcasecmp(class, strlen(class), ce->name->val, ce->name->len)) { + phpdbg_print_opcodes_ce(ce); + } + } + } ZEND_HASH_FOREACH_END(); + + return; + } + + phpdbg_print_opcodes_ce(ce); +} + PHPDBG_API void phpdbg_print_opcodes(char *function) { - char *method_name; - strtok(function, ":"); + char *method_name = strtok(function, ":"); if (function == NULL) { phpdbg_print_opcodes_main(); @@ -365,15 +396,15 @@ PHPDBG_API void phpdbg_print_opcodes(char *function) } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), name, ce) { + ZEND_HASH_FOREACH_PTR(EG(class_table), ce) { if (ce->type == ZEND_USER_CLASS) { phpdbg_out("\n\n"); - phpdbg_print_opcodes_class(ZSTR_VAL(name)); + phpdbg_print_opcodes_ce(ce); } } ZEND_HASH_FOREACH_END(); - } else if ((method_name = strtok(NULL, ":")) == NULL) { + } else if (method_name == NULL) { phpdbg_print_opcodes_function(function, strlen(function)); - } else if ((method_name + 1) == NULL) { + } else if ((method_name = strtok(NULL, ":")) == NULL) { phpdbg_print_opcodes_class(function); } else { phpdbg_print_opcodes_method(function, method_name); diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index 540706eae1..b00952c07b 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -25,6 +25,7 @@ #include "zend_exceptions.h" #include "zend_vm.h" #include "zend_generators.h" +#include "zend_interfaces.h" #include "phpdbg.h" #include "phpdbg_help.h" @@ -585,41 +586,31 @@ PHPDBG_COMMAND(frame) /* {{{ */ static inline void phpdbg_handle_exception(void) /* {{{ */ { - zend_fcall_info fci; - zval trace; zend_object *ex = EG(exception); - - /* get filename and linenumber before unsetting exception */ - /* not really useful??? see blow - const char *filename = zend_get_executed_filename(); - uint32_t lineno = zend_get_executed_lineno(); - */ + zend_string *msg, *file; + zend_long line; + zval zv, rv, tmp; EG(exception) = NULL; - /* call __toString */ - ZVAL_STRINGL(&fci.function_name, "__tostring", sizeof("__tostring") - 1); - fci.size = sizeof(fci); - fci.function_table = &ex->ce->function_table; - fci.symbol_table = NULL; - fci.object = ex; - fci.retval = &trace; - fci.param_count = 0; - fci.params = NULL; - fci.no_separation = 1; - if (zend_call_function(&fci, NULL) == SUCCESS) { - phpdbg_writeln("exception", "name=\"%s\" trace=\"%.*s\"", "Uncaught %s!\n%.*s", ZSTR_VAL(ex->ce->name), Z_STRLEN(trace), Z_STRVAL(trace)); - - zval_ptr_dtor(&trace); + ZVAL_OBJ(&zv, ex); + zend_call_method_with_0_params(&zv, ex->ce, NULL, "__tostring", &tmp); + file = zval_get_string(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("file"), 1, &rv)); + line = zval_get_long(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("line"), 1, &rv)); + + if (EG(exception)) { + EG(exception) = NULL; + msg = ZSTR_EMPTY_ALLOC(); } else { - phpdbg_error("exception", "name=\"%s\"", "Uncaught %s!", ZSTR_VAL(ex->ce->name)); + zend_update_property_string(zend_get_exception_base(&zv), &zv, ZEND_STRL("string"), Z_STRVAL(tmp)); + zval_ptr_dtor(&tmp); + msg = zval_get_string(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("string"), 1, &rv)); } - /* output useful information about address */ -/* not really useful ??? - phpdbg_writeln("exception", "opline=\"%p\" file=\"%s\" line=\"%u\"", "Stack entered at %p in %s on line %u", PHPDBG_G(ops)->opcodes, filename, lineno); */ + phpdbg_writeln("exception", "name=\"%s\" file=\"%s\" line=\"%lld\"", "Uncaught %s in %s on line %lld\n%s", ZSTR_VAL(ex->ce->name), ZSTR_VAL(file), line, ZSTR_VAL(msg)); + zend_string_release(msg); + zend_string_release(file); - zval_dtor(&fci.function_name); if (EG(prev_exception)) { OBJ_RELEASE(EG(prev_exception)); EG(prev_exception) = 0; @@ -668,6 +659,7 @@ PHPDBG_COMMAND(run) /* {{{ */ char **argv = emalloc(5 * sizeof(char *)); int argc = 0; int i; + /* TODO allow proper escaping with \, "" and '' here */ char *argv_str = strtok(param->str, " "); while (argv_str) { @@ -776,15 +768,19 @@ PHPDBG_COMMAND(ev) /* {{{ */ PHPDBG_G(flags) |= PHPDBG_IN_EVAL; zend_try { if (zend_eval_stringl(param->str, param->len, &retval, "eval()'d code") == SUCCESS) { - phpdbg_xml("<eval %r>"); - if (PHPDBG_G(flags) & PHPDBG_WRITE_XML) { - zval *zvp = &retval; - phpdbg_xml_var_dump(zvp); + if (EG(exception)) { + zend_exception_error(EG(exception), E_ERROR); + } else { + phpdbg_xml("<eval %r>"); + if (PHPDBG_G(flags) & PHPDBG_WRITE_XML) { + zval *zvp = &retval; + phpdbg_xml_var_dump(zvp); + } + zend_print_zval_r(&retval, 0); + phpdbg_xml("</eval>"); + phpdbg_out("\n"); + zval_ptr_dtor(&retval); } - zend_print_zval_r(&retval, 0); - phpdbg_xml("</eval>"); - phpdbg_out("\n"); - zval_ptr_dtor(&retval); } } zend_catch { EG(current_execute_data) = original_execute_data; @@ -793,6 +789,7 @@ PHPDBG_COMMAND(ev) /* {{{ */ EG(vm_stack_end) = original_stack->end; EG(vm_stack) = original_stack; } zend_end_try(); + PHPDBG_G(flags) &= ~PHPDBG_IN_EVAL; /* switch stepping back on */ @@ -1400,18 +1397,17 @@ void phpdbg_clean(zend_bool full) /* {{{ */ \ switch (phpdbg_interactive(allow_async_unsafe)) { \ zval zv; \ - default: \ + case PHPDBG_LEAVE: \ + case PHPDBG_FINISH: \ + case PHPDBG_UNTIL: \ + case PHPDBG_NEXT: \ if (exception) { \ Z_OBJ(zv) = exception; \ zend_throw_exception_internal(&zv); \ } \ /* fallthrough */ \ - case PHPDBG_LEAVE: \ - case PHPDBG_FINISH: \ - case PHPDBG_UNTIL: \ - case PHPDBG_NEXT:{ \ + default: \ goto next; \ - } \ } \ } while (0) @@ -1440,10 +1436,10 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ #endif /* check for uncaught exceptions */ - if (exception && PHPDBG_G(handled_exception) != exception) { + if (exception && PHPDBG_G(handled_exception) != exception && !(PHPDBG_G(flags) & PHPDBG_IN_EVAL)) { zend_execute_data *prev_ex = execute_data; zval zv, rv; - zend_string *file; + zend_string *file, *msg; zend_long line; do { @@ -1463,23 +1459,24 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */ ZVAL_OBJ(&zv, exception); file = zval_get_string(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("file"), 1, &rv)); line = zval_get_long(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("line"), 1, &rv)); + msg = zval_get_string(zend_read_property(zend_get_exception_base(&zv), &zv, ZEND_STRL("message"), 1, &rv)); - phpdbg_error("exception", "name=\"%s\" file=\"%s\" line=\"%lld\"", "Uncaught exception %s in %s on line %lld", ZSTR_VAL(exception->ce->name), ZSTR_VAL(file), line); + phpdbg_error("exception", "name=\"%s\" file=\"%s\" line=\"%lld\"", "Uncaught %s in %s on line %lld: %.*s", ZSTR_VAL(exception->ce->name), ZSTR_VAL(file), line, ZSTR_LEN(msg) < 80 ? ZSTR_LEN(msg) : 80, ZSTR_VAL(msg)); + zend_string_release(msg); zend_string_release(file); + DO_INTERACTIVE(1); } ex_is_caught: - /* allow conditional breakpoints and - initialization to access the vm uninterrupted */ - if ((PHPDBG_G(flags) & PHPDBG_IN_COND_BP) || - (PHPDBG_G(flags) & PHPDBG_IS_INITIALIZING)) { + /* allow conditional breakpoints and initialization to access the vm uninterrupted */ + if (PHPDBG_G(flags) & (PHPDBG_IN_COND_BP | PHPDBG_IS_INITIALIZING)) { /* skip possible breakpoints */ goto next; } /* perform seek operation */ - if (PHPDBG_G(flags) & PHPDBG_SEEK_MASK) { + if ((PHPDBG_G(flags) & PHPDBG_SEEK_MASK) && !(PHPDBG_G(flags) & PHPDBG_IN_EVAL)) { /* current address */ zend_ulong address = (zend_ulong) execute_data->opline; diff --git a/sapi/phpdbg/phpdbg_utils.c b/sapi/phpdbg/phpdbg_utils.c index 112f340d6b..2e1e1ed70c 100644 --- a/sapi/phpdbg/phpdbg_utils.c +++ b/sapi/phpdbg/phpdbg_utils.c @@ -728,11 +728,11 @@ PHPDBG_API zend_bool phpdbg_check_caught_ex(zend_execute_data *execute_data, zen op_num = op - op_array->opcodes; - for (i = 0; i < op_array->last_try_catch && op_array->try_catch_array[i].try_op < op_num; i++) { + for (i = 0; i < op_array->last_try_catch && op_array->try_catch_array[i].try_op <= op_num; i++) { uint32_t catch = op_array->try_catch_array[i].catch_op, finally = op_array->try_catch_array[i].finally_op; if (op_num <= catch || op_num <= finally) { - if (finally && finally < catch) { - return 0; + if (finally) { + return 1; } do { @@ -764,22 +764,22 @@ char *phpdbg_short_zval_print(zval *zv, int maxlen) /* {{{ */ switch (Z_TYPE_P(zv)) { case IS_UNDEF: - decode = zend_strndup("", 0); + decode = estrdup(""); break; case IS_NULL: - decode = zend_strndup(ZEND_STRL("null")); + decode = estrdup("null"); break; case IS_FALSE: - decode = zend_strndup(ZEND_STRL("false")); + decode = estrdup("false"); break; case IS_TRUE: - decode = zend_strndup(ZEND_STRL("true")); + decode = estrdup("true"); break; case IS_LONG: - asprintf(&decode, ZEND_ULONG_FMT, Z_LVAL_P(zv)); + spprintf(&decode, 0, ZEND_LONG_FMT, Z_LVAL_P(zv)); break; case IS_DOUBLE: - asprintf(&decode, "%.*G", 14, Z_DVAL_P(zv)); + spprintf(&decode, 0, "%.*G", 14, Z_DVAL_P(zv)); break; case IS_STRING: { int i; @@ -789,28 +789,32 @@ char *phpdbg_short_zval_print(zval *zv, int maxlen) /* {{{ */ ZSTR_VAL(str)[i] = ' '; } } - asprintf(&decode, "\"%.*s\"%c", ZSTR_LEN(str) <= maxlen - 2 ? (int) ZSTR_LEN(str) : (maxlen - 3), ZSTR_VAL(str), ZSTR_LEN(str) <= maxlen - 2 ? 0 : '+'); + spprintf(&decode, 0, "\"%.*s\"%c", + ZSTR_LEN(str) <= maxlen - 2 ? (int) ZSTR_LEN(str) : (maxlen - 3), + ZSTR_VAL(str), ZSTR_LEN(str) <= maxlen - 2 ? 0 : '+'); zend_string_release(str); } break; case IS_RESOURCE: - asprintf(&decode, "Rsrc #%d", Z_RES_HANDLE_P(zv)); + spprintf(&decode, 0, "Rsrc #%d", Z_RES_HANDLE_P(zv)); break; case IS_ARRAY: - asprintf(&decode, "array(%d)", zend_hash_num_elements(Z_ARR_P(zv))); + spprintf(&decode, 0, "array(%d)", zend_hash_num_elements(Z_ARR_P(zv))); break; case IS_OBJECT: { zend_string *str = Z_OBJCE_P(zv)->name; - asprintf(&decode, "%.*s%c", ZSTR_LEN(str) <= maxlen ? (int) ZSTR_LEN(str) : maxlen - 1, ZSTR_VAL(str), ZSTR_LEN(str) <= maxlen ? 0 : '+'); + spprintf(&decode, 0, "%.*s%c", + ZSTR_LEN(str) <= maxlen ? (int) ZSTR_LEN(str) : maxlen - 1, + ZSTR_VAL(str), ZSTR_LEN(str) <= maxlen ? 0 : '+'); break; } case IS_CONSTANT: - decode = zend_strndup(ZEND_STRL("<constant>")); + decode = estrdup("<constant>"); break; case IS_CONSTANT_AST: - decode = zend_strndup(ZEND_STRL("<ast>")); + decode = estrdup("<ast>"); break; default: - asprintf(&decode, "unknown type: %d", Z_TYPE_P(zv)); + spprintf(&decode, 0, "unknown type: %d", Z_TYPE_P(zv)); break; } diff --git a/sapi/phpdbg/tests/basic_run.phpt b/sapi/phpdbg/tests/basic_run.phpt new file mode 100644 index 0000000000..beb19b535a --- /dev/null +++ b/sapi/phpdbg/tests/basic_run.phpt @@ -0,0 +1,8 @@ +--TEST-- +Basic run +--PHPDBG-- +r +q +--EXPECTF-- +prompt> [Nothing to execute!] +prompt> diff --git a/sapi/phpdbg/tests/breakpoints_001.phpt b/sapi/phpdbg/tests/breakpoints_001.phpt new file mode 100644 index 0000000000..934f0d3554 --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_001.phpt @@ -0,0 +1,33 @@ +--TEST-- +Fundamental breakpoints functionality +--PHPDBG-- +b 3 +r +b 4 +c + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:3] +prompt> [Breakpoint #0 at %s:3, hits: 1] +>00003: echo 1; + 00004: echo 2; + 00005: echo 3; +prompt> [Breakpoint #1 added at %s:4] +prompt> 1 +[Breakpoint #1 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: echo 4; +prompt> 234 +[Script ended normally] +prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +echo 4; + diff --git a/sapi/phpdbg/tests/breakpoints_002.phpt b/sapi/phpdbg/tests/breakpoints_002.phpt new file mode 100644 index 0000000000..18aaef1f36 --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_002.phpt @@ -0,0 +1,40 @@ +--TEST-- +Preserve breakpoints on restart +--PHPDBG-- +b breakpoints_002.php:4 +r +b 3 +r +y +c + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:4] +prompt> 1 +[Breakpoint #0 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: echo 4; +prompt> [Breakpoint #1 added at %s:3] +prompt> Do you really want to restart execution? (type y or n): [Breakpoint #1 at %s:3, hits: 1] +>00003: echo 1; + 00004: echo 2; + 00005: echo 3; +prompt> 1 +[Breakpoint #0 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: echo 4; +prompt> 234 +[Script ended normally] +prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +echo 4; + diff --git a/sapi/phpdbg/tests/breakpoints_003.phpt b/sapi/phpdbg/tests/breakpoints_003.phpt new file mode 100644 index 0000000000..8caa64632b --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_003.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test deleting breakpoints +--PHPDBG-- +b 4 +b del 0 +b 5 +r +b del 1 +r +y +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:4] +prompt> [Deleted breakpoint #0] +prompt> [Breakpoint #1 added at %s:5] +prompt> 12 +[Breakpoint #1 at %s:5, hits: 1] +>00005: echo 3; + 00006: echo 4; + 00007: +prompt> [Deleted breakpoint #1] +prompt> Do you really want to restart execution? (type y or n): 1234 +[Script ended normally] +prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +echo 4; + diff --git a/sapi/phpdbg/tests/breakpoints_004.phpt b/sapi/phpdbg/tests/breakpoints_004.phpt new file mode 100644 index 0000000000..27ebd0bea2 --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_004.phpt @@ -0,0 +1,41 @@ +--TEST-- +Test opcode breakpoints +--PHPDBG-- +b ZEND_ECHO +r +c + + + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at ZEND_ECHO] +prompt> [Breakpoint #0 in ZEND_ECHO at %s:3, hits: 1] +>00003: echo 1; + 00004: echo 2; + 00005: echo 3; +prompt> 1 +[Breakpoint #0 in ZEND_ECHO at %s:4, hits: 2] +>00004: echo 2; + 00005: echo 3; + 00006: echo 4; +prompt> 2 +[Breakpoint #0 in ZEND_ECHO at %s:5, hits: 3] +>00005: echo 3; + 00006: echo 4; + 00007: +prompt> 3 +[Breakpoint #0 in ZEND_ECHO at %s:6, hits: 4] +>00006: echo 4; + 00007: +prompt> 4 +[Script ended normally] +prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +echo 4; diff --git a/sapi/phpdbg/tests/breakpoints_005.phpt b/sapi/phpdbg/tests/breakpoints_005.phpt new file mode 100644 index 0000000000..653dab9fcc --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_005.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test breakpoint into function context +--PHPDBG-- +b breakpoints_005.php:4 +r +ev $bar +c +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:4] +prompt> [Breakpoint #0 at %s:4, hits: 1] +>00004: var_dump($bar); + 00005: } + 00006: +prompt> test +prompt> string(4) "test" +[Script ended normally] +prompt> +--FILE-- +<?php + +function foo($bar) { + var_dump($bar); +} + +foo("test"); + diff --git a/sapi/phpdbg/tests/breakpoints_006.phpt b/sapi/phpdbg/tests/breakpoints_006.phpt new file mode 100644 index 0000000000..fa6f0cdc5b --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_006.phpt @@ -0,0 +1,26 @@ +--TEST-- +Basic function breakpoints +--PHPDBG-- +b foo +r +c +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at foo] +prompt> [Breakpoint #0 in foo() at %s:4, hits: 1] +>00004: var_dump($bar); + 00005: } + 00006: +prompt> string(4) "test" +[Script ended normally] +prompt> +--FILE-- +<?php + +function foo($bar) { + var_dump($bar); +} + +foo("test"); + diff --git a/sapi/phpdbg/tests/breakpoints_007.phpt b/sapi/phpdbg/tests/breakpoints_007.phpt new file mode 100644 index 0000000000..f921c257c5 --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_007.phpt @@ -0,0 +1,25 @@ +--TEST-- +Basic method breakpoints +--PHPDBG-- +b bar::foo +r +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at bar::foo] +prompt> [Breakpoint #0 in bar::foo() at %s:5, hits: 1] +>00005: var_dump($bar); + 00006: } + 00007: } +prompt> +--FILE-- +<?php + +class bar { + function foo($bar) { + var_dump($bar); + } +} + +(new bar)->foo("test"); + diff --git a/sapi/phpdbg/tests/breakpoints_008.phpt b/sapi/phpdbg/tests/breakpoints_008.phpt new file mode 100644 index 0000000000..cbe5042c2b --- /dev/null +++ b/sapi/phpdbg/tests/breakpoints_008.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test namespaced and non-lowercase breakpoint names +--PHPDBG-- +b foo\bar::foo +b \Foo\Bar::Foo +r +c +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at foo\bar::foo] +prompt> [Breakpoint exists at Foo\Bar::Foo] +prompt> [Breakpoint #0 in foo\bar::foo() at %s:6, hits: 1] +>00006: var_dump($bar); + 00007: } + 00008: } +prompt> string(4) "test" +[Script ended normally] +prompt> +--FILE-- +<?php + +namespace Foo { + class Bar { + function Foo($bar) { + var_dump($bar); + } + } +} + +namespace { + (new \Foo\Bar)->Foo("test"); +} + diff --git a/sapi/phpdbg/tests/clean_001.phpt b/sapi/phpdbg/tests/clean_001.phpt new file mode 100644 index 0000000000..0500850448 --- /dev/null +++ b/sapi/phpdbg/tests/clean_001.phpt @@ -0,0 +1,60 @@ +--TEST-- +Cleaning must preserve breakpoints +--INI-- +opcache.enable_cli=0 +--PHPDBG-- +b 4 +b foo +r +c +clean +y +c +r +c + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:4] +prompt> [Breakpoint #1 added at foo] +prompt> 1 +[Breakpoint #0 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: foo(); +prompt> 23 +[Breakpoint #1 in foo() at %s:9, hits: 1] +>00009: echo 4; + 00010: } + 00011: +prompt> Do you really want to clean your current environment? (type y or n): Cleaning Execution Environment +Classes %d +Functions %d +Constants %d +Includes 0 +prompt> [Not running] +prompt> 1 +[Breakpoint #0 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: foo(); +prompt> 23 +[Breakpoint #1 in foo() at %s:9, hits: 1] +>00009: echo 4; + 00010: } + 00011: +prompt> 4 +[Script ended normally] +prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +foo(); + +function foo() { + echo 4; +} diff --git a/sapi/phpdbg/tests/clear_001.phpt b/sapi/phpdbg/tests/clear_001.phpt new file mode 100644 index 0000000000..96d73990eb --- /dev/null +++ b/sapi/phpdbg/tests/clear_001.phpt @@ -0,0 +1,44 @@ +--TEST-- +Test clearing breakpoints +--INI-- +opcache.enable_cli=0 +--PHPDBG-- +b 4 +b foo +r +clear +c +i b +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:4] +prompt> [Breakpoint #1 added at foo] +prompt> 1 +[Breakpoint #0 at %s:4, hits: 1] +>00004: echo 2; + 00005: echo 3; + 00006: foo(); +prompt> Clearing Breakpoints +File 1 +Functions 1 +Methods 0 +Oplines 0 +File oplines 0 +Function oplines 0 +Method oplines 0 +Conditionals 0 +prompt> 234 +[Script ended normally] +prompt> prompt> +--FILE-- +<?php + +echo 1; +echo 2; +echo 3; +foo(); + +function foo() { + echo 4; +} diff --git a/sapi/phpdbg/tests/commands/0001_basic.test b/sapi/phpdbg/tests/commands/0001_basic.test deleted file mode 100644 index 08aa9ab664..0000000000 --- a/sapi/phpdbg/tests/commands/0001_basic.test +++ /dev/null @@ -1,8 +0,0 @@ -####################################################### -# name: basic -# purpose: check basic functionality of phpdbg console -# expect: TEST::EXACT -# options: -rr -####################################################### -# [Nothing to execute!] -####################################################### diff --git a/sapi/phpdbg/tests/commands/0002_set.test b/sapi/phpdbg/tests/commands/0002_set.test deleted file mode 100644 index 6a14a15adc..0000000000 --- a/sapi/phpdbg/tests/commands/0002_set.test +++ /dev/null @@ -1,21 +0,0 @@ -################################################# -# name: set -# purpose: tests for set commands -# expect: TEST::CISTRING -# options: -rr -################################################# -# setting prompt color -# setting error color -# setting notice color -# Failed to find breakpoint #0 -# [Oplog off] -# opened oplog test.log -# nothing -################################################# -set color prompt none -set color error none -set color notice none -set prompt promot> -set break 0 -set oplog -set oplog test.log diff --git a/sapi/phpdbg/tests/commands/0101_info.test b/sapi/phpdbg/tests/commands/0101_info.test deleted file mode 100644 index 397a45c992..0000000000 --- a/sapi/phpdbg/tests/commands/0101_info.test +++ /dev/null @@ -1,19 +0,0 @@ -################################################# -# name: info -# purpose: test info commands -# expect: TEST::FORMAT -# options: -rr -################################################# -#[User Classes (%d)] -#User Class test (3) -#|---- in phpdbginit code on line %d -################################################# -<: -class test { - public function testMethod(){} - private function testPrivateMethod(){} - protected function testProtectedMethod(){} -} -:> -info classes -q diff --git a/sapi/phpdbg/tests/commands/0102_print.test b/sapi/phpdbg/tests/commands/0102_print.test deleted file mode 100644 index 7078b13ea2..0000000000 --- a/sapi/phpdbg/tests/commands/0102_print.test +++ /dev/null @@ -1,27 +0,0 @@ -################################################# -# name: print -# purpose: test print commands -# expect: TEST::FORMAT -# options: -rr -################################################# -#[User Class: test (3 methods)] -#L%d-%d test::testMethod() %s - 0x%s + 1 ops -# L%d #0 RETURN null -#L%d-%d test::testPrivateMethod() %s - 0x%s + 1 ops -# L%d #0 RETURN null -#L%d-%d test::testProtectedMethod() %s - 0x%s + 1 ops -# L%d #0 RETURN null -#[User Method testMethod (1 ops)] -#L%d-%d test::testMethod() %s - 0x%s + 1 ops -# L%d #0 RETURN null -################################################# -<: -class test { - public function testMethod(){} - private function testPrivateMethod(){} - protected function testProtectedMethod(){} -} -:> -print class test -print method test::testMethod -q diff --git a/sapi/phpdbg/tests/commands/0103_register.test b/sapi/phpdbg/tests/commands/0103_register.test deleted file mode 100644 index 703a12f771..0000000000 --- a/sapi/phpdbg/tests/commands/0103_register.test +++ /dev/null @@ -1,28 +0,0 @@ -################################################# -# name: register -# purpose: test registration functions -# expect: TEST::FORMAT -# options: -rr -################################################# -#[Registered test_function] -#array(5) { -# [0]=> -# int(1) -# [1]=> -# int(2) -# [2]=> -# int(3) -# [3]=> -# int(4) -# [4]=> -# int(5) -#} -################################################# -<: -function test_function() { - var_dump(func_get_args()); -} -:> -R test_function -test_function 1 2 3 4 5 -q diff --git a/sapi/phpdbg/tests/commands/0104_clean.test b/sapi/phpdbg/tests/commands/0104_clean.test deleted file mode 100644 index 2c7660ad60..0000000000 --- a/sapi/phpdbg/tests/commands/0104_clean.test +++ /dev/null @@ -1,14 +0,0 @@ -################################################# -# name: clean -# purpose: test cleaning environment -# expect: TEST::FORMAT -# options: -rr -################################################# -#Cleaning Execution Environment -#Classes %d -#Functions %d -#Constants %d -#Includes %d -################################################# -clean -quit diff --git a/sapi/phpdbg/tests/commands/0105_clear.test b/sapi/phpdbg/tests/commands/0105_clear.test deleted file mode 100644 index 8ce1002491..0000000000 --- a/sapi/phpdbg/tests/commands/0105_clear.test +++ /dev/null @@ -1,18 +0,0 @@ -################################################# -# name: clear -# purpose: test clearing breakpoints -# expect: TEST::FORMAT -# options: -rr -################################################# -#Clearing Breakpoints -#File%w%d -#Functions%w%d -#Methods%w%d -#Oplines%w%d -#File oplines%w%d -#Function oplines%w%d -#Method oplines%w%d -#Conditionals%w%d -################################################# -clear -quit diff --git a/sapi/phpdbg/tests/commands/0106_compile.test b/sapi/phpdbg/tests/commands/0106_compile.test deleted file mode 100644 index b4d801670b..0000000000 --- a/sapi/phpdbg/tests/commands/0106_compile.test +++ /dev/null @@ -1,18 +0,0 @@ -################################################# -# name: compile -# purpose: test compiling code -# expect: TEST::FORMAT -# options: -rr -################################################# -#[Successful compilation of %s] -#Hello World -#[Script ended normally] -################################################# -<: -define('OUT', - tempnam(null, "phpdbg")); -file_put_contents(OUT, "<?php echo \"Hello World\"; ?>"); -phpdbg_exec(OUT); -:> -run -quit diff --git a/sapi/phpdbg/tests/commands/0107_compile.test b/sapi/phpdbg/tests/commands/0107_compile.test deleted file mode 100644 index 4842cb74f1..0000000000 --- a/sapi/phpdbg/tests/commands/0107_compile.test +++ /dev/null @@ -1,17 +0,0 @@ -################################################# -# name: compile -# purpose: test compiling error code -# expect: TEST::FORMAT -# options: -rr -################################################# -#[PHP Parse error: syntax error, unexpected 'echo' (T_ECHO) in %s on line %s] -#[Could not find information about included file...] -################################################# -<: -define('OUT', - tempnam(null, "phpdbg")); -file_put_contents(OUT, "<?error echo \"Hello World\"; ?>"); -phpdbg_exec(OUT); -:> -run -quit diff --git a/sapi/phpdbg/tests/exceptions_001.phpt b/sapi/phpdbg/tests/exceptions_001.phpt new file mode 100644 index 0000000000..fca94f512c --- /dev/null +++ b/sapi/phpdbg/tests/exceptions_001.phpt @@ -0,0 +1,46 @@ +--TEST-- +Properly handle exceptions going to be uncaught +--PHPDBG-- +r +t +ev 1 + 2 +c +q +--EXPECTF-- +[Successful compilation of %s] +prompt> handle first +[Uncaught Error in %s on line 16: Call to undefined function foo()] +>00016: foo(); // Error + 00017: } catch (\Exception $e) { + 00018: var_dump($e); +prompt> frame #0: {closure}() at %s:16 +frame #1: {main} at %s:18 +prompt> 3 +prompt> Uncaught Error in %s on line 16 +Error: Call to undefined function foo() in %s:16 +Stack trace: +#0 %s(18): {closure}() +#1 {main} +[Script ended normally] +prompt> +--FILE-- +<?php + +(function() { + try { + foo(); // Error + } catch (\Exception $e) { + var_dump($e); + } finally { + print "handle first\n"; + return "ok"; + } +})(); + +(function() { + try { + foo(); // Error + } catch (\Exception $e) { + var_dump($e); + } +})(); diff --git a/sapi/phpdbg/tests/exceptions_002.phpt b/sapi/phpdbg/tests/exceptions_002.phpt new file mode 100644 index 0000000000..9d3d805a5f --- /dev/null +++ b/sapi/phpdbg/tests/exceptions_002.phpt @@ -0,0 +1,51 @@ +--TEST-- +Test exceptions in eval during exception +--PHPDBG-- +r +ev next_error() +c + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> handle first +[Uncaught Error in %s on line 16: Call to undefined function foo()] +>00016: foo(); // Error + 00017: } catch (\Exception $e) { + 00018: var_dump($e); +prompt> +Fatal error: Uncaught Error: Call to undefined function next_error() in eval()'d code:1 +Stack trace: +#0 %s(16): unknown() +#1 %s(18): {closure}() +#2 {main} + thrown in eval()'d code on line 1 +prompt> Uncaught Error in %s on line 16 +Error: Call to undefined function foo() in %s:16 +Stack trace: +#0 %s(18): {closure}() +#1 {main} +[Script ended normally] +prompt> [The stack contains nothing !] +prompt> +--FILE-- +<?php + +(function() { + try { + foo(); // Error + } catch (\Exception $e) { + var_dump($e); + } finally { + print "handle first\n"; + return "ok"; + } +})(); + +(function() { + try { + foo(); // Error + } catch (\Exception $e) { + var_dump($e); + } +})(); diff --git a/sapi/phpdbg/tests/info_001.phpt b/sapi/phpdbg/tests/info_001.phpt new file mode 100644 index 0000000000..a1adb9ad0a --- /dev/null +++ b/sapi/phpdbg/tests/info_001.phpt @@ -0,0 +1,78 @@ +--TEST-- +Test basic info functionality +--PHPDBG-- +i classes +i funcs +b foo +r +i v +i g +i b +i d +i F +i e +i l +c +i v +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [User Classes (1)] +User Class Foo\Bar (2) +|---- in %s on line 4 +prompt> [User Functions (1)] +|-------- foo in %s on line 14 +prompt> [Breakpoint #0 added at foo] +prompt> string(4) "test" +[Breakpoint #0 in foo() at %s:15, hits: 1] +>00015: var_dump(strrev($baz)); + 00016: } + 00017: +prompt> [Variables in foo() (1)] +Address Refs Type Variable +%s 1 string $baz +string (4) "test" +prompt> [Superglobal variables (8)] +Address Refs Type Variable +%s 2 array $_GET +%s 2 array $_POST +%s 2 array $_COOKIE +%s 2 array $_FILES +%s 1 array &$GLOBALS +%s 2 array $_SERVER +%s 2 array $_ENV +%s 1 array $_REQUEST +prompt> ------------------------------------------------ +Function Breakpoints: +#0 foo +prompt> [User-defined constants (0)] +prompt> [Included files: 0] +prompt> [No error found!] +prompt> [Literal Constants in foo() (2)] +|-------- C0 -------> [var_dump] +|-------- C1 -------> [strrev] +prompt> string(4) "tset" +[Script ended normally] +prompt> [No active op array!] +prompt> +--FILE-- +<?php + +namespace Foo { + class Bar { + function Foo($bar) { + var_dump($bar); + } + + function baz() { } + } +} + +namespace { + function foo($baz) { + var_dump(strrev($baz)); + } + + (new \Foo\Bar)->Foo("test"); + foo("test"); +} diff --git a/sapi/phpdbg/tests/info_002.phpt b/sapi/phpdbg/tests/info_002.phpt new file mode 100644 index 0000000000..faeca0e430 --- /dev/null +++ b/sapi/phpdbg/tests/info_002.phpt @@ -0,0 +1,31 @@ +--TEST-- +info constants test +--PHPDBG-- +b 10 +r +i d +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at %s:10] +prompt> [Breakpoint #0 at %s:10, hits: 1] +>00010: print B; + 00011: +prompt> [User-defined constants (2)] +Address Refs Type Constant +%s 1 integer A +int (10) +%s 1 integer B +int (100) +prompt> +--FILE-- +<?php + +const A = 10; +const B = C::D * A; + +class C { + const D = 10; +} + +print B; diff --git a/sapi/phpdbg/tests/phpdbg_oplog_001.phpt b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt new file mode 100644 index 0000000000..868493b4ba --- /dev/null +++ b/sapi/phpdbg/tests/phpdbg_oplog_001.phpt @@ -0,0 +1,58 @@ +--TEST-- +Test phpdbg_*_oplog() functions +--INI-- +opcache.enable_cli=0 +--PHPDBG-- +r +q +--EXPECTF-- +[Successful compilation of %s] +prompt> halloarray(2) { + ["%s"]=> + array(6) { + [11]=> + int(0) + [13]=> + int(1) + [17]=> + int(2) + [18]=> + int(2) + [19]=> + int(3) + [21]=> + int(4) + } + ["A::b"]=> + array(2) { + [5]=> + int(5) + [4]=> + int(1) + } +} +[Script ended normally] +prompt> +--FILE-- +<?php + +class A { + public function b($c = 1) { + if ($c == 1) { + // comment + } + } +} + +phpdbg_start_oplog(); + +echo "hallo"; + +// fcalls + +$a = new A(); +$a->b(); +$a->b('ha'); + +var_dump(phpdbg_end_oplog(["functions" => true, "show_unexecuted" => true])); + diff --git a/sapi/phpdbg/tests/phpdbg_oplog_002.phpt b/sapi/phpdbg/tests/phpdbg_oplog_002.phpt new file mode 100644 index 0000000000..b9ba905caa --- /dev/null +++ b/sapi/phpdbg/tests/phpdbg_oplog_002.phpt @@ -0,0 +1,16 @@ +--TEST-- +phpdbg_end_oplog() alone must not crash +--PHPDBG-- +r +q +--EXPECTF-- +[Successful compilation of %s] +prompt> +Warning: Can not end an oplog without starting it in %s on line 3 +NULL +[Script ended normally] +prompt> +--FILE-- +<?php + +var_dump(phpdbg_end_oplog()); diff --git a/sapi/phpdbg/tests/print_001.phpt b/sapi/phpdbg/tests/print_001.phpt new file mode 100644 index 0000000000..375b13b3e3 --- /dev/null +++ b/sapi/phpdbg/tests/print_001.phpt @@ -0,0 +1,67 @@ +--TEST-- +Basic print functionality +--INI-- +opcache.enable_cli=0 +--PHPDBG-- +p foo +p class \Foo\bar +p +p e +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [User Function foo (8 ops)] +L14-16 foo() %s - %s + 8 ops + L14 #0 RECV 1 $baz + L15 #1 INIT_FCALL 112 "var_dump" + L15 #2 INIT_FCALL 112 "strrev" + L15 #3 SEND_VAR $baz 1 + L15 #4 DO_ICALL @0 + L15 #5 SEND_VAR @0 1 + L15 #6 DO_ICALL + L15 #7 RETURN null +prompt> [User Class: Foo\Bar (2 methods)] +L5-7 Foo\Bar::Foo() %s - %s + 5 ops + L5 #0 RECV 1 $bar + L6 #1 INIT_NS_FCALL_BY_NAME "Foo\\var_dump" + L6 #2 SEND_VAR_EX $bar 1 + L6 #3 DO_FCALL + L6 #4 RETURN null +L9-9 Foo\Bar::baz() %s - %s + 1 ops + L9 #0 RETURN null +prompt> [Not Executing!] +prompt> [Context %s (11 ops)] +L1-19 {main}() %s - %s + 11 ops + L4 #0 NOP + L14 #1 NOP + L18 #2 NEW "Foo\\Bar" @1 + L18 #3 DO_FCALL + L18 #4 INIT_METHOD_CALL @1 "Foo" + L18 #5 SEND_VAL_EX "test" 1 + L18 #6 DO_FCALL + L19 #7 INIT_FCALL 144 "foo" + L19 #8 SEND_VAL "test" 1 + L19 #9 DO_FCALL + L19 #10 RETURN 1 +prompt> +--FILE-- +<?php + +namespace Foo { + class Bar { + function Foo($bar) { + var_dump($bar); + } + + function baz() { } + } +} + +namespace { + function foo($baz) { + var_dump(strrev($baz)); + } + + (new \Foo\Bar)->Foo("test"); + foo("test"); +} diff --git a/sapi/phpdbg/tests/print_002.phpt b/sapi/phpdbg/tests/print_002.phpt new file mode 100644 index 0000000000..40eca446a9 --- /dev/null +++ b/sapi/phpdbg/tests/print_002.phpt @@ -0,0 +1,51 @@ +--TEST-- +Relative print commands +--INI-- +opcache.enable_cli=0 +--PHPDBG-- +b foo +r +p +p o +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at foo] +prompt> string(4) "test" +[Breakpoint #0 in foo() at %s:15, hits: 1] +>00015: var_dump(strrev($baz)); + 00016: } + 00017: +prompt> [Stack in foo() (8 ops)] +L14-16 foo() %s - %s + 8 ops + L14 #0 RECV 1 $baz + L15 #1 INIT_FCALL 112 "var_dump" + L15 #2 INIT_FCALL 112 "strrev" + L15 #3 SEND_VAR $baz 1 + L15 #4 DO_ICALL @0 + L15 #5 SEND_VAR @0 1 + L15 #6 DO_ICALL + L15 #7 RETURN null +prompt> [L15 %s INIT_FCALL 112 "var_dump" %s] +prompt> +--FILE-- +<?php + +namespace Foo { + class Bar { + function Foo($bar) { + var_dump($bar); + } + + function baz() { } + } +} + +namespace { + function foo($baz) { + var_dump(strrev($baz)); + } + + (new \Foo\Bar)->Foo("test"); + foo("test"); +} diff --git a/sapi/phpdbg/tests/run-tests.php b/sapi/phpdbg/tests/run-tests.php deleted file mode 100644 index 4afb64561c..0000000000 --- a/sapi/phpdbg/tests/run-tests.php +++ /dev/null @@ -1,597 +0,0 @@ -<?php -namespace phpdbg\testing { - - /* - * Workaround ... - */ - if (!defined('DIR_SEP')) - define('DIR_SEP', '\\' . DIRECTORY_SEPARATOR); - - /** - * TestConfigurationExceptions are thrown - * when the configuration prohibits tests executing - * - * @package phpdbg - * @subpackage testing - */ - class TestConfigurationException extends \Exception { - - /** - * - * @param array Tests confguration - * @param message Exception message - * @param ... formatting parameters - */ - public function __construct() { - $argv = func_get_args(); - - if (count($argv)) { - - $this->config = array_shift($argv); - $this->message = vsprintf( - array_shift($argv), $argv); - } - } - } - - /** - * - * @package phpdbg - * @subpackage testing - */ - class TestsConfiguration implements \ArrayAccess { - - /** - * - * @param array basic configuration - * @param array argv - */ - public function __construct($config, $cmd) { - $this->options = $config; - while (($key = array_shift($cmd))) { - switch (substr($key, 0, 1)) { - case '-': switch(substr($key, 1, 1)) { - case '-': { - $arg = substr($key, 2); - if (($e=strpos($arg, '=')) !== false) { - $key = substr($arg, 0, $e); - $value = substr($arg, $e+1); - } else { - $key = $arg; - $value = array_shift($cmd); - } - - if (isset($key) && isset($value)) { - switch ($key) { - case 'phpdbg': - case 'width': - $this->options[$key] = $value; - break; - - default: { - if (isset($config[$key])) { - if (is_array($config[$key])) { - $this->options[$key][] = $value; - } else { - $this->options[$key] = array($config[$key], $value); - } - } else { - $this->options[$key] = $value; - } - } - } - - } - } break; - - default: - $this->flags[] = substr($key, 1); - } break; - } - } - - if (!is_executable($this->options['phpdbg'])) { - throw new TestConfigurationException( - $this->options, 'phpdbg could not be found at the specified path (%s)', $this->options['phpdbg']); - } else $this->options['phpdbg'] = realpath($this->options['phpdbg']); - - $this->options['width'] = (integer) $this->options['width']; - - /* display properly, all the time */ - if ($this->options['width'] < 50) { - $this->options['width'] = 50; - } - - /* calculate column widths */ - $this->options['lwidth'] = ceil($this->options['width'] / 3); - $this->options['rwidth'] = ceil($this->options['width'] - $this->options['lwidth']) - 5; - } - - public function hasFlag($flag) { - return in_array( - $flag, $this->flags); - } - - public function offsetExists($offset) { return isset($this->options[$offset]); } - public function offsetGet($offset) { return $this->options[$offset]; } - public function offsetUnset($offset) { unset($this->options[$offset]); } - public function offsetSet($offset, $data) { $this->options[$offset] = $data; } - - protected $options = array(); - protected $flags = array(); - } - - /** - * Tests is the console programming API for the test suite - * - * @package phpdbg - * @subpackage testing - */ - class Tests { - - /** - * Construct the console object - * - * @param array basic configuration - * @param array command line - */ - public function __construct(TestsConfiguration $config) { - $this->config = $config; - - if ($this->config->hasFlag('help') || - $this->config->hasFlag('h')) { - $this->showUsage(); - exit; - } - } - - /** - * Find valid paths as specified by configuration - * - */ - public function findPaths($in = null) { - $paths = array(); - $where = ($in != null) ? array($in) : $this->config['path']; - - foreach ($where as $path) { - if ($path) { - if (is_dir($path)) { - $paths[] = $path; - foreach (scandir($path) as $child) { - if ($child != '.' && $child != '..') { - $paths = array_merge( - $paths, $this->findPaths("$path/$child")); - } - } - } - } - } - - return $paths; - } - - /** - * - * @param string the path to log - */ - public function logPath($path) { - printf( - '%s [%s]%s', - str_repeat( - '-', $this->config['width'] - strlen($path)), - $path, PHP_EOL); - } - - /** - * - * @param string the path to log - */ - public function logPathStats($path) { - if (!isset($this->stats[$path])) { - return; - } - - $total = array_sum($this->stats[$path]); - - if ($total) { - @$this->totals[true] += $this->stats[$path][true]; - @$this->totals[false] += $this->stats[$path][false]; - - $stats = @sprintf( - "%d/%d %%%d", - $this->stats[$path][true], - $this->stats[$path][false], - (100 / $total) * $this->stats[$path][true]); - - printf( - '%s [%s]%s', - str_repeat( - ' ', $this->config['width'] - strlen($stats)), - $stats, PHP_EOL); - - printf("%s%s", str_repeat('-', $this->config['width']+3), PHP_EOL); - printf("%s", PHP_EOL); - } - } - - /** - * - */ - public function logStats() { - $total = array_sum($this->totals); - $stats = @sprintf( - "%d/%d %%%d", - $this->totals[true], - $this->totals[false], - (100 / $total) * $this->totals[true]); - printf( - '%s [%s]%s', - str_repeat( - ' ', $this->config['width'] - strlen($stats)), - $stats, PHP_EOL); - - } - - /** - * - */ - protected function showUsage() { - printf('usage: php %s [flags] [options]%s', $this->config['exec'], PHP_EOL); - printf('[options]:%s', PHP_EOL); - printf("\t--path\t\tadd a path to scan outside of tests directory%s", PHP_EOL); - printf("\t--width\t\tset line width%s", PHP_EOL); - printf("\t--options\toptions to pass to phpdbg%s", PHP_EOL); - printf("\t--phpdbg\tpath to phpdbg binary%s", PHP_EOL); - printf('[flags]:%s', PHP_EOL); - printf("\t-diff2stdout\t\twrite diff to stdout instead of files%s", PHP_EOL); - printf("\t-nodiff\t\tdo not write diffs on failure%s", PHP_EOL); - printf("\t-nolog\t\tdo not write logs on failure%s", PHP_EOL); - printf('[examples]:%s', PHP_EOL); - printf("\tphp %s --phpdbg=/usr/local/bin/phpdbg --path=/usr/src/phpdbg/tests --options -n%s", - $this->config['exec'], PHP_EOL); - - } - - /** - * Find valid tests at the specified path (assumed valid) - * - * @param string a valid path - */ - public function findTests($path) { - $tests = array(); - - foreach (scandir($path) as $file) { - if ($file == '.' || $file == '..') - continue; - - $test = sprintf('%s/%s', $path, $file); - - if (preg_match('~\.test$~', $test)) { - $tests[] = new Test($this->config, $test); - } - } - - return $tests; - } - - /** - * - * @param Test the test to log - */ - public function logTest($path, Test $test) { - @$this->stats[$path][($result=$test->getResult())]++; - - printf( - "%-{$this->config['lwidth']}s %-{$this->config['rwidth']}s [%s]%s", - $test->name, - $test->purpose, - $result ? "PASS" : "FAIL", - PHP_EOL); - - return $result; - } - - protected $config; - } - - class Test { - /* - * Expect exact line for line match - */ - const EXACT = 0x00000001; - - /* - * Expect strpos() !== false - */ - const STRING = 0x00000010; - - /* - * Expect stripos() !== false - */ - const CISTRING = 0x00000100; - - /* - * Formatted output - */ - const FORMAT = 0x00001000; - - /** - * Format specifiers - */ - private static $format = array( - 'search' => array( - '%e', - '%s', - '%S', - '%a', - '%A', - '%w', - '%i', - '%d', - '%x', - '%f', - '%c', - '%t', - '%T' - ), - 'replace' => array( - DIR_SEP, - '[^\r\n]+', - '[^\r\n]*', - '.+', - '.*', - '\s*', - '[+-]?\d+', - '\d+', - '[0-9a-fA-F]+', - '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', - '.', - '\t', - '\t+' - ) - ); - - /** - * Constructs a new Test object given a specilized phpdbginit file - * - * @param array configuration - * @param string file - */ - public function __construct(TestsConfiguration $config, $file) { - if (($handle = fopen($file, 'r'))) { - while (($line = fgets($handle))) { - $trim = trim($line); - - switch (substr($trim, 0, 1)) { - case '#': if (($chunks = array_map('trim', preg_split('~:~', substr($trim, 1), 2)))) { - if (property_exists($this, $chunks[0])) { - switch ($chunks[0]) { - case 'expect': { - if ($chunks[1]) { - switch (strtoupper($chunks[1])) { - case 'TEST::EXACT': - case 'EXACT': { $this->expect = TEST::EXACT; } break; - - case 'TEST::STRING': - case 'STRING': { $this->expect = TEST::STRING; } break; - - case 'TEST::CISTRING': - case 'CISTRING': { $this->expect = TEST::CISTRING; } break; - - case 'TEST::FORMAT': - case 'FORMAT': { $this->expect = TEST::FORMAT; } break; - - default: - throw new TestConfigurationException( - $this->config, "unknown type of expectation (%s)", $chunks[1]); - } - } - } break; - - default: { - $this->{$chunks[0]} = $chunks[1]; - } - } - } else switch(substr($trim, 1, 1)) { - case '#': { /* do nothing */ } break; - - default: { - $line = preg_replace( - "~(\r\n)~", "\n", substr($trim, 1)); - - $line = trim($line); - - switch ($this->expect) { - case TEST::FORMAT: - $this->match[] = str_replace( - self::$format['search'], - self::$format['replace'], preg_quote($line)); - break; - - default: $this->match[] = $line; - } - } - } - } break; - - default: - break 2; - } - } - fclose($handle); - - $this->config = $config; - $this->file = $file; - } - } - - /** - * Obvious!! - * - */ - public function getResult() { - $options = sprintf('-i%s -nqb', $this->file); - - if ($this->options) { - $options = sprintf( - '%s %s %s', - $options, - $this->config['options'], - $this->options - ); - } else { - $options = sprintf( - '%s %s', $options, $this->config['options'] - ); - } - - $result = `{$this->config['phpdbg']} {$options}`; - - if ($result) { - foreach (preg_split('~(\r|\n)~', $result) as $num => $line) { - if (!$line && !isset($this->match[$num])) - continue; - - switch ($this->expect) { - case TEST::EXACT: { - if (strcmp($line, $this->match[$num]) !== 0) { - $this->diff['wants'][$num] = &$this->match[$num]; - $this->diff['gets'][$num] = $line; - } - } continue 2; - - case TEST::STRING: { - if (strpos($line, $this->match[$num]) === false) { - $this->diff['wants'][$num] = &$this->match[$num]; - $this->diff['gets'][$num] = $line; - } - } continue 2; - - case TEST::CISTRING: { - if (stripos($line, $this->match[$num]) === false) { - $this->diff['wants'][$num] = &$this->match[$num]; - $this->diff['gets'][$num] = $line; - } - } continue 2; - - case TEST::FORMAT: { - $line = trim($line); - if (!preg_match("/^{$this->match[$num]}\$/s", $line)) { - $this->diff['wants'][$num] = &$this->match[$num]; - $this->diff['gets'][$num] = $line; - } - } continue 2; - } - } - } - - $this->writeLog($result); - $this->writeDiff(); - - return (count($this->diff) == 0); - } - - /** - * Write diff to disk if configuration allows it - * - */ - protected function writeDiff() { - if (count($this->diff['wants'])) { - if (!$this->config->hasFlag('nodiff')) { - if ($this->config->hasFlag('diff2stdout')) { - $difffile = "php://stdout"; - file_put_contents($difffile, "====DIFF====\n"); - } else { - $difffile = sprintf( - '%s/%s.diff', - dirname($this->file), basename($this->file)); - } - - if (($diff = fopen($difffile, 'w+'))) { - - foreach ($this->diff['wants'] as $line => $want) { - $got = $this->diff['gets'][$line]; - - fprintf( - $diff, '(%d) -%s%s', $line+1, $want, PHP_EOL); - fprintf( - $diff, '(%d) +%s%s', $line+1, $got, PHP_EOL); - } - - fclose($diff); - } - } - } else unlink($diff); - } - - /** - * Write log to disk if configuration allows it - * - */ - protected function writeLog($result = null) { - $log = sprintf( - '%s/%s.log', - dirname($this->file), basename($this->file)); - - if (count($this->diff) && $result) { - if (!in_array('nolog', $this->config['flags'])) { - @file_put_contents( - $log, $result); - } - } else unlink($log); - } - - public $name; - public $purpose; - public $file; - public $options; - public $expect; - - protected $match; - protected $diff; - protected $stats; - protected $totals; - } -} - -namespace { - use \phpdbg\Testing\Test; - use \phpdbg\Testing\Tests; - use \phpdbg\Testing\TestsConfiguration; - - $cwd = dirname(__FILE__); - $cmd = $_SERVER['argv']; - - $retval = 0; - - { - $config = new TestsConfiguration(array( - 'exec' => realpath(array_shift($cmd)), - 'phpdbg' => realpath(sprintf( - '%s/../phpdbg', $cwd - )), - 'path' => array( - realpath(dirname(__FILE__)) - ), - 'flags' => array(), - 'width' => 75 - ), $cmd); - - $tests = new Tests($config); - - foreach ($tests->findPaths() as $path) { - $tests->logPath($path); - - foreach ($tests->findTests($path) as $test) { - $retval |= !$tests->logTest($path, $test); - } - - $tests->logPathStats($path); - } - - $tests->logStats(); - } - - die($retval); -} -?> diff --git a/sapi/phpdbg/tests/run_001.phpt b/sapi/phpdbg/tests/run_001.phpt new file mode 100644 index 0000000000..30aab1f17a --- /dev/null +++ b/sapi/phpdbg/tests/run_001.phpt @@ -0,0 +1,56 @@ +--TEST-- +Test argv passing +--PHPDBG-- +r +r 1 2 3 +r +q +--EXPECTF-- +[Successful compilation of %s] +prompt> int(5) +array(5) { + [0]=> + string(%d) "%s" + [1]=> + string(2) "--" + [2]=> + string(1) "1" + [3]=> + string(1) "2" + [4]=> + string(1) "3" +} +[Script ended normally] +prompt> int(5) +array(4) { + [0]=> + string(%d) "%s" + [1]=> + string(1) "1" + [2]=> + string(1) "2" + [3]=> + string(1) "3" +} +[Script ended normally] +prompt> int(5) +array(5) { + [0]=> + string(%d) "%s" + [1]=> + string(2) "--" + [2]=> + string(1) "1" + [3]=> + string(1) "2" + [4]=> + string(1) "3" +} +[Script ended normally] +prompt> +--ARGS-- +1 2 3 +--FILE-- +<?php + +var_dump($argc, $argv); diff --git a/tests/classes/type_hinting_004.phpt b/tests/classes/type_hinting_004.phpt index c5f8d3984b..8883f26336 100644 --- a/tests/classes/type_hinting_004.phpt +++ b/tests/classes/type_hinting_004.phpt @@ -149,10 +149,10 @@ Ensure type hints are enforced for functions invoked as callbacks. ?> --EXPECTF-- ---> Type hints with callback function: -1: Argument 1 passed to f1() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to f1() must be an instance of A, integer given%s(%d) in f1; -1: Argument 1 passed to f2() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to f2() must be an instance of A, integer given%s(%d) in f2; in f2; @@ -160,10 +160,10 @@ in f2; ---> Type hints with callback static method: -1: Argument 1 passed to C::f1() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to C::f1() must be an instance of A, integer given%s(%d) in C::f1 (static); -1: Argument 1 passed to C::f2() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to C::f2() must be an instance of A, integer given%s(%d) in C::f2 (static); in C::f2 (static); @@ -171,10 +171,10 @@ in C::f2 (static); ---> Type hints with callback instance method: -1: Argument 1 passed to D::f1() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to D::f1() must be an instance of A, integer given%s(%d) in C::f1 (instance); -1: Argument 1 passed to D::f2() must be an instance of A, integer given%s(%d) +0: Argument 1 passed to D::f2() must be an instance of A, integer given%s(%d) in C::f2 (instance); in C::f2 (instance); diff --git a/travis/compile.sh b/travis/compile.sh index 5478b885c0..6065c1df57 100755 --- a/travis/compile.sh +++ b/travis/compile.sh @@ -57,7 +57,6 @@ $TS \ --with-imap \ --with-imap-ssl \ --with-freetype-dir=/usr \ ---with-t1lib=/usr \ --with-xpm-dir=/usr \ --with-kerberos \ --enable-sysvmsg |