summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--README.RELEASE_PROCESS18
-rw-r--r--UPGRADING24
-rw-r--r--Zend/Makefile.am2
-rw-r--r--Zend/tests/assert/expect_015.phpt2
-rw-r--r--Zend/tests/bug63336.phpt10
-rw-r--r--Zend/tests/bug64896.phpt1
-rw-r--r--Zend/tests/bug69446.phpt30
-rw-r--r--Zend/tests/bug69446_2.phpt38
-rw-r--r--Zend/tests/gc_033.phpt2
-rw-r--r--Zend/tests/gc_035.phpt24
-rw-r--r--Zend/tests/generators/basic_yield_from_exception_handling.phpt59
-rw-r--r--Zend/tests/generators/basic_yield_from_proxying.phpt42
-rw-r--r--Zend/tests/generators/bug69419.phpt22
-rw-r--r--Zend/tests/generators/multiple_yield_from_on_same_generator.phpt41
-rw-r--r--Zend/tests/generators/mutli_yield_from_with_exception.phpt50
-rw-r--r--Zend/tests/generators/recursive_yield_from.phpt34
-rw-r--r--Zend/tests/generators/yield_from_already_running.phpt14
-rw-r--r--Zend/tests/generators/yield_from_array.phpt22
-rw-r--r--Zend/tests/generators/yield_from_backtrace.phpt49
-rw-r--r--Zend/tests/generators/yield_from_deep_recursion.phpt26
-rw-r--r--Zend/tests/generators/yield_from_multi_tree.phpt332
-rw-r--r--Zend/tests/generators/yield_from_multi_tree_exception.phpt78
-rw-r--r--Zend/tests/recursive_debug_info.phpt19
-rw-r--r--Zend/zend.c33
-rw-r--r--Zend/zend_API.c1
-rw-r--r--Zend/zend_alloc.c10
-rw-r--r--Zend/zend_alloc.h14
-rw-r--r--Zend/zend_ast.c8
-rw-r--r--Zend/zend_ast.h1
-rw-r--r--Zend/zend_builtin_functions.c5
-rw-r--r--Zend/zend_closures.c92
-rw-r--r--Zend/zend_compile.c39
-rw-r--r--Zend/zend_compile.h14
-rw-r--r--Zend/zend_exceptions.c3
-rw-r--r--Zend/zend_execute.c87
-rw-r--r--Zend/zend_execute.h34
-rw-r--r--Zend/zend_execute_API.c9
-rw-r--r--Zend/zend_gc.c363
-rw-r--r--Zend/zend_generators.c518
-rw-r--r--Zend/zend_generators.h51
-rw-r--r--Zend/zend_hash.h9
-rw-r--r--Zend/zend_language_parser.y3
-rw-r--r--Zend/zend_language_scanner.c2007
-rw-r--r--Zend/zend_language_scanner.l4
-rw-r--r--Zend/zend_objects_API.c8
-rw-r--r--Zend/zend_smart_str.c61
-rw-r--r--Zend/zend_smart_str.h39
-rw-r--r--Zend/zend_variables.c4
-rw-r--r--Zend/zend_vm_def.h564
-rw-r--r--Zend/zend_vm_execute.h2719
-rw-r--r--Zend/zend_vm_execute.skl2
-rw-r--r--Zend/zend_vm_opcodes.c2
-rw-r--r--Zend/zend_vm_opcodes.h1
-rw-r--r--configure.in2
-rw-r--r--ext/curl/interface.c5
-rw-r--r--ext/curl/tests/bug69316.phpt45
-rw-r--r--ext/date/lib/timezonedb.h1154
-rw-r--r--ext/date/php_date.c1
-rw-r--r--ext/date/tests/DateTimeZone_getTransitions_basic1.phpt6
-rw-r--r--ext/date/tests/DateTime_add-massive.phpt6
-rw-r--r--ext/date/tests/DateTime_diff-massive.phpt6
-rw-r--r--ext/date/tests/DateTime_sub-massive.phpt6
-rw-r--r--ext/date/tests/bug48058.phpt6
-rw-r--r--ext/date/tests/mktime-3-64bit.phpt22
-rw-r--r--ext/date/tests/timezone_transitions_get_basic1.phpt10
-rw-r--r--ext/dom/document.c8
-rw-r--r--ext/dom/tests/DOMDocument_loadHTMLfile_error2.phpt5
-rw-r--r--ext/fileinfo/fileinfo.c5
-rw-r--r--ext/fileinfo/libmagic/softmagic.c19
-rw-r--r--ext/fileinfo/tests/bug68819_001.phpt18
-rw-r--r--ext/fileinfo/tests/bug68819_002.phpt26
-rw-r--r--ext/fileinfo/tests/finfo_file_basic.phpt4
-rw-r--r--ext/filter/filter.c1
-rw-r--r--ext/gd/gd.c6
-rw-r--r--ext/gd/tests/imageloadfont_error1.phpt2
-rw-r--r--ext/gmp/gmp.c14
-rw-r--r--ext/gmp/tests/gmp_random_bits.phpt4
-rw-r--r--ext/gmp/tests/gmp_random_range.phpt4
-rw-r--r--ext/gmp/tests/gmp_remroot.phpt2
-rw-r--r--ext/hash/hash.c7
-rw-r--r--ext/hash/tests/hash_hmac_file_error.phpt7
-rw-r--r--ext/intl/breakiterator/breakiterator_methods.cpp4
-rw-r--r--ext/intl/calendar/calendar_methods.cpp2
-rw-r--r--ext/intl/collator/collator_create.c16
-rw-r--r--ext/intl/dateformat/dateformat_attrcpp.cpp1
-rw-r--r--ext/intl/dateformat/dateformat_create.cpp24
-rw-r--r--ext/intl/formatter/formatter_main.c15
-rw-r--r--ext/intl/intl_data.h33
-rw-r--r--ext/intl/msgformat/msgformat.c15
-rw-r--r--ext/intl/resourcebundle/resourcebundle_class.c18
-rw-r--r--ext/intl/spoofchecker/spoofchecker_create.c2
-rw-r--r--ext/intl/transliterator/transliterator_methods.c11
-rw-r--r--ext/mbstring/mbstring.c2
-rw-r--r--ext/odbc/php_odbc.c28
-rw-r--r--ext/odbc/php_odbc_includes.h6
-rw-r--r--ext/opcache/ZendAccelerator.h2
-rw-r--r--ext/openssl/openssl.c4
-rw-r--r--ext/openssl/tests/bug68912.phpt1
-rw-r--r--ext/openssl/xp_ssl.c7
-rw-r--r--ext/pcre/php_pcre.c8
-rw-r--r--ext/pdo/pdo_dbh.c2
-rw-r--r--ext/pdo/pdo_stmt.c7
-rw-r--r--ext/pdo_pgsql/pgsql_driver.c19
-rw-r--r--ext/pdo_pgsql/php_pdo_pgsql_int.h12
-rw-r--r--ext/pgsql/pgsql.c2
-rw-r--r--ext/phar/phar.c74
-rw-r--r--ext/phar/phar_internal.h11
-rw-r--r--ext/phar/tests/bug69324.pharbin0 -> 269 bytes
-rw-r--r--ext/phar/tests/bug69324.phpt17
-rw-r--r--ext/phar/tests/bug69441.pharbin0 -> 5780 bytes
-rw-r--r--ext/phar/tests/bug69441.phpt21
-rw-r--r--ext/reflection/php_reflection.c1
-rw-r--r--ext/skeleton/skeleton.c2
-rw-r--r--ext/soap/soap.c1
-rw-r--r--ext/spl/spl_array.c72
-rw-r--r--ext/spl/spl_dllist.c87
-rw-r--r--ext/spl/spl_fixedarray.c24
-rw-r--r--ext/spl/spl_heap.c97
-rw-r--r--ext/spl/spl_iterators.c33
-rw-r--r--ext/spl/spl_observer.c52
-rw-r--r--ext/spl/tests/arrayObject_exchangeArray_basic3.phpt4
-rw-r--r--ext/standard/http_fopen_wrapper.c27
-rw-r--r--ext/standard/link.c2
-rw-r--r--ext/standard/math.c3
-rw-r--r--ext/standard/streamsfuncs.c2
-rw-r--r--ext/standard/tests/file/readlink_variation1.phpt2
-rw-r--r--ext/standard/tests/http/bug69337.phpt41
-rw-r--r--ext/standard/tests/math/intdiv.phpt15
-rw-r--r--ext/standard/tests/serialize/bug69152.phpt16
-rw-r--r--ext/standard/tests/serialize/unserialize_mem_leak.phpt2
-rw-r--r--ext/standard/var.c10
-rw-r--r--ext/tokenizer/tokenizer_data.c2
-rw-r--r--ext/xmlwriter/php_xmlwriter.c4
-rw-r--r--ext/zip/php_zip.h2
-rw-r--r--ext/zlib/tests/gzopen_variation1.phpt28
-rw-r--r--ext/zlib/tests/readgzfile_variation1.phpt10
-rw-r--r--ext/zlib/tests/readgzfile_variation6.phpt4
-rw-r--r--ext/zlib/zlib.c4
-rw-r--r--sapi/apache2handler/sapi_apache2.c1
-rw-r--r--sapi/fpm/fpm/events/epoll.c4
-rw-r--r--win32/build/config.w322
142 files changed, 6369 insertions, 3595 deletions
diff --git a/NEWS b/NEWS
index 175ec09dae..3b2307af6c 100644
--- a/NEWS
+++ b/NEWS
@@ -78,6 +78,7 @@
. Implemented the RFC `Continue Output Buffering`. (Mike)
. Implemented the RFC `Constructor behaviour of internal classes`. (Dan, Dmitry)
. Implemented the RFC `Fix "foreach" behavior`. (Dmitry)
+ . Implemented the RFC `Generator Delegation`. (Bob)
- Curl:
. Fixed bug #68937 (Segfault in curl_multi_exec). (Laruence)
diff --git a/README.RELEASE_PROCESS b/README.RELEASE_PROCESS
index f0a8aca688..84e22a35a9 100644
--- a/README.RELEASE_PROCESS
+++ b/README.RELEASE_PROCESS
@@ -213,12 +213,14 @@ Getting the stable release announced
c. ``$PHP_X_MD5`` array and update all the md5 sums
- d. set ``$PHP_X_RC`` to false!
+ d. ``$PHP_X_SHA256`` array and update all the SHA256 sums
- e. Make sure there are no outdated "notes" or edited "date" keys in the
+ e. set ``$PHP_X_RC`` to false!
+
+ f. Make sure there are no outdated "notes" or edited "date" keys in the
``$RELEASES[X][$PHP_X_VERSION]["source"]`` array
- f. if the windows builds aren't ready yet prefix the "windows" key with a dot (".windows")
+ g. if the windows builds aren't ready yet prefix the "windows" key with a dot (".windows")
3. Create the release file (releases/x_y_z.php)
Usually we use the same content as for point 6, but included in php template
@@ -267,6 +269,9 @@ to upgrade.
9. Wait an hour or two, then send a mail to php-announce@lists.php.net,
php-general@lists.php.net and internals@lists.php.net with a text similar to
http://news.php.net/php.internals/17222.
+Please make sure that the mail to php-announce@ is its own completely seperate email.
+This is to make sure that repiles to the announcement on php-general@ or internals@
+will not accidentally hit the php-announce@ mailinglist.
Re-releasing the same version (or -pl)
--------------------------------------
@@ -283,7 +288,9 @@ Re-releasing the same version (or -pl)
d. ``$PHP_X_MD5`` array and update all the md5 sums
- e. Make sure there are no outdated "notes" or edited "date" keys in the
+ e. ``$PHP_X_SHA256`` array and update all the SHA256 sums
+
+ f. Make sure there are no outdated "notes" or edited "date" keys in the
``$RELEASES[X][$PHP_X_VERSION]["source"]`` array
3. Add a short notice to phpweb stating that there is a new release, and
@@ -300,3 +307,6 @@ to upgrade.
5. Wait an hour or two, then send a mail to php-announce@lists.php.net,
php-general@lists.php.net and internals@lists.php.net with a text similar to
the news entry.
+Please make sure that the mail to php-announce@ is its own completely seperate email.
+This is to make sure that repiles to the announcement on php-general@ or internals@
+will not accidentally hit the php-announce@ mailinglist.
diff --git a/UPGRADING b/UPGRADING
index a34fe9fa02..1722b72a37 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -375,6 +375,28 @@ Other language changes
Note that this only applies to calls from an incompatible context. If class B
extended from A the call would be allowed without any notices.
+* It is no longer possible to use the following class, interface and trait names
+ (case-insensitive):
+
+ bool
+ int
+ float
+ string
+ null
+ false
+ true
+
+ This applies to class/interface/trait declarations, class_alias() and use
+ statements.
+
+ Furthermore the following class, interface and trait names are now reserved
+ for future use, but do not yet throw an error when used:
+
+ resource
+ object
+ mixed
+ numeric
+
* The yield language construct no longer requires parentheses when used in an
expression context. It is now a right-associative operator with precedence
between the "print" and "=>" operators. This can result in different behavior
@@ -499,6 +521,8 @@ Other
. define() now supports arrays as constant values, fixing an oversight where define() did not support arrays yet const syntax did.
. Added the comparison operator (<=>), aka the spaceship operator.
(RFC: https://wiki.php.net/rfc/combined-comparison-operator)
+ . Added the yield from operator for delegating Generators like coroutines.
+ (RFC: https://wiki.php.net/rfc/generator-delegation)
- OpenSSL
. Added "alpn_protocols" SSL context option allowing encrypted client/server
diff --git a/Zend/Makefile.am b/Zend/Makefile.am
index fedbffe4ce..5f7f25df67 100644
--- a/Zend/Makefile.am
+++ b/Zend/Makefile.am
@@ -18,7 +18,7 @@ libZend_la_SOURCES=\
zend_default_classes.c \
zend_iterators.c zend_interfaces.c zend_exceptions.c \
zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \
- zend_generators.c zend_virtual_cwd.c zend_ast.c
+ zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c
libZend_la_CFLAGS = -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
libZend_la_LDFLAGS =
diff --git a/Zend/tests/assert/expect_015.phpt b/Zend/tests/assert/expect_015.phpt
index c2ce1f73fe..80f1bd8aa8 100644
--- a/Zend/tests/assert/expect_015.phpt
+++ b/Zend/tests/assert/expect_015.phpt
@@ -17,6 +17,7 @@ assert(0 && ($a = function () {
@foo();
$y = clone $x;
yield 1 => 2;
+ yield from $x;
}));
assert(0 && ($a = function &(array &$a, X $b = null) use ($c,&$d) : X {
@@ -163,6 +164,7 @@ Warning: assert(): assert(0 && ($a = function () {
@foo();
$y = clone $x;
yield 1 => 2;
+ yield from $x;
})) failed in %sexpect_015.php on line %d
Warning: assert(): assert(0 && ($a = function &(array &$a, X $b = null) use($c, &$d): X {
diff --git a/Zend/tests/bug63336.phpt b/Zend/tests/bug63336.phpt
index cf54a99216..b47a770a4d 100644
--- a/Zend/tests/bug63336.phpt
+++ b/Zend/tests/bug63336.phpt
@@ -1,10 +1,8 @@
--TEST--
Bug #63336 (invalid E_NOTICE error occur)
---XFAIL--
-Bug is not fixed yet
--FILE--
<?php
-error_reporting(E_ALL | E_NOTICE );
+error_reporting(E_ALL & ~E_WARNING );
define("TEST", "123");
class Base {
const DUMMY = "XXX";
@@ -18,7 +16,7 @@ class Child extends Base {
public function bar($var, $more=self::DUMMY) { return true; }
}
?>
---EXPECT--
-Warning: Declaration of Child::foo() should be compatible with Base::foo($var = '123', $more = NULL) in %sbug63336.php on line %d
+--EXPECTF--
+Warning: Declaration of Child::foo() should be compatible with Base::foo($var = TEST, $more = NULL) in %sbug63336.php on line %d
-Warning: Declaration of Child::bar() should be compatible with Base::bar($var, $more = 'XXX') in %sbug63336.php on line %d
+Warning: Declaration of Child::bar() should be compatible with Base::bar($more = self::DUMMY) in %sbug63336.php on line %d
diff --git a/Zend/tests/bug64896.phpt b/Zend/tests/bug64896.phpt
index f01969782f..3ff4a2167d 100644
--- a/Zend/tests/bug64896.phpt
+++ b/Zend/tests/bug64896.phpt
@@ -30,6 +30,7 @@ gc_disable();
unserialize(serialize($foo));
gc_collect_cycles();
var_dump($bar);
+gc_enable();
/* will output:
object(bad)#4 (1) {
["_private":"bad":private]=>
diff --git a/Zend/tests/bug69446.phpt b/Zend/tests/bug69446.phpt
new file mode 100644
index 0000000000..b448a2be7d
--- /dev/null
+++ b/Zend/tests/bug69446.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #69446 (GC leak relating to removal of nested data after dtors run)
+--FILE--
+<?php
+$bar = NULL;
+class bad {
+ public function __destruct() {
+ global $bar;
+ $bar = $this;
+ $bar->y = new stdClass;
+ }
+}
+
+$foo = new stdClass;
+$foo->foo = $foo;
+$foo->bad = new bad;
+$foo->bad->x = new stdClass;
+
+unset($foo);
+gc_collect_cycles();
+var_dump($bar);
+--EXPECT--
+object(bad)#2 (2) {
+ ["x"]=>
+ object(stdClass)#3 (0) {
+ }
+ ["y"]=>
+ object(stdClass)#4 (0) {
+ }
+}
diff --git a/Zend/tests/bug69446_2.phpt b/Zend/tests/bug69446_2.phpt
new file mode 100644
index 0000000000..520bd1fe30
--- /dev/null
+++ b/Zend/tests/bug69446_2.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #69446 (GC leak relating to removal of nested data after dtors run)
+--FILE--
+<?php
+$bar = NULL;
+class bad
+{
+ public $_private = array();
+
+ public function __construct()
+ {
+ $this->_private[] = 'php';
+ }
+
+ public function __destruct()
+ {
+ global $bar;
+ $bar = $this;
+ }
+}
+
+$foo = new stdclass;
+$foo->foo = $foo;
+$foo->bad = new bad;
+
+unserialize(serialize($foo));
+//unset($foo);
+
+gc_collect_cycles();
+var_dump($bar);
+--EXPECT--
+object(bad)#4 (1) {
+ ["_private"]=>
+ array(1) {
+ [0]=>
+ string(3) "php"
+ }
+}
diff --git a/Zend/tests/gc_033.phpt b/Zend/tests/gc_033.phpt
index dee426a385..bcd1541254 100644
--- a/Zend/tests/gc_033.phpt
+++ b/Zend/tests/gc_033.phpt
@@ -1,7 +1,5 @@
--TEST--
GC 033: Crash in GC while run with phpspec
---XFAIL--
-Full GC root buffer not handled correctly yet
--FILE--
<?php
$a = new stdClass();
diff --git a/Zend/tests/gc_035.phpt b/Zend/tests/gc_035.phpt
new file mode 100644
index 0000000000..985264c770
--- /dev/null
+++ b/Zend/tests/gc_035.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GC 035: Lost inner-cycles garbage
+--FILE--
+<?php
+class A {
+ public $a;
+ public $x;
+ function __destruct() {
+ unset($this->x);
+ }
+}
+$a = new A;
+$a->a = $a;
+$a->x = [];
+$a->x[] =& $a->x;
+$a->x[] = $a;
+var_dump(gc_collect_cycles());
+unset($a);
+var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
+--EXPECT--
+int(0)
+int(2)
+int(0)
diff --git a/Zend/tests/generators/basic_yield_from_exception_handling.phpt b/Zend/tests/generators/basic_yield_from_exception_handling.phpt
new file mode 100644
index 0000000000..180cbee9dd
--- /dev/null
+++ b/Zend/tests/generators/basic_yield_from_exception_handling.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Exceptions in linear yield from setup
+--FILE--
+<?php
+function from($off) {
+ try {
+ yield $off + 1;
+ } catch (Exception $e) { print "catch in from()\n$e\n"; }
+ yield $off + 2;
+}
+
+function gen() {
+ try {
+ yield "gen" => 0;
+ } catch (Exception $e) { print "catch in gen()\n$e\n"; }
+ try {
+ yield from from(0);
+ } catch (Exception $e) { print "catch in gen()\n$e\n"; }
+ yield from from(2);
+}
+
+$i = 0;
+try {
+ for ($gen = gen(); $gen->valid(); $gen->throw(new Exception((string) $i++))) {
+ var_dump($gen->current());
+ }
+} catch (Exception $e) { print "catch in {main}\n$e\n"; }
+
+var_dump($gen->valid());
+
+?>
+--EXPECTF--
+int(0)
+catch in gen()
+exception 'Exception' with message '0' in %s:%d
+Stack trace:
+#0 {main}
+int(1)
+catch in from()
+exception 'Exception' with message '1' in %s:%d
+Stack trace:
+#0 {main}
+int(2)
+catch in gen()
+exception 'Exception' with message '2' in %s:%d
+Stack trace:
+#0 {main}
+int(3)
+catch in from()
+exception 'Exception' with message '3' in %s:%d
+Stack trace:
+#0 {main}
+int(4)
+catch in {main}
+exception 'Exception' with message '4' in %s:%d
+Stack trace:
+#0 {main}
+bool(false)
+
diff --git a/Zend/tests/generators/basic_yield_from_proxying.phpt b/Zend/tests/generators/basic_yield_from_proxying.phpt
new file mode 100644
index 0000000000..74ffc5da80
--- /dev/null
+++ b/Zend/tests/generators/basic_yield_from_proxying.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Basic test if yield from works
+--FILE--
+<?php
+function from() {
+ yield "from" => 1;
+ yield 2;
+}
+
+function gen() {
+ yield "gen" => 0;
+ yield from from();
+ yield 3;
+}
+
+/* foreach API */
+foreach (gen() as $k => $v) {
+ var_dump($k, $v);
+}
+
+/* iterator API */
+for ($gen = gen(); $gen->valid(); $gen->next()) {
+ var_dump($gen->key(), $gen->current());
+}
+?>
+--EXPECT--
+string(3) "gen"
+int(0)
+string(4) "from"
+int(1)
+int(0)
+int(2)
+int(0)
+int(3)
+string(3) "gen"
+int(0)
+string(4) "from"
+int(1)
+int(0)
+int(2)
+int(0)
+int(3)
diff --git a/Zend/tests/generators/bug69419.phpt b/Zend/tests/generators/bug69419.phpt
new file mode 100644
index 0000000000..dce08edb7e
--- /dev/null
+++ b/Zend/tests/generators/bug69419.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #69419: Returning compatible sub generator produces a warning
+--FILE--
+<?php
+
+function & genRefInner() {
+ $var = 1;
+ yield $var;
+}
+
+function & genRefOuter() {
+ return genRefInner();
+}
+
+foreach(genRefOuter() as $i) {
+ var_dump($i);
+}
+
+?>
+--EXPECTF--
+Notice: Only variable references should be returned by reference in %s on line %d
+int(1)
diff --git a/Zend/tests/generators/multiple_yield_from_on_same_generator.phpt b/Zend/tests/generators/multiple_yield_from_on_same_generator.phpt
new file mode 100644
index 0000000000..198377f8a1
--- /dev/null
+++ b/Zend/tests/generators/multiple_yield_from_on_same_generator.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Multiple yield from on a same Generator instance
+--FILE--
+<?php
+
+function gen($a = 0) {
+ yield 1 + $a;
+ if ($a < 1) {
+ var_dump(yield from gen($a + 1));
+ }
+ yield 3 + $a;
+ return 5 + $a;
+}
+
+function bar($gen) {
+ var_dump(yield from $gen);
+}
+
+/* Twice a Generator from bar() using yield from on $gen */
+$gen = gen();
+$gens[] = bar($gen);
+$gens[] = bar($gen);
+
+do {
+ foreach ($gens as $g) {
+ var_dump($g->current());
+ $g->next();
+ }
+} while($gens[0]->valid());
+var_dump($gens[1]->valid());
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(4)
+int(6)
+int(3)
+int(5)
+bool(false)
+
diff --git a/Zend/tests/generators/mutli_yield_from_with_exception.phpt b/Zend/tests/generators/mutli_yield_from_with_exception.phpt
new file mode 100644
index 0000000000..5180caa328
--- /dev/null
+++ b/Zend/tests/generators/mutli_yield_from_with_exception.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Multiple yield from on a same Generator throwing an Exception
+--FILE--
+<?php
+function from() {
+ yield 1;
+ throw new Exception();
+}
+
+function gen($gen) {
+ try {
+ var_dump(yield from $gen);
+ } catch (Exception $e) { print "Caught exception!\n$e\n"; }
+}
+
+$gen = from();
+$gens[] = gen($gen);
+$gens[] = gen($gen);
+
+foreach ($gens as $g) {
+ $g->current(); // init.
+}
+
+do {
+ foreach ($gens as $i => $g) {
+ print "Generator $i\n";
+ var_dump($g->current());
+ $g->next();
+ }
+} while($gens[0]->valid());
+?>
+--EXPECTF--
+Generator 0
+int(1)
+Caught exception!
+exception 'Exception' in %s:%d
+Stack trace:
+#0 %s(%d): from()
+#1 [internal function]: gen(Object(Generator))
+#2 %s(%d): Generator->next()
+#3 {main}
+Generator 1
+
+Fatal error: Uncaught exception 'ClosedGeneratorException' with message 'Generator yielded from aborted, no return value available' in %s:%d
+Stack trace:
+#0 [internal function]: gen(Object(Generator))
+#1 %s(%d): Generator->current()
+#2 {main}
+ thrown in %s on line %d
+
diff --git a/Zend/tests/generators/recursive_yield_from.phpt b/Zend/tests/generators/recursive_yield_from.phpt
new file mode 100644
index 0000000000..dbf2c948ea
--- /dev/null
+++ b/Zend/tests/generators/recursive_yield_from.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Check if recursion with yield from works
+--FILE--
+<?php
+
+function from($a = 0) {
+ yield 1 + $a;
+ if ($a <= 3) {
+ yield from from($a + 3);
+ yield from from($a + 6);
+ }
+ yield 2 + $a;
+}
+
+function gen() {
+ yield from from();
+}
+
+foreach(gen() as $v) {
+ var_dump($v);
+}
+?>
+--EXPECT--
+int(1)
+int(4)
+int(7)
+int(8)
+int(10)
+int(11)
+int(5)
+int(7)
+int(8)
+int(2)
+
diff --git a/Zend/tests/generators/yield_from_already_running.phpt b/Zend/tests/generators/yield_from_already_running.phpt
new file mode 100644
index 0000000000..789490ccd3
--- /dev/null
+++ b/Zend/tests/generators/yield_from_already_running.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Yielding from the already running Generator should fail (bug #69458)
+--FILE--
+<?php
+
+function gen() {
+ yield from yield;
+}
+
+($gen = gen())->send($gen);
+
+?>
+--EXPECTF--
+Fatal error: Impossible to yield from the Generator being currently run in %s on line %d
diff --git a/Zend/tests/generators/yield_from_array.phpt b/Zend/tests/generators/yield_from_array.phpt
new file mode 100644
index 0000000000..1652ab2236
--- /dev/null
+++ b/Zend/tests/generators/yield_from_array.phpt
@@ -0,0 +1,22 @@
+--TEST--
+yielding values from an array
+--FILE--
+<?php
+function from() {
+ yield 0;
+ yield from []; // must not yield anything
+ yield from [1,2];
+}
+
+function gen() {
+ yield from from();
+}
+
+foreach(gen() as $v) {
+ var_dump($v);
+}
+?>
+--EXPECT--
+int(0)
+int(1)
+int(2)
diff --git a/Zend/tests/generators/yield_from_backtrace.phpt b/Zend/tests/generators/yield_from_backtrace.phpt
new file mode 100644
index 0000000000..18781e7551
--- /dev/null
+++ b/Zend/tests/generators/yield_from_backtrace.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Exceptions in linear yield from setup
+--FILE--
+<?php
+function from($off) {
+ debug_print_backtrace();
+ yield $off + 1;
+}
+
+function gen() {
+ yield 1;
+ debug_print_backtrace();
+ yield 2;
+ yield from from(2);
+ debug_print_backtrace();
+}
+
+print "\nImplicit foreach:\n";
+foreach (gen() as $v) {
+ var_dump($v);
+}
+
+print "\nExplicit iterator:\n";
+for ($gen = gen(); $gen->valid(); $gen->next()) {
+ var_dump($gen->current());
+}
+?>
+--EXPECTF--
+Implicit foreach:
+int(1)
+#0 gen() called at [%s:%d]
+int(2)
+#0 from(2) called at [%s:%d]
+#1 gen() called at [%s:%d]
+int(3)
+#0 gen() called at [%s:%d]
+
+Explicit iterator:
+int(1)
+#0 gen()
+#1 Generator->next() called at [%s:%d]
+int(2)
+#0 from(2) called at [%s:%d]
+#1 gen()
+#2 Generator->next() called at [%s:%d]
+int(3)
+#0 gen()
+#1 Generator->next() called at [%s:%d]
+
diff --git a/Zend/tests/generators/yield_from_deep_recursion.phpt b/Zend/tests/generators/yield_from_deep_recursion.phpt
new file mode 100644
index 0000000000..8ef3b89129
--- /dev/null
+++ b/Zend/tests/generators/yield_from_deep_recursion.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Deep recursion with yield from
+--FILE--
+<?php
+ini_set("memory_limit", "512M");
+
+function from($i) {
+ yield $i;
+}
+
+function gen($i = 0) {
+ if ($i < 50000) {
+ yield from gen(++$i);
+ } else {
+ yield $i;
+ yield from from(++$i);
+ }
+}
+
+foreach (gen() as $v) {
+ var_dump($v);
+}
+?>
+--EXPECT--
+int(50000)
+int(50001)
diff --git a/Zend/tests/generators/yield_from_multi_tree.phpt b/Zend/tests/generators/yield_from_multi_tree.phpt
new file mode 100644
index 0000000000..91ae80e909
--- /dev/null
+++ b/Zend/tests/generators/yield_from_multi_tree.phpt
@@ -0,0 +1,332 @@
+--TEST--
+yield from on multiple trees needing merge
+--FILE--
+<?php
+
+function from($levels) {
+ foreach (range(0, 2 << $levels) as $v) {
+ yield $v;
+ }
+}
+
+function gen($gen, $level) {
+ if ($level % 2) {
+ yield $gen->current();
+ }
+ yield from $gen;
+}
+
+foreach (range(0, 6) as $levels) {
+ print "$levels level".($levels == 1 ? "" : "s")."\n\n";
+
+ $all = array();
+ $all[] = $gens[0][0] = from($levels);
+
+ for ($level = 1; $level < $levels; $level++) {
+ for ($i = 0; $i < (1 << $level); $i++) {
+ $all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
+ }
+ }
+
+ while (1) {
+ foreach ($all as $gen) {
+ var_dump($gen->current());
+ $gen->next();
+ if (!$gen->valid()) {
+ break 2;
+ }
+ }
+ }
+
+ print "\n\n";
+}
+?>
+--EXPECT--
+0 levels
+
+int(0)
+int(1)
+int(2)
+
+
+1 level
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+
+
+2 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+
+
+3 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+int(9)
+int(10)
+int(11)
+int(12)
+int(13)
+int(14)
+int(15)
+int(16)
+
+
+4 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+int(9)
+int(10)
+int(11)
+int(12)
+int(13)
+int(14)
+int(15)
+int(16)
+int(17)
+int(18)
+int(19)
+int(20)
+int(21)
+int(22)
+int(23)
+int(24)
+int(25)
+int(26)
+int(27)
+int(28)
+int(29)
+int(30)
+int(31)
+int(32)
+
+
+5 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+int(9)
+int(10)
+int(11)
+int(12)
+int(13)
+int(14)
+int(15)
+int(16)
+int(17)
+int(18)
+int(19)
+int(20)
+int(21)
+int(22)
+int(23)
+int(24)
+int(25)
+int(26)
+int(27)
+int(28)
+int(29)
+int(30)
+int(31)
+int(32)
+int(33)
+int(34)
+int(35)
+int(36)
+int(37)
+int(38)
+int(39)
+int(40)
+int(41)
+int(42)
+int(43)
+int(44)
+int(45)
+int(46)
+int(47)
+int(48)
+int(49)
+int(50)
+int(51)
+int(52)
+int(53)
+int(54)
+int(55)
+int(56)
+int(57)
+int(58)
+int(59)
+int(60)
+int(61)
+int(62)
+int(63)
+int(64)
+
+
+6 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+int(9)
+int(10)
+int(11)
+int(12)
+int(13)
+int(14)
+int(15)
+int(16)
+int(17)
+int(18)
+int(19)
+int(20)
+int(21)
+int(22)
+int(23)
+int(24)
+int(25)
+int(26)
+int(27)
+int(28)
+int(29)
+int(30)
+int(31)
+int(32)
+int(33)
+int(34)
+int(35)
+int(36)
+int(37)
+int(38)
+int(39)
+int(40)
+int(41)
+int(42)
+int(43)
+int(44)
+int(45)
+int(46)
+int(47)
+int(48)
+int(49)
+int(50)
+int(51)
+int(52)
+int(53)
+int(54)
+int(55)
+int(56)
+int(57)
+int(58)
+int(59)
+int(60)
+int(61)
+int(62)
+int(63)
+int(64)
+int(65)
+int(66)
+int(67)
+int(68)
+int(69)
+int(70)
+int(71)
+int(72)
+int(73)
+int(74)
+int(75)
+int(76)
+int(77)
+int(78)
+int(79)
+int(80)
+int(81)
+int(82)
+int(83)
+int(84)
+int(85)
+int(86)
+int(87)
+int(88)
+int(89)
+int(90)
+int(91)
+int(92)
+int(93)
+int(94)
+int(95)
+int(96)
+int(97)
+int(98)
+int(99)
+int(100)
+int(101)
+int(102)
+int(103)
+int(104)
+int(105)
+int(106)
+int(107)
+int(108)
+int(109)
+int(110)
+int(111)
+int(112)
+int(113)
+int(114)
+int(115)
+int(116)
+int(117)
+int(118)
+int(119)
+int(120)
+int(121)
+int(122)
+int(123)
+int(124)
+int(125)
+int(126)
+int(127)
+int(128)
+
diff --git a/Zend/tests/generators/yield_from_multi_tree_exception.phpt b/Zend/tests/generators/yield_from_multi_tree_exception.phpt
new file mode 100644
index 0000000000..b250a744df
--- /dev/null
+++ b/Zend/tests/generators/yield_from_multi_tree_exception.phpt
@@ -0,0 +1,78 @@
+--TEST--
+yield from on multiple trees needing merge
+--FILE--
+<?php
+
+function from($levels) {
+ foreach (range(0, 2 << $levels) as $v) {
+ yield $v;
+ if ($v == (1 << ($levels - 1)) - 2) {
+ throw new Exception();
+ }
+ }
+}
+
+function gen($gen, $level) {
+ yield from $gen;
+}
+
+$levels = 5;
+
+print "$levels levels\n\n";
+
+$all = array();
+$all[] = $gens[0][0] = from($levels);
+
+for ($level = 1; $level < $levels; $level++) {
+ for ($i = 0; $i < (1 << $level); $i++) {
+ $all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
+ }
+}
+
+for ($i = 0; $i < 2; $i++) {
+ try {
+ foreach ($all as $gen) {
+ var_dump($gen->current());
+ $gen->next();
+ if (!$gen->valid()) {
+ break;
+ }
+ }
+ } catch(Exception $e) {
+ print "$e\n";
+ unset($all[array_search($gen, $all)]);
+ }
+}
+?>
+--EXPECTF--
+5 levels
+
+int(0)
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(7)
+int(8)
+int(9)
+int(10)
+int(11)
+int(12)
+int(13)
+int(14)
+exception 'Exception' in %s:%d
+Stack trace:
+#0 %s(%d): from(5)
+#1 %s(%d): gen(Object(Generator), 1)
+#2 %s(%d): gen(Object(Generator), 2)
+#3 [internal function]: gen(Object(Generator), 3)
+#4 %s(%d): Generator->next()
+#5 {main}
+exception 'ClosedGeneratorException' with message 'Generator yielded from aborted, no return value available' in %s:%d
+Stack trace:
+#0 [internal function]: gen(Object(Generator), 1)
+#1 %s(%d): Generator->current()
+#2 {main}
+
diff --git a/Zend/tests/recursive_debug_info.phpt b/Zend/tests/recursive_debug_info.phpt
new file mode 100644
index 0000000000..6667650d0a
--- /dev/null
+++ b/Zend/tests/recursive_debug_info.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Test recursive __debugInfo() method
+--FILE--
+<?php
+
+class Test {
+ public function __debugInfo() {
+ return [$this];
+ }
+}
+
+var_dump(new Test);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ [0]=>
+ *RECURSION*
+}
diff --git a/Zend/zend.c b/Zend/zend.c
index 77e0b624c0..cf87b2620c 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -296,17 +296,18 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
zend_printf("%s Object (", class_name->val);
zend_string_release(class_name);
+ if (Z_OBJ_APPLY_COUNT_P(expr) > 0) {
+ ZEND_PUTS(" *RECURSION*");
+ return;
+ }
+
if (Z_OBJ_HANDLER_P(expr, get_properties)) {
properties = Z_OBJPROP_P(expr);
}
if (properties) {
- if (++properties->u.v.nApplyCount>1) {
- ZEND_PUTS(" *RECURSION*");
- properties->u.v.nApplyCount--;
- return;
- }
+ Z_OBJ_INC_APPLY_COUNT_P(expr);
print_flat_hash(properties);
- properties->u.v.nApplyCount--;
+ Z_OBJ_DEC_APPLY_COUNT_P(expr);
}
ZEND_PUTS(")");
break;
@@ -351,16 +352,18 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int
zend_string_release(class_name);
ZEND_PUTS_EX(" Object\n");
- if ((properties = Z_OBJDEBUG_P(expr, is_temp)) == NULL) {
- break;
- }
- if (++properties->u.v.nApplyCount>1) {
+ if (Z_OBJ_APPLY_COUNT_P(expr) > 0) {
ZEND_PUTS_EX(" *RECURSION*");
- properties->u.v.nApplyCount--;
return;
}
+ if ((properties = Z_OBJDEBUG_P(expr, is_temp)) == NULL) {
+ break;
+ }
+
+ Z_OBJ_INC_APPLY_COUNT_P(expr);
print_hash(write_func, properties, indent, 1);
- properties->u.v.nApplyCount--;
+ Z_OBJ_DEC_APPLY_COUNT_P(expr);
+
if (is_temp) {
zend_hash_destroy(properties);
FREE_HASHTABLE(properties);
@@ -964,12 +967,6 @@ ZEND_API void zend_deactivate(void) /* {{{ */
shutdown_compiler();
} zend_end_try();
-#if ZEND_DEBUG
- if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
- gc_collect_cycles();
- }
-#endif
-
zend_destroy_rsrc_list(&EG(regular_list));
#if GC_BENCH
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 5e1a8185fd..e6c8e56d86 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3204,7 +3204,6 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint
fcc->calling_scope = NULL;
fcc->called_scope = NULL;
fcc->function_handler = NULL;
- fcc->calling_scope = NULL;
fcc->object = NULL;
if (object &&
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 6701ca4902..16fd42e80f 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -287,16 +287,6 @@ struct _zend_mm_bin {
char bytes[ZEND_MM_PAGE_SIZE * 8];
};
-#if ZEND_DEBUG
-typedef struct _zend_mm_debug_info {
- size_t size;
- const char *filename;
- const char *orig_filename;
- uint lineno;
- uint orig_lineno;
-} zend_mm_debug_info;
-#endif
-
struct _zend_mm_free_slot {
zend_mm_free_slot *next_free_slot;
};
diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h
index 6d89884f0d..0cb3a71d34 100644
--- a/Zend/zend_alloc.h
+++ b/Zend/zend_alloc.h
@@ -50,6 +50,20 @@ typedef struct _zend_leak_info {
uint orig_lineno;
} zend_leak_info;
+#if ZEND_DEBUG
+typedef struct _zend_mm_debug_info {
+ size_t size;
+ const char *filename;
+ const char *orig_filename;
+ uint lineno;
+ uint orig_lineno;
+} zend_mm_debug_info;
+
+# define ZEND_MM_OVERHEAD ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info))
+#else
+# define ZEND_MM_OVERHEAD 0
+#endif
+
BEGIN_EXTERN_C()
ZEND_API char* ZEND_FASTCALL zend_strndup(const char *s, size_t length) ZEND_ATTRIBUTE_MALLOC;
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index d538a2191f..4eaad31a74 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -522,6 +522,7 @@ ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
* 60 right print
* 70 right yield
* 80 right =>
+ * 85 right yield from
* 90 right = += -= *= /= .= %= &= |= ^= <<= >>= **=
* 100 left ? :
* 110 right ??
@@ -967,7 +968,10 @@ tail_call:
case ZEND_AST_ZVAL:
zend_ast_export_zval(str, zend_ast_get_zval(ast), priority, indent);
break;
-//??? case ZEND_AST_ZNODE:
+ case ZEND_AST_ZNODE:
+ /* This AST kind is only used for temporary nodes during compilation */
+ ZEND_ASSERT(0);
+ break;
/* declaration nodes */
case ZEND_AST_FUNC_DECL:
@@ -1350,6 +1354,8 @@ simple_list:
}
if (priority > 70) smart_str_appendc(str, ')');
break;
+ case ZEND_AST_YIELD_FROM:
+ PREFIX_OP("yield from ", 85, 86);
case ZEND_AST_COALESCE: BINARY_OP(" ?? ", 110, 111, 110);
case ZEND_AST_STATIC:
smart_str_appends(str, "static $");
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index 553578f848..33aa292fb7 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -84,6 +84,7 @@ enum _zend_ast_kind {
ZEND_AST_PRE_DEC,
ZEND_AST_POST_INC,
ZEND_AST_POST_DEC,
+ ZEND_AST_YIELD_FROM,
ZEND_AST_GLOBAL,
ZEND_AST_UNSET,
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index be6b11f6a8..996c11b24d 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -27,6 +27,7 @@
#include "zend_exceptions.h"
#include "zend_extensions.h"
#include "zend_closures.h"
+#include "zend_generators.h"
#undef ZEND_TEST_EXCEPTIONS
@@ -2269,6 +2270,8 @@ ZEND_FUNCTION(debug_print_backtrace)
call_type = NULL;
ZVAL_UNDEF(&arg_array);
+ ptr = zend_generator_check_placeholder_frame(ptr);
+
skip = ptr;
/* skip internal handler */
if ((!skip->func || !ZEND_USER_CODE(skip->func->common.type)) &&
@@ -2467,6 +2470,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
frameno++;
array_init(&stack_frame);
+ ptr = zend_generator_check_placeholder_frame(ptr);
+
skip = ptr;
/* skip internal handler */
if ((!skip->func || !ZEND_USER_CODE(skip->func->common.type)) &&
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 3f0f53da67..843254c6ef 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -38,7 +38,6 @@ typedef struct _zend_closure {
zend_object std;
zend_function func;
zval this_ptr;
- HashTable *debug_info;
} zend_closure;
/* non-static since it needs to be referenced */
@@ -269,11 +268,6 @@ static void zend_closure_free_storage(zend_object *object) /* {{{ */
destroy_op_array(&closure->func.op_array);
}
- if (closure->debug_info != NULL) {
- zend_hash_destroy(closure->debug_info);
- efree(closure->debug_info);
- }
-
if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
zval_ptr_dtor(&closure->this_ptr);
}
@@ -335,58 +329,56 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
zend_closure *closure = (zend_closure *)Z_OBJ_P(object);
zval val;
struct _zend_arg_info *arg_info = closure->func.common.arg_info;
+ HashTable *debug_info;
+
+ *is_temp = 1;
- *is_temp = 0;
+ ALLOC_HASHTABLE(debug_info);
+ zend_hash_init(debug_info, 8, NULL, ZVAL_PTR_DTOR, 0);
- if (closure->debug_info == NULL) {
- ALLOC_HASHTABLE(closure->debug_info);
- zend_hash_init(closure->debug_info, 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
+ HashTable *static_variables = closure->func.op_array.static_variables;
+ ZVAL_ARR(&val, zend_array_dup(static_variables));
+ zend_hash_str_update(debug_info, "static", sizeof("static")-1, &val);
}
- if (closure->debug_info->u.v.nApplyCount == 0) {
- if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
- HashTable *static_variables = closure->func.op_array.static_variables;
- ZVAL_ARR(&val, zend_array_dup(static_variables));
- zend_hash_str_update(closure->debug_info, "static", sizeof("static")-1, &val);
- }
- if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
- Z_ADDREF(closure->this_ptr);
- zend_hash_str_update(closure->debug_info, "this", sizeof("this")-1, &closure->this_ptr);
- }
+ if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
+ Z_ADDREF(closure->this_ptr);
+ zend_hash_str_update(debug_info, "this", sizeof("this")-1, &closure->this_ptr);
+ }
- if (arg_info &&
- (closure->func.common.num_args ||
- (closure->func.common.fn_flags & ZEND_ACC_VARIADIC))) {
- uint32_t i, num_args, required = closure->func.common.required_num_args;
+ if (arg_info &&
+ (closure->func.common.num_args ||
+ (closure->func.common.fn_flags & ZEND_ACC_VARIADIC))) {
+ uint32_t i, num_args, required = closure->func.common.required_num_args;
- array_init(&val);
+ array_init(&val);
- num_args = closure->func.common.num_args;
- if (closure->func.common.fn_flags & ZEND_ACC_VARIADIC) {
- num_args++;
- }
- for (i = 0; i < num_args; i++) {
- zend_string *name;
- zval info;
- if (arg_info->name) {
- name = zend_strpprintf(0, "%s$%s",
- arg_info->pass_by_reference ? "&" : "",
- arg_info->name->val);
- } else {
- name = zend_strpprintf(0, "%s$param%d",
- arg_info->pass_by_reference ? "&" : "",
- i + 1);
- }
- ZVAL_NEW_STR(&info, zend_strpprintf(0, "%s", i >= required ? "<optional>" : "<required>"));
- zend_hash_update(Z_ARRVAL(val), name, &info);
- zend_string_release(name);
- arg_info++;
+ num_args = closure->func.common.num_args;
+ if (closure->func.common.fn_flags & ZEND_ACC_VARIADIC) {
+ num_args++;
+ }
+ for (i = 0; i < num_args; i++) {
+ zend_string *name;
+ zval info;
+ if (arg_info->name) {
+ name = zend_strpprintf(0, "%s$%s",
+ arg_info->pass_by_reference ? "&" : "",
+ arg_info->name->val);
+ } else {
+ name = zend_strpprintf(0, "%s$param%d",
+ arg_info->pass_by_reference ? "&" : "",
+ i + 1);
}
- zend_hash_str_update(closure->debug_info, "parameter", sizeof("parameter")-1, &val);
+ ZVAL_NEW_STR(&info, zend_strpprintf(0, "%s", i >= required ? "<optional>" : "<required>"));
+ zend_hash_update(Z_ARRVAL(val), name, &info);
+ zend_string_release(name);
+ arg_info++;
}
+ zend_hash_str_update(debug_info, "parameter", sizeof("parameter")-1, &val);
}
- return closure->debug_info;
+ return debug_info;
}
/* }}} */
@@ -394,12 +386,6 @@ static HashTable *zend_closure_get_gc(zval *obj, zval **table, int *n) /* {{{ */
{
zend_closure *closure = (zend_closure *)Z_OBJ_P(obj);
- if (closure->debug_info != NULL) {
- zend_hash_destroy(closure->debug_info);
- efree(closure->debug_info);
- closure->debug_info = NULL;
- }
-
*table = Z_TYPE(closure->this_ptr) != IS_NULL ? &closure->this_ptr : NULL;
*n = Z_TYPE(closure->this_ptr) != IS_NULL ? 1 : 0;
return (closure->func.type == ZEND_USER_FUNCTION) ?
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index ac10a2ad74..ea9c900e3b 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -5861,16 +5861,8 @@ void zend_compile_exit(znode *result, zend_ast *ast) /* {{{ */
}
/* }}} */
-void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
+static void zend_mark_function_as_generator() /* {{{ */
{
- zend_ast *value_ast = ast->child[0];
- zend_ast *key_ast = ast->child[1];
-
- znode value_node, key_node;
- znode *value_node_ptr = NULL, *key_node_ptr = NULL;
- zend_op *opline;
- zend_bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
-
if (!CG(active_op_array)->function_name) {
zend_error_noreturn(E_COMPILE_ERROR,
"The \"yield\" expression can only be used inside a function");
@@ -5892,6 +5884,20 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
}
CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR;
+}
+/* }}} */
+
+void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
+{
+ zend_ast *value_ast = ast->child[0];
+ zend_ast *key_ast = ast->child[1];
+
+ znode value_node, key_node;
+ znode *value_node_ptr = NULL, *key_node_ptr = NULL;
+ zend_op *opline;
+ zend_bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+
+ zend_mark_function_as_generator();
if (key_ast) {
zend_compile_expr(&key_node, key_ast);
@@ -5915,6 +5921,18 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
}
/* }}} */
+void zend_compile_yield_from(znode *result, zend_ast *ast) /* {{{ */
+{
+ zend_ast *expr_ast = ast->child[0];
+ znode expr_node;
+
+ zend_mark_function_as_generator();
+
+ zend_compile_expr(&expr_node, expr_ast);
+ zend_emit_op_tmp(result, ZEND_YIELD_FROM, &expr_node, NULL);
+}
+/* }}} */
+
void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
{
zend_ast *obj_ast = ast->child[0];
@@ -6829,6 +6847,9 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
case ZEND_AST_YIELD:
zend_compile_yield(result, ast);
return;
+ case ZEND_AST_YIELD_FROM:
+ zend_compile_yield_from(result, ast);
+ return;
case ZEND_AST_INSTANCEOF:
zend_compile_instanceof(result, ast);
return;
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 57b234a12a..980a06c199 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -429,19 +429,27 @@ struct _zend_execute_data {
#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2) /* equal to IS_TYPE_REFCOUNTED */
#define ZEND_CALL_CTOR (1 << 3)
#define ZEND_CALL_CTOR_RESULT_UNUSED (1 << 4)
+#define ZEND_CALL_CLOSURE (1 << 5)
#define ZEND_CALL_INFO(call) \
(Z_TYPE_INFO((call)->This) >> 24)
+#define ZEND_CALL_KIND_EX(call_info) \
+ (call_info & (ZEND_CALL_CODE | ZEND_CALL_TOP))
+
#define ZEND_CALL_KIND(call) \
- (ZEND_CALL_INFO(call) & (ZEND_CALL_CODE | ZEND_CALL_TOP))
+ ZEND_CALL_KIND_EX(ZEND_CALL_INFO(call))
#define ZEND_SET_CALL_INFO(call, info) do { \
Z_TYPE_INFO((call)->This) = IS_OBJECT_EX | ((info) << 24); \
} while (0)
-#define ZEND_ADD_CALL_FLAG(call, info) do { \
- Z_TYPE_INFO((call)->This) |= ((info) << 24); \
+#define ZEND_ADD_CALL_FLAG_EX(call_info, flag) do { \
+ call_info |= ((flag) << 24); \
+ } while (0)
+
+#define ZEND_ADD_CALL_FLAG(call, flag) do { \
+ ZEND_ADD_CALL_FLAG_EX(Z_TYPE_INFO((call)->This), flag); \
} while (0)
#define ZEND_CALL_NUM_ARGS(call) \
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index 6eccc89723..79b2183e3b 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -557,6 +557,9 @@ ZEND_METHOD(exception, getTraceAsString)
DEFAULT_0_PARAMS;
trace = zend_read_property(base_exception_ce, getThis(), "trace", sizeof("trace")-1, 1, &rv);
+ if (Z_TYPE_P(trace) != IS_ARRAY) {
+ RETURN_FALSE;
+ }
ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(trace), index, frame) {
if (Z_TYPE_P(frame) != IS_ARRAY) {
zend_error(E_WARNING, "Expected array for frame %pu", index);
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 92c9d23d5b..18839ab3e8 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1030,7 +1030,7 @@ static zend_always_inline void zend_assign_to_object(zval *retval, zval *object,
if (Z_TYPE_P(property) != IS_UNDEF) {
fast_assign:
value = zend_assign_to_variable(property, value, value_type);
- if (retval && !EG(exception)) {
+ if (retval && EXPECTED(!EG(exception))) {
ZVAL_COPY(retval, value);
}
return;
@@ -1044,6 +1044,8 @@ fast_assign:
}
if (!zobj->ce->__set) {
+ zval *ref = NULL;
+
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
@@ -1055,17 +1057,24 @@ fast_assign:
value = &tmp;
}
} else if (value_type != IS_TMP_VAR) {
- ZVAL_DEREF(value);
- if (Z_REFCOUNTED_P(value)) {
+ if (Z_ISREF_P(value)) {
+ if (value_type == IS_CV) {
+ ref = value;
+ }
+ value = Z_REFVAL_P(value);
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (value_type == IS_CV && Z_REFCOUNTED_P(value)) {
Z_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property_name), value);
- if (retval && !EG(exception)) {
+ if (retval) {
ZVAL_COPY(retval, value);
}
- if (value_type == IS_VAR) {
- FREE_OP(free_value);
+ if (/*value_type == IS_VAR &&*/ ref) {
+ efree_size(ref, sizeof(zend_reference));
}
return;
}
@@ -1090,18 +1099,16 @@ fast_assign:
}
} else if (value_type != IS_TMP_VAR) {
ZVAL_DEREF(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
}
Z_OBJ_HT_P(object)->write_property(object, property_name, value, cache_slot);
- if (retval && !EG(exception)) {
+ if (retval && EXPECTED(!EG(exception))) {
ZVAL_COPY(retval, value);
}
- zval_ptr_dtor(value);
- if (value_type == IS_VAR) {
+ if (value_type == IS_CONST) {
+ zval_ptr_dtor_nogc(value);
+ } else {
FREE_OP(free_value);
}
}
@@ -1126,18 +1133,16 @@ static zend_never_inline void zend_assign_to_object_dim(zval *retval, zval *obje
zval_copy_ctor_func(&tmp);
value = &tmp;
}
- } else if (value_type != IS_TMP_VAR &&
- Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
}
Z_OBJ_HT_P(object)->write_dimension(object, property_name, value);
- if (retval && !EG(exception)) {
+ if (retval && EXPECTED(!EG(exception))) {
ZVAL_COPY(retval, value);
}
- zval_ptr_dtor(value);
- if (value_type == IS_VAR) {
+ if (value_type == IS_CONST) {
+ zval_ptr_dtor_nogc(value);
+ } else {
FREE_OP(free_value);
}
}
@@ -1151,11 +1156,11 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
(z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R, &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -1798,14 +1803,20 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{
static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
{
- if (EXPECTED(EX(func)->op_array.last_var > 0)) {
- zval *cv = EX_VAR_NUM(0);
- zval *end = cv + EX(func)->op_array.last_var;
- do {
- zval_ptr_dtor(cv);
- cv++;
- } while (cv != end);
- }
+ zval *cv = EX_VAR_NUM(0);
+ zval *end = cv + EX(func)->op_array.last_var;
+ while (EXPECTED(cv != end)) {
+ if (Z_REFCOUNTED_P(cv)) {
+ if (!Z_DELREF_P(cv)) {
+ zend_refcounted *r = Z_COUNTED_P(cv);
+ ZVAL_NULL(cv);
+ zval_dtor_func_for_ptr(r);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(cv);
+ }
+ }
+ cv++;
+ }
}
/* }}} */
@@ -2052,12 +2063,12 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
EG(vm_stack_end) = EG(vm_stack)->end;
execute_data = zend_vm_stack_push_call_frame(
- ZEND_CALL_TOP_FUNCTION,
+ ZEND_CALL_TOP_FUNCTION | (ZEND_CALL_INFO(call) & ZEND_CALL_CLOSURE),
(zend_function*)op_array,
num_args,
call->called_scope,
- Z_OBJ(call->This),
- NULL);
+ Z_OBJ(call->This));
+ EX(prev_execute_data) = NULL;
EX_NUM_ARGS() = num_args;
/* copy arguments */
@@ -2137,6 +2148,16 @@ static zend_always_inline void zend_vm_stack_extend_call_frame(zend_execute_data
}
/* }}} */
+static zend_always_inline zend_generator *zend_get_running_generator(zend_execute_data *execute_data) /* {{{ */
+{
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
+ /* However control may currently be delegated to another generator.
+ * That's the one we're interested in. */
+ return generator;
+}
+/* }}} */
+
#ifdef HAVE_GCC_GLOBAL_REGS
# if defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(i386)
# define ZEND_VM_FP_GLOBAL_REG "%esi"
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 408a7c5032..67958cf32c 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -162,7 +162,7 @@ static zend_always_inline zval* zend_vm_stack_alloc(size_t size)
return (zval*)top;
}
-static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev)
+static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
{
zend_execute_data *call = (zend_execute_data*)zend_vm_stack_alloc(used_stack);
@@ -171,7 +171,6 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui
ZEND_SET_CALL_INFO(call, call_info);
ZEND_CALL_NUM_ARGS(call) = num_args;
call->called_scope = called_scope;
- call->prev_execute_data = prev;
return call;
}
@@ -185,26 +184,39 @@ static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, ze
return used_stack * sizeof(zval);
}
-static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev)
+static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
{
uint32_t used_stack = zend_vm_calc_used_stack(num_args, func);
return zend_vm_stack_push_call_frame_ex(used_stack, call_info,
- func, num_args, called_scope, object, prev);
+ func, num_args, called_scope, object);
}
-static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data *call)
+static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_info, zend_execute_data *call)
{
- if (ZEND_CALL_INFO(call) & ZEND_CALL_FREE_EXTRA_ARGS) {
+ if (UNEXPECTED(call_info & ZEND_CALL_FREE_EXTRA_ARGS)) {
zval *end = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T);
zval *p = end + (ZEND_CALL_NUM_ARGS(call) - call->func->op_array.num_args);
do {
p--;
- zval_ptr_dtor_nogc(p);
+ if (Z_REFCOUNTED_P(p)) {
+ if (!Z_DELREF_P(p)) {
+ zend_refcounted *r = Z_COUNTED_P(p);
+ ZVAL_NULL(p);
+ zval_dtor_func_for_ptr(r);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(p);
+ }
+ }
} while (p != end);
}
}
+static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data *call)
+{
+ zend_vm_stack_free_extra_args_ex(ZEND_CALL_INFO(call), call);
+}
+
static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call)
{
uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
@@ -215,7 +227,13 @@ static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call)
do {
p--;
- zval_ptr_dtor_nogc(p);
+ if (Z_REFCOUNTED_P(p)) {
+ if (!Z_DELREF_P(p)) {
+ zend_refcounted *r = Z_COUNTED_P(p);
+ ZVAL_NULL(p);
+ zval_dtor_func_for_ptr(r);
+ }
+ }
} while (p != end);
}
}
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index f79169232d..37a27150e5 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -331,6 +331,12 @@ void shutdown_executor(void) /* {{{ */
zend_close_rsrc_list(&EG(regular_list));
} zend_end_try();
+#if ZEND_DEBUG
+ if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
+ gc_collect_cycles();
+ }
+#endif
+
zend_try {
zend_objects_store_free_object_storage(&EG(objects_store));
@@ -747,7 +753,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
func = fci_cache->function_handler;
call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION,
- func, fci->param_count, fci_cache->called_scope, fci_cache->object, NULL);
+ func, fci->param_count, fci_cache->called_scope, fci_cache->object);
calling_scope = fci_cache->calling_scope;
fci->object = fci_cache->object;
if (fci->object &&
@@ -833,6 +839,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
if (UNEXPECTED(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
ZEND_ASSERT(GC_TYPE(func->op_array.prototype) == IS_OBJECT);
GC_REFCOUNT(func->op_array.prototype)++;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_CLOSURE);
}
if (EXPECTED((func->op_array.fn_flags & ZEND_ACC_GENERATOR) == 0)) {
zend_init_execute_data(call, &func->op_array, fci->retval);
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index b5c0911cde..30d75c2305 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -25,10 +25,26 @@
/* one (0) is reserved */
#define GC_ROOT_BUFFER_MAX_ENTRIES 10001
+#define GC_FAKE_BUFFER_FLAG 0x80
+#define GC_TYPE_MASK 0x7f
+
+#define GC_HAS_DESTRUCTORS (1<<0)
+
#ifndef ZEND_GC_DEBUG
# define ZEND_GC_DEBUG 0
#endif
+#define GC_NUM_ADDITIONAL_ENTRIES \
+ ((4096 - ZEND_MM_OVERHEAD - sizeof(void*) * 2) / sizeof(gc_root_buffer))
+
+typedef struct _gc_addtional_bufer gc_additional_buffer;
+
+struct _gc_addtional_bufer {
+ uint32_t used;
+ gc_additional_buffer *next;
+ gc_root_buffer buf[GC_NUM_ADDITIONAL_ENTRIES];
+};
+
#ifdef ZTS
ZEND_API int gc_globals_id;
#else
@@ -201,69 +217,73 @@ ZEND_API void gc_init(void)
ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref)
{
- if (UNEXPECTED(GC_TYPE(ref) == IS_NULL) ||
- UNEXPECTED(CG(unclean_shutdown)) ||
- UNEXPECTED(GC_G(gc_active))) {
+ gc_root_buffer *newRoot;
+
+ if (UNEXPECTED(CG(unclean_shutdown)) || UNEXPECTED(GC_G(gc_active))) {
return;
}
ZEND_ASSERT(GC_TYPE(ref) == IS_ARRAY || GC_TYPE(ref) == IS_OBJECT);
- GC_BENCH_INC(zval_possible_root);
+ ZEND_ASSERT(EXPECTED(GC_REF_GET_COLOR(ref) == GC_BLACK));
+ ZEND_ASSERT(!GC_ADDRESS(GC_INFO(ref)));
- if (EXPECTED(GC_REF_GET_COLOR(ref) == GC_BLACK)) {
- if (!GC_ADDRESS(GC_INFO(ref))) {
- gc_root_buffer *newRoot = GC_G(unused);
+ GC_BENCH_INC(zval_possible_root);
- if (newRoot) {
- GC_G(unused) = newRoot->prev;
- } else if (GC_G(first_unused) != GC_G(last_unused)) {
- newRoot = GC_G(first_unused);
- GC_G(first_unused)++;
- } else {
- if (!GC_G(gc_enabled)) {
- return;
- }
- GC_REFCOUNT(ref)++;
- gc_collect_cycles();
- GC_REFCOUNT(ref)--;
- newRoot = GC_G(unused);
- if (!newRoot) {
+ newRoot = GC_G(unused);
+ if (newRoot) {
+ GC_G(unused) = newRoot->prev;
+ } else if (GC_G(first_unused) != GC_G(last_unused)) {
+ newRoot = GC_G(first_unused);
+ GC_G(first_unused)++;
+ } else {
+ if (!GC_G(gc_enabled)) {
+ return;
+ }
+ GC_REFCOUNT(ref)++;
+ gc_collect_cycles();
+ GC_REFCOUNT(ref)--;
+ newRoot = GC_G(unused);
+ if (!newRoot) {
#if ZEND_GC_DEBUG
- if (!GC_G(gc_full)) {
- fprintf(stderr, "GC: no space to record new root candidate\n");
- GC_G(gc_full) = 1;
- }
-#endif
- return;
- }
- GC_G(unused) = newRoot->prev;
+ if (!GC_G(gc_full)) {
+ fprintf(stderr, "GC: no space to record new root candidate\n");
+ GC_G(gc_full) = 1;
}
+#endif
+ return;
+ }
+ GC_G(unused) = newRoot->prev;
+ }
- GC_REF_SET_PURPLE(ref);
- newRoot->next = GC_G(roots).next;
- newRoot->prev = &GC_G(roots);
- GC_G(roots).next->prev = newRoot;
- GC_G(roots).next = newRoot;
-
- GC_REF_SET_ADDRESS(ref, newRoot - GC_G(buf));
+ GC_TRACE_SET_COLOR(ref, GC_PURPLE);
+ GC_INFO(ref) = (newRoot - GC_G(buf)) | GC_PURPLE;
+ newRoot->ref = ref;
- newRoot->ref = ref;
+ newRoot->next = GC_G(roots).next;
+ newRoot->prev = &GC_G(roots);
+ GC_G(roots).next->prev = newRoot;
+ GC_G(roots).next = newRoot;
- GC_BENCH_INC(zval_buffered);
- GC_BENCH_INC(root_buf_length);
- GC_BENCH_PEAK(root_buf_peak, root_buf_length);
- }
- }
+ GC_BENCH_INC(zval_buffered);
+ GC_BENCH_INC(root_buf_length);
+ GC_BENCH_PEAK(root_buf_peak, root_buf_length);
}
ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref)
{
gc_root_buffer *root;
- root = GC_G(buf) + GC_ADDRESS(GC_INFO(ref));
+ ZEND_ASSERT(GC_ADDRESS(GC_INFO(ref)));
+ ZEND_ASSERT(GC_ADDRESS(GC_INFO(ref)) < GC_ROOT_BUFFER_MAX_ENTRIES);
+
GC_BENCH_INC(zval_remove_from_buffer);
- GC_REMOVE_FROM_ROOTS(root);
+
+ root = GC_G(buf) + GC_ADDRESS(GC_INFO(ref));
+ if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
+ GC_TRACE_SET_COLOR(ref, GC_PURPLE);
+ }
GC_INFO(ref) = 0;
+ GC_REMOVE_FROM_ROOTS(root);
/* updete next root that is going to be freed */
if (GC_G(next_to_free) == root) {
@@ -280,7 +300,7 @@ tail_call:
ht = NULL;
GC_REF_SET_BLACK(ref);
- if (GC_TYPE(ref) == IS_OBJECT) {
+ if (GC_TYPE(ref) == IS_OBJECT && !(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED)) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
@@ -373,7 +393,7 @@ tail_call:
GC_BENCH_INC(zval_marked_grey);
GC_REF_SET_COLOR(ref, GC_GREY);
- if (GC_TYPE(ref) == IS_OBJECT) {
+ if (GC_TYPE(ref) == IS_OBJECT && !(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED)) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
@@ -484,7 +504,7 @@ tail_call:
gc_scan_black(ref);
} else {
GC_REF_SET_COLOR(ref, GC_WHITE);
- if (GC_TYPE(ref) == IS_OBJECT) {
+ if (GC_TYPE(ref) == IS_OBJECT && !(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED)) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
@@ -563,7 +583,60 @@ static void gc_scan_roots(void)
}
}
-static int gc_collect_white(zend_refcounted *ref)
+static void gc_add_garbage(zend_refcounted *ref, gc_additional_buffer **additional_buffer)
+{
+ gc_root_buffer *buf = GC_G(unused);
+
+ if (buf) {
+ GC_G(unused) = buf->prev;
+#if 1
+ /* optimization: color is already GC_BLACK (0) */
+ GC_INFO(ref) = buf - GC_G(buf);
+#else
+ GC_REF_SET_ADDRESS(ref, buf - GC_G(buf));
+#endif
+ } else if (GC_G(first_unused) != GC_G(last_unused)) {
+ buf = GC_G(first_unused);
+ GC_G(first_unused)++;
+#if 1
+ /* optimization: color is already GC_BLACK (0) */
+ GC_INFO(ref) = buf - GC_G(buf);
+#else
+ GC_REF_SET_ADDRESS(ref, buf - GC_G(buf));
+#endif
+ } else {
+ /* If we don't have free slots in the buffer, allocate a new one and
+ * set it's address to GC_ROOT_BUFFER_MAX_ENTRIES that have special
+ * meaning.
+ */
+ if (!*additional_buffer || (*additional_buffer)->used == GC_NUM_ADDITIONAL_ENTRIES) {
+ gc_additional_buffer *new_buffer = emalloc(sizeof(gc_additional_buffer));
+ new_buffer->used = 0;
+ new_buffer->next = *additional_buffer;
+ *additional_buffer = new_buffer;
+ }
+ buf = (*additional_buffer)->buf + (*additional_buffer)->used;
+ (*additional_buffer)->used++;
+#if 1
+ /* optimization: color is already GC_BLACK (0) */
+ GC_INFO(ref) = GC_ROOT_BUFFER_MAX_ENTRIES;
+#else
+ GC_REF_SET_ADDRESS(ref, GC_ROOT_BUFFER_MAX_ENTRIES);
+#endif
+ /* modify type to prevent indirect destruction */
+ GC_TYPE(ref) |= GC_FAKE_BUFFER_FLAG;
+ }
+ if (buf) {
+ GC_REFCOUNT(ref)++;
+ buf->ref = ref;
+ buf->next = GC_G(roots).next;
+ buf->prev = &GC_G(roots);
+ GC_G(roots).next->prev = buf;
+ GC_G(roots).next = buf;
+ }
+}
+
+static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_additional_buffer **additional_buffer)
{
int count = 0;
HashTable *ht;
@@ -579,40 +652,7 @@ tail_call:
count++;
}
-#if 1
- if ((GC_TYPE(ref) == IS_OBJECT || GC_TYPE(ref) == IS_ARRAY) &&
- !GC_ADDRESS(GC_INFO(ref))) {
- /* inner-cycle garbage, add it into list */
- gc_root_buffer *buf = GC_G(unused);
-
- if (buf) {
- GC_G(unused) = buf->prev;
- } else if (GC_G(first_unused) != GC_G(last_unused)) {
- buf = GC_G(first_unused);
- GC_G(first_unused)++;
- } else {
- /* TODO: find a perfect way to handle such case ??? */
- /* See: Zend/tests/gc_033.phpt and Zend/tests/bug63635.phpt */
-#if ZEND_GC_DEBUG
- if (!GC_G(gc_full)) {
- fprintf(stderr, "GC: no space to record inner-cycle garbage\n");
- GC_G(gc_full) = 1;
- }
-#endif
- }
-
- if (buf) {
- buf->ref = ref;
- buf->next = GC_G(roots).next;
- buf->prev = &GC_G(roots);
- GC_G(roots).next->prev = buf;
- GC_G(roots).next = buf;
- GC_REF_SET_ADDRESS(ref, buf - GC_G(buf));
- }
- }
-#endif
-
- if (GC_TYPE(ref) == IS_OBJECT) {
+ if (GC_TYPE(ref) == IS_OBJECT && !(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED)) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
@@ -622,6 +662,19 @@ tail_call:
zval *zv, *end;
zval tmp;
+#if 1
+ /* optimization: color is GC_BLACK (0) */
+ if (!GC_INFO(ref)) {
+#else
+ if (!GC_ADDRESS(GC_INFO(ref))) {
+#endif
+ gc_add_garbage(ref, additional_buffer);
+ }
+ if (obj->handlers->dtor_obj &&
+ ((obj->handlers->dtor_obj != zend_objects_destroy_object) ||
+ (obj->ce->destructor != NULL))) {
+ *flags |= GC_HAS_DESTRUCTORS;
+ }
ZVAL_OBJ(&tmp, obj);
ht = get_gc(&tmp, &zv, &n);
end = zv + n;
@@ -639,7 +692,7 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)++;
- count += gc_collect_white(ref);
+ count += gc_collect_white(ref, flags, additional_buffer);
/* count non-refcounted for compatibility ??? */
} else if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
@@ -655,6 +708,14 @@ tail_call:
return count;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
+#if 1
+ /* optimization: color is GC_BLACK (0) */
+ if (!GC_INFO(ref)) {
+#else
+ if (!GC_ADDRESS(GC_INFO(ref))) {
+#endif
+ gc_add_garbage(ref, additional_buffer);
+ }
ht = (zend_array*)ref;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
@@ -678,17 +739,14 @@ tail_call:
if (p == end) return count;
}
while (p != end) {
- if (!Z_REFCOUNTED(p->val)) {
+ if (Z_REFCOUNTED(p->val)) {
+ ref = Z_COUNTED(p->val);
+ GC_REFCOUNT(ref)++;
+ count += gc_collect_white(ref, flags, additional_buffer);
/* count non-refcounted for compatibility ??? */
- if (Z_TYPE(p->val) != IS_UNDEF && Z_TYPE(p->val) != IS_INDIRECT) {
+ } else if (Z_TYPE(p->val) != IS_UNDEF && Z_TYPE(p->val) != IS_INDIRECT) {
count++;
- }
- p++;
- continue;
}
- ref = Z_COUNTED(p->val);
- GC_REFCOUNT(ref)++;
- count += gc_collect_white(ref);
p++;
}
ref = Z_COUNTED(p->val);
@@ -698,25 +756,26 @@ tail_call:
return count;
}
-static int gc_collect_roots(void)
+static int gc_collect_roots(uint32_t *flags, gc_additional_buffer **additional_buffer)
{
int count = 0;
gc_root_buffer *current = GC_G(roots).next;
/* remove non-garbage from the list */
while (current != &GC_G(roots)) {
- if (GC_REF_GET_COLOR(current->ref) != GC_WHITE) {
- GC_REF_SET_ADDRESS(current->ref, 0);
+ gc_root_buffer *next = current->next;
+ if (GC_REF_GET_COLOR(current->ref) == GC_BLACK) {
+ GC_INFO(current->ref) = 0; /* reset GC_ADDRESS() and keep GC_BLACK */
GC_REMOVE_FROM_ROOTS(current);
}
- current = current->next;
+ current = next;
}
current = GC_G(roots).next;
while (current != &GC_G(roots)) {
+ GC_REFCOUNT(current->ref)++;
if (GC_REF_GET_COLOR(current->ref) == GC_WHITE) {
- GC_REFCOUNT(current->ref)++;
- count += gc_collect_white(current->ref);
+ count += gc_collect_white(current->ref, flags, additional_buffer);
}
current = current->next;
}
@@ -743,17 +802,27 @@ static int gc_collect_roots(void)
return count;
}
-static void gc_remove_nested_data_from_buffer(zend_refcounted *ref)
+static void gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root)
{
HashTable *ht = NULL;
Bucket *p, *end;
tail_call:
- if (GC_ADDRESS(GC_INFO(ref)) != 0) {
+ if (root ||
+ (GC_ADDRESS(GC_INFO(ref)) != 0 &&
+ GC_REF_GET_COLOR(ref) == GC_BLACK &&
+ GC_ADDRESS(GC_INFO(ref)) != GC_ROOT_BUFFER_MAX_ENTRIES)) {
GC_TRACE_REF(ref, "removing from buffer");
- GC_REMOVE_FROM_BUFFER(ref);
+ GC_REFCOUNT(ref)--;
+ if (root) {
+ GC_INFO(ref) = 0;
+ GC_REMOVE_FROM_ROOTS(root);
+ root = NULL;
+ } else {
+ GC_REMOVE_FROM_BUFFER(ref);
+ }
- if (GC_TYPE(ref) == IS_OBJECT) {
+ if (GC_TYPE(ref) == IS_OBJECT && !(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED)) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
@@ -775,7 +844,7 @@ tail_call:
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- gc_remove_nested_data_from_buffer(ref);
+ gc_remove_nested_data_from_buffer(ref, NULL);
}
zv++;
}
@@ -807,7 +876,7 @@ tail_call:
while (p != end) {
if (Z_REFCOUNTED(p->val)) {
ref = Z_COUNTED(p->val);
- gc_remove_nested_data_from_buffer(ref);
+ gc_remove_nested_data_from_buffer(ref, NULL);
}
p++;
}
@@ -824,6 +893,8 @@ ZEND_API int zend_gc_collect_cycles(void)
gc_root_buffer *current, *next, *orig_next_to_free;
zend_refcounted *p;
gc_root_buffer to_free;
+ uint32_t gc_flags = 0;
+ gc_additional_buffer *additional_buffer;
#if ZEND_GC_DEBUG
zend_bool orig_gc_full;
#endif
@@ -847,7 +918,8 @@ ZEND_API int zend_gc_collect_cycles(void)
#endif
GC_TRACE("Collecting roots");
- count = gc_collect_roots();
+ additional_buffer = NULL;
+ count = gc_collect_roots(&gc_flags, &additional_buffer);
#if ZEND_GC_DEBUG
GC_G(gc_full) = orig_gc_full;
#endif
@@ -876,45 +948,47 @@ ZEND_API int zend_gc_collect_cycles(void)
GC_G(gc_full) = 0;
#endif
- /* Remember reference counters before calling destructors */
- current = to_free.next;
- while (current != &to_free) {
- current->refcount = GC_REFCOUNT(current->ref);
- current = current->next;
- }
+ if (gc_flags & GC_HAS_DESTRUCTORS) {
+ GC_TRACE("Calling destructors");
+ if (EG(objects_store).object_buckets) {
+ /* Remember reference counters before calling destructors */
+ current = to_free.next;
+ while (current != &to_free) {
+ current->refcount = GC_REFCOUNT(current->ref);
+ current = current->next;
+ }
- /* Call destructors */
- GC_TRACE("Calling destructors");
- if (EG(objects_store).object_buckets) {
- current = to_free.next;
- while (current != &to_free) {
- p = current->ref;
- GC_G(next_to_free) = current->next;
- if (GC_TYPE(p) == IS_OBJECT) {
- zend_object *obj = (zend_object*)p;
-
- if (IS_OBJ_VALID(EG(objects_store).object_buckets[obj->handle]) &&
- !(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
- GC_TRACE_REF(obj, "calling destructor");
- GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
- if (obj->handlers->dtor_obj) {
- GC_REFCOUNT(obj)++;
- obj->handlers->dtor_obj(obj);
- GC_REFCOUNT(obj)--;
+ /* Call destructors */
+ current = to_free.next;
+ while (current != &to_free) {
+ p = current->ref;
+ GC_G(next_to_free) = current->next;
+ if ((GC_TYPE(p) & GC_TYPE_MASK) == IS_OBJECT) {
+ zend_object *obj = (zend_object*)p;
+
+ if (IS_OBJ_VALID(EG(objects_store).object_buckets[obj->handle]) &&
+ !(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ GC_TRACE_REF(obj, "calling destructor");
+ GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
+ if (obj->handlers->dtor_obj) {
+ GC_REFCOUNT(obj)++;
+ obj->handlers->dtor_obj(obj);
+ GC_REFCOUNT(obj)--;
+ }
}
}
+ current = GC_G(next_to_free);
}
- current = GC_G(next_to_free);
- }
- /* Remove values captured in destructors */
- current = to_free.next;
- while (current != &to_free) {
- GC_G(next_to_free) = current->next;
- if (GC_REFCOUNT(current->ref) > current->refcount) {
- gc_remove_nested_data_from_buffer(current->ref);
+ /* Remove values captured in destructors */
+ current = to_free.next;
+ while (current != &to_free) {
+ GC_G(next_to_free) = current->next;
+ if (GC_REFCOUNT(current->ref) > current->refcount) {
+ gc_remove_nested_data_from_buffer(current->ref, current);
+ }
+ current = GC_G(next_to_free);
}
- current = GC_G(next_to_free);
}
}
@@ -926,7 +1000,7 @@ ZEND_API int zend_gc_collect_cycles(void)
p = current->ref;
GC_G(next_to_free) = current->next;
GC_TRACE_REF(p, "destroying");
- if (GC_TYPE(p) == IS_OBJECT) {
+ if ((GC_TYPE(p) & GC_TYPE_MASK) == IS_OBJECT) {
zend_object *obj = (zend_object*)p;
if (EG(objects_store).object_buckets &&
@@ -944,7 +1018,7 @@ ZEND_API int zend_gc_collect_cycles(void)
EG(objects_store).free_list_head = obj->handle;
p = current->ref = (zend_refcounted*)(((char*)obj) - obj->handlers->offset);
}
- } else if (GC_TYPE(p) == IS_ARRAY) {
+ } else if ((GC_TYPE(p) & GC_TYPE_MASK) == IS_ARRAY) {
zend_array *arr = (zend_array*)p;
GC_TYPE(arr) = IS_NULL;
@@ -958,11 +1032,20 @@ ZEND_API int zend_gc_collect_cycles(void)
while (current != &to_free) {
next = current->next;
p = current->ref;
- GC_REMOVE_FROM_ROOTS(current);
+ if (EXPECTED(current >= GC_G(buf) && current < GC_G(buf) + GC_ROOT_BUFFER_MAX_ENTRIES)) {
+ current->prev = GC_G(unused);
+ GC_G(unused) = current;
+ }
efree(p);
current = next;
}
+ while (additional_buffer != NULL) {
+ gc_additional_buffer *next = additional_buffer->next;
+ efree(additional_buffer);
+ additional_buffer = next;
+ }
+
GC_TRACE("Collection finished");
GC_G(collected) += count;
GC_G(next_to_free) = orig_next_to_free;
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index bb9f0f07d3..ea84950691 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -13,6 +13,7 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Nikita Popov <nikic@php.net> |
+ | Bob Weinand <bobwei9@hotmail.com> |
+----------------------------------------------------------------------+
*/
@@ -25,6 +26,7 @@
#include "zend_generators.h"
ZEND_API zend_class_entry *zend_ce_generator;
+ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException;
static zend_object_handlers zend_generator_handlers;
static zend_object *zend_generator_create(zend_class_entry *class_type);
@@ -94,9 +96,13 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
ZVAL_UNDEF(&generator->key);
}
+ if (Z_TYPE(generator->values) != IS_UNDEF) {
+ zval_ptr_dtor(&generator->values);
+ ZVAL_UNDEF(&generator->values);
+ }
+
if (generator->execute_data) {
zend_execute_data *execute_data = generator->execute_data;
- zend_op_array *op_array = &execute_data->func->op_array;
if (!execute_data->symbol_table) {
zend_free_compiled_variables(execute_data);
@@ -124,8 +130,8 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
}
/* Free closure object */
- if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
- OBJ_RELEASE((zend_object *) op_array->prototype);
+ if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {
+ OBJ_RELEASE((zend_object *) EX(func)->common.prototype);
}
efree(generator->stack);
@@ -179,18 +185,36 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
}
/* }}} */
+static zend_generator *zend_generator_get_child(zend_generator_node *node, zend_generator *leaf);
+
static void zend_generator_free_storage(zend_object *object) /* {{{ */
{
zend_generator *generator = (zend_generator*) object;
zend_generator_close(generator, 0);
- zval_ptr_dtor(&generator->retval);
+ if (!Z_ISUNDEF(generator->retval)) {
+ zval_ptr_dtor(&generator->retval);
+ }
+
+ if (generator->node.children > 4) {
+ zend_hash_destroy(&generator->node.child.ht);
+ }
+
zend_object_std_dtor(&generator->std);
if (generator->iterator) {
zend_iterator_dtor(generator->iterator);
}
+
+ if (generator->node.children == 0) {
+ zend_generator *root = generator->node.ptr.root, *next;
+ while (root != generator) {
+ next = zend_generator_get_child(&root->node, generator);
+ OBJ_RELEASE(&root->std);
+ root = next;
+ }
+ }
}
/* }}} */
@@ -205,6 +229,12 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ *
generator->largest_used_integer_key = -1;
ZVAL_UNDEF(&generator->retval);
+ ZVAL_UNDEF(&generator->values);
+
+ /* By default we have a tree of only one node */
+ generator->node.parent = NULL;
+ generator->node.children = 0;
+ generator->node.ptr.root = generator;
zend_object_std_init(&generator->std, class_type);
generator->std.handlers = &zend_generator_handlers;
@@ -237,7 +267,6 @@ ZEND_API void zend_generator_create_zval(zend_execute_data *call, zend_op_array
/* Save execution context in generator object. */
generator = (zend_generator *) Z_OBJ_P(return_value);
- execute_data->prev_execute_data = NULL;
generator->execute_data = execute_data;
generator->stack = EG(vm_stack);
generator->stack->top = EG(vm_stack_top);
@@ -247,6 +276,9 @@ ZEND_API void zend_generator_create_zval(zend_execute_data *call, zend_op_array
/* EX(return_value) keeps pointer to zend_object (not a real zval) */
execute_data->return_value = (zval*)generator;
+
+ memset(&generator->execute_fake, 0, sizeof(zend_execute_data));
+ Z_OBJ(generator->execute_fake.This) = (zend_object *) generator;
}
/* }}} */
@@ -258,20 +290,391 @@ static zend_function *zend_generator_get_constructor(zend_object *object) /* {{{
}
/* }}} */
-ZEND_API void zend_generator_resume(zend_generator *generator) /* {{{ */
+ZEND_API zend_execute_data *zend_generator_check_placeholder_frame(zend_execute_data *ptr)
+{
+ if (!ptr->func && ptr->prev_execute_data && Z_OBJ(ptr->This)) {
+ if (Z_OBJCE(ptr->This) == zend_ce_generator) {
+ zend_generator *generator = (zend_generator *) Z_OBJ(ptr->This);
+ zend_generator *root = (generator->node.children < 1 ? generator : generator->node.ptr.leaf)->node.ptr.root;
+ zend_execute_data *prev = ptr->prev_execute_data;
+ if (generator->node.parent != root) {
+ do {
+ generator->execute_data->prev_execute_data = prev;
+ prev = generator->execute_data;
+ generator = generator->node.parent;
+ } while (generator->node.parent != root);
+ }
+ generator->execute_data->prev_execute_data = prev;
+ ptr = generator->execute_data;
+ }
+ }
+ return ptr;
+}
+
+static void zend_generator_throw_exception(zend_generator *generator, zval *exception)
+{
+ /* Throw the exception in the context of the generator. Decrementing the opline
+ * to pretend the exception happened during the YIELD opcode. */
+ zend_execute_data *original_execute_data = EG(current_execute_data);
+ EG(current_execute_data) = generator->execute_data;
+ generator->execute_data->opline--;
+ if (exception) {
+ zend_throw_exception_object(exception);
+ } else {
+ zend_throw_exception_internal(NULL);
+ }
+ generator->execute_data->opline++;
+ EG(current_execute_data) = original_execute_data;
+}
+
+static zend_generator *zend_generator_get_child(zend_generator_node *node, zend_generator *leaf)
+{
+ switch (node->children) {
+ case 0:
+ return NULL;
+ case 1:
+ return node->child.array[0].child;
+
+#define ZEND_GEN_GET_CHILD(x) \
+ if (node->child.array[x].leaf == leaf) { \
+ return node->child.array[x].child; \
+ }
+ case 4:
+ ZEND_GEN_GET_CHILD(3)
+ case 3:
+ ZEND_GEN_GET_CHILD(2)
+ case 2:
+ ZEND_GEN_GET_CHILD(1)
+ ZEND_GEN_GET_CHILD(0)
+ ZEND_ASSERT(0); // we never should have no matching child
+ }
+
+ return zend_hash_index_find_ptr(&node->child.ht, (zend_ulong) leaf);
+}
+
+static zend_generator_node *zend_generator_search_multi_children_node(zend_generator_node *node)
+{
+ while (node->children == 1) {
+ node = &node->child.array[0].child->node;
+ }
+ return node->children > 1 ? node : NULL;
+}
+
+static void zend_generator_add_single_child(zend_generator_node *node, zend_generator *child, zend_generator *leaf)
+{
+ if (node->children < 4) {
+ node->child.array[node->children].leaf = leaf;
+ node->child.array[node->children].child = child;
+ } else if (node->children > 4) {
+ zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) leaf, child);
+ } else {
+ struct {
+ zend_generator *leaf;
+ zend_generator *child;
+ } array[4];
+ int i;
+
+ memcpy(&array, &node->child.array, sizeof(array));
+ zend_hash_init(&node->child.ht, 5, sigh, NULL, 0);
+ for (i = 0; i < 4; i++) {
+ zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) array[i].leaf, array[i].child);
+ }
+ zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) leaf, child);
+ }
+
+ node->children++;
+}
+
+static void zend_generator_merge_child_nodes(zend_generator_node *dest, zend_generator_node *src, zend_generator *child)
+{
+ if (src->children <= 4) {
+ int i = src->children;
+ while (i--) {
+ zend_generator_add_single_child(dest, child, src->child.array[i].leaf);
+ }
+ } else {
+ zend_ulong leaf;
+ ZEND_HASH_FOREACH_NUM_KEY(&src->child.ht, leaf) {
+ zend_generator_add_single_child(dest, child, (zend_generator *) leaf);
+ } ZEND_HASH_FOREACH_END();
+ }
+}
+
+/* Make attention so that the root of each subtree of the Generators tree is referenced once per leaf */
+static void zend_generator_add_child(zend_generator *generator, zend_generator *child)
+{
+ zend_generator *leaf = child->node.children ? child->node.ptr.leaf : child;
+ zend_generator_node *multi_children_node;
+ zend_bool was_leaf = generator->node.children == 0;
+
+ if (was_leaf) {
+ zend_generator *next = generator->node.parent;
+ leaf->node.ptr.root = generator->node.ptr.root;
+ ++GC_REFCOUNT(&generator->std); /* we need to increment the generator refcount here as it became integrated into the tree (no leaf), but we must not increment the refcount of the *whole* path in tree */
+ generator->node.ptr.leaf = leaf;
+
+ while (next) {
+ if (next->node.children > 1) {
+ if (next->node.children > 4) {
+ zend_generator *child = zend_hash_index_find_ptr(&next->node.child.ht, (zend_ulong) generator);
+ zend_hash_index_del(&next->node.child.ht, (zend_ulong) generator);
+ zend_hash_index_add_ptr(&next->node.child.ht, (zend_ulong) leaf, child);
+ } else {
+ switch (next->node.children) {
+#define ZEND_GEN_UPDATE_CHILD(x) \
+ if (next->node.child.array[x].leaf == generator) { \
+ next->node.child.array[x].leaf = leaf; \
+ break; \
+ }
+ case 4:
+ ZEND_GEN_UPDATE_CHILD(3)
+ case 3:
+ ZEND_GEN_UPDATE_CHILD(2)
+ case 2:
+ ZEND_GEN_UPDATE_CHILD(1)
+ ZEND_GEN_UPDATE_CHILD(0)
+ ZEND_ASSERT(0); // we never should have no matching child
+ }
+ }
+ }
+
+ next->node.ptr.leaf = leaf;
+ next = next->node.parent;
+ }
+
+ zend_generator_add_single_child(&generator->node, child, leaf);
+ } else if (generator->node.children == 1) {
+ multi_children_node = zend_generator_search_multi_children_node(&generator->node);
+ if (multi_children_node) {
+ generator->node.children = 0;
+ zend_generator_merge_child_nodes(&generator->node, multi_children_node, generator->node.child.array[0].child);
+ }
+ }
+
+ if (!was_leaf) {
+ multi_children_node = zend_generator_search_multi_children_node(&child->node);
+ } else {
+ multi_children_node = (zend_generator_node *) 0x1;
+ }
+
+ {
+ zend_generator *parent = generator->node.parent, *cur = generator;
+
+ if (multi_children_node > (zend_generator_node *) 0x1) {
+ zend_generator_merge_child_nodes(&generator->node, multi_children_node, child);
+ } else {
+ zend_generator_add_single_child(&generator->node, child, leaf);
+ }
+ while (parent) {
+ if (parent->node.children > 1) {
+ if (multi_children_node == (zend_generator_node *) 0x1) {
+ multi_children_node = zend_generator_search_multi_children_node(&child->node);
+ }
+ if (multi_children_node) {
+ zend_generator_merge_child_nodes(&parent->node, multi_children_node, cur);
+ } else {
+ zend_generator_add_single_child(&parent->node, cur, leaf);
+ }
+ }
+ cur = parent;
+ parent = parent->node.parent;
+ }
+ }
+}
+
+void zend_generator_yield_from(zend_generator *this, zend_generator *from)
+{
+ zend_generator_add_child(from, this);
+
+ this->node.parent = from;
+ zend_generator_get_current(this);
+ --GC_REFCOUNT(from);
+}
+
+ZEND_API zend_generator *zend_generator_get_current(zend_generator *generator)
+{
+ zend_generator *leaf;
+ zend_generator *root, *old_root;
+
+ if (generator->node.parent == NULL) {
+ /* we're not in yield from mode */
+ return generator;
+ }
+
+ leaf = generator->node.children ? generator->node.ptr.leaf : generator;
+ root = leaf->node.ptr.root;
+
+ if (root->execute_data && root->node.parent == NULL) {
+ /* generator still running */
+ return root;
+ }
+
+ /* generator at the root had stopped */
+ if (root != generator) {
+ old_root = root;
+ root = zend_generator_get_child(&root->node, leaf);
+ } else {
+ old_root = NULL;
+ }
+
+ while (!root->execute_data && root != generator) {
+ OBJ_RELEASE(&old_root->std);
+ old_root = root;
+
+ root = zend_generator_get_child(&root->node, leaf);
+ }
+
+ if (root->node.parent) {
+ if (root->node.parent->execute_data == NULL) {
+ if (EXPECTED(EG(exception) == NULL)) {
+ zend_op *yield_from = (zend_op *) root->execute_data->opline - 1;
+
+ if (yield_from->opcode == ZEND_YIELD_FROM && !(yield_from->result_type & EXT_TYPE_UNUSED)) {
+ if (Z_ISUNDEF(root->node.parent->retval)) {
+ /* Throw the exception in the context of the generator */
+ zend_execute_data *original_execute_data = EG(current_execute_data);
+ EG(current_execute_data) = root->execute_data;
+
+ if (root == generator) {
+ root->execute_data->prev_execute_data = original_execute_data;
+ } else {
+ root->execute_data->prev_execute_data = &generator->execute_fake;
+ generator->execute_fake.prev_execute_data = original_execute_data;
+ }
+
+ zend_throw_exception(zend_ce_ClosedGeneratorException, "Generator yielded from aborted, no return value available", 0);
+
+ EG(current_execute_data) = original_execute_data;
+ } else {
+ ZVAL_COPY(ZEND_CALL_VAR(root->execute_data, yield_from->result.var), &root->node.parent->retval);
+ }
+ }
+ }
+
+ root->node.parent = NULL;
+ } else {
+ do {
+ root = root->node.parent;
+ ++GC_REFCOUNT(&root->std);
+ } while (root->node.parent);
+ }
+ }
+
+ if (old_root) {
+ OBJ_RELEASE(&old_root->std);
+ }
+
+ return leaf->node.ptr.root = root;
+}
+
+static int zend_generator_get_next_delegated_value(zend_generator *generator) /* {{{ */
+{
+ zval *value;
+ if (Z_TYPE(generator->values) == IS_ARRAY) {
+ HashTable *ht = Z_ARR(generator->values);
+ HashPosition pos = Z_FE_POS(generator->values);
+
+ Bucket *p;
+ do {
+ if (UNEXPECTED(pos >= ht->nNumUsed)) {
+ /* Reached end of array */
+ goto failure;
+ }
+
+ p = &ht->arData[pos];
+ value = &p->val;
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ pos++;
+ } while (Z_ISUNDEF_P(value));
+
+ zval_ptr_dtor(&generator->value);
+ ZVAL_COPY(&generator->value, value);
+
+ zval_ptr_dtor(&generator->key);
+ if (p->key) {
+ ZVAL_STR_COPY(&generator->key, p->key);
+ } else {
+ ZVAL_LONG(&generator->key, p->h);
+ }
+
+ Z_FE_POS(generator->values) = pos;
+ } else {
+ zend_object_iterator *iter = (zend_object_iterator *) Z_OBJ(generator->values);
+
+ if (++iter->index > 0) {
+ iter->funcs->move_forward(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ goto failure;
+ }
+ }
+
+ if (iter->funcs->valid(iter) == FAILURE) {
+ /* reached end of iteration */
+ goto failure;
+ }
+
+ value = iter->funcs->get_current_data(iter);
+ if (UNEXPECTED(EG(exception) != NULL || !value)) {
+ goto failure;
+ }
+
+ zval_ptr_dtor(&generator->value);
+ ZVAL_COPY(&generator->value, value);
+
+ zval_ptr_dtor(&generator->key);
+ if (iter->funcs->get_current_key) {
+ iter->funcs->get_current_key(iter, &generator->key);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ ZVAL_UNDEF(&generator->key);
+ goto failure;
+ }
+ } else {
+ ZVAL_LONG(&generator->key, iter->index);
+ }
+ }
+ return SUCCESS;
+
+failure:
+ zval_ptr_dtor(&generator->values);
+ ZVAL_UNDEF(&generator->values);
+ return FAILURE;
+}
+/* }}} */
+
+ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
{
+ zend_generator *generator;
+
/* The generator is already closed, thus can't resume */
- if (!generator->execute_data) {
+ if (!orig_generator->execute_data) {
return;
}
+ generator = zend_generator_get_current(orig_generator);
+
+try_again:
if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot resume an already running generator");
return;
}
+ if (!Z_ISUNDEF(generator->values)) {
+ if (zend_generator_get_next_delegated_value(generator) == SUCCESS) {
+ return;
+ }
+ /* If there are no more deletegated values, resume the generator
+ * after the "yield from" expression. */
+ }
+
+ if ((orig_generator->flags & ZEND_GENERATOR_DO_INIT) && !Z_ISUNDEF(generator->value)) {
+ /* We must not advance Generator if we yield from a Generator being currently run */
+ return;
+ }
+
/* Drop the AT_FIRST_YIELD flag */
- generator->flags &= ~ZEND_GENERATOR_AT_FIRST_YIELD;
+ orig_generator->flags &= ~ZEND_GENERATOR_AT_FIRST_YIELD;
{
/* Backup executor globals */
@@ -290,7 +693,14 @@ ZEND_API void zend_generator_resume(zend_generator *generator) /* {{{ */
/* We want the backtrace to look as if the generator function was
* called from whatever method we are current running (e.g. next()).
* So we have to link generator call frame with caller call frame. */
- generator->execute_data->prev_execute_data = original_execute_data;
+ if (generator == orig_generator) {
+ generator->execute_data->prev_execute_data = original_execute_data;
+ } else {
+ /* We need some execute_data placeholder in stacktrace to be replaced
+ * by the real stack trace when needed */
+ generator->execute_data->prev_execute_data = &orig_generator->execute_fake;
+ orig_generator->execute_fake.prev_execute_data = original_execute_data;
+ }
/* Resume execution */
generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING;
@@ -301,7 +711,6 @@ ZEND_API void zend_generator_resume(zend_generator *generator) /* {{{ */
if (generator->execute_data) {
generator->stack = EG(vm_stack);
generator->stack->top = EG(vm_stack_top);
- generator->execute_data->prev_execute_data = NULL;
}
/* Restore executor globals */
@@ -312,9 +721,24 @@ ZEND_API void zend_generator_resume(zend_generator *generator) /* {{{ */
EG(vm_stack) = original_stack;
/* If an exception was thrown in the generator we have to internally
- * rethrow it in the parent scope. */
+ * rethrow it in the parent scope.
+ * In case we did yield from, the Exception must be rethrown into
+ * its calling frame (see above in if (check_yield_from). */
if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL);
+ if (generator == orig_generator) {
+ zend_generator_close(generator, 0);
+ zend_throw_exception_internal(NULL);
+ } else {
+ generator = zend_generator_get_current(orig_generator);
+ zend_generator_throw_exception(generator, NULL);
+ goto try_again;
+ }
+ }
+
+ /* yield from was used, try another resume. */
+ if ((generator != orig_generator && !Z_ISUNDEF(generator->retval)) || (generator->execute_data && (generator->execute_data->opline - 1)->opcode == ZEND_YIELD_FROM)) {
+ generator = zend_generator_get_current(orig_generator);
+ goto try_again;
}
}
}
@@ -322,8 +746,10 @@ ZEND_API void zend_generator_resume(zend_generator *generator) /* {{{ */
static void zend_generator_ensure_initialized(zend_generator *generator) /* {{{ */
{
- if (generator->execute_data && Z_TYPE(generator->value) == IS_UNDEF) {
+ if (generator->execute_data && Z_TYPE(generator->value) == IS_UNDEF && generator->node.parent == NULL) {
+ generator->flags |= ZEND_GENERATOR_DO_INIT;
zend_generator_resume(generator);
+ generator->flags &= ~ZEND_GENERATOR_DO_INIT;
generator->flags |= ZEND_GENERATOR_AT_FIRST_YIELD;
}
}
@@ -369,7 +795,9 @@ ZEND_METHOD(Generator, valid)
zend_generator_ensure_initialized(generator);
- RETURN_BOOL(Z_TYPE(generator->value) != IS_UNDEF);
+ zend_generator_get_current(generator);
+
+ RETURN_BOOL(Z_TYPE(generator->value) != IS_UNDEF || generator->node.parent != NULL);
}
/* }}} */
@@ -377,7 +805,7 @@ ZEND_METHOD(Generator, valid)
* Get the current value */
ZEND_METHOD(Generator, current)
{
- zend_generator *generator;
+ zend_generator *generator, *root;
if (zend_parse_parameters_none() == FAILURE) {
return;
@@ -387,8 +815,9 @@ ZEND_METHOD(Generator, current)
zend_generator_ensure_initialized(generator);
- if (Z_TYPE(generator->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&generator->value);
+ root = zend_generator_get_current(generator);
+ if (Z_TYPE(root->value) != IS_UNDEF) {
+ RETURN_ZVAL_FAST(&root->value);
}
}
/* }}} */
@@ -397,7 +826,7 @@ ZEND_METHOD(Generator, current)
* Get the current key */
ZEND_METHOD(Generator, key)
{
- zend_generator *generator;
+ zend_generator *generator, *root;
if (zend_parse_parameters_none() == FAILURE) {
return;
@@ -407,8 +836,9 @@ ZEND_METHOD(Generator, key)
zend_generator_ensure_initialized(generator);
- if (Z_TYPE(generator->key) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&generator->key);
+ root = zend_generator_get_current(generator);
+ if (Z_TYPE(root->key) != IS_UNDEF) {
+ RETURN_ZVAL_FAST(&root->key);
}
}
/* }}} */
@@ -436,7 +866,7 @@ ZEND_METHOD(Generator, next)
ZEND_METHOD(Generator, send)
{
zval *value;
- zend_generator *generator;
+ zend_generator *generator, *root;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &value) == FAILURE) {
return;
@@ -451,16 +881,18 @@ ZEND_METHOD(Generator, send)
return;
}
+ root = zend_generator_get_current(generator);
/* Put sent value in the target VAR slot, if it is used */
- if (generator->send_target) {
- if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target);
- ZVAL_COPY(generator->send_target, value);
+ if (root->send_target) {
+ if (Z_REFCOUNTED_P(root->send_target)) Z_DELREF_P(root->send_target);
+ ZVAL_COPY(root->send_target, value);
}
zend_generator_resume(generator);
- if (Z_TYPE(generator->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&generator->value);
+ root = zend_generator_get_current(generator);
+ if (Z_TYPE(root->value) != IS_UNDEF) {
+ RETURN_ZVAL_FAST(&root->value);
}
}
/* }}} */
@@ -483,18 +915,15 @@ ZEND_METHOD(Generator, throw)
zend_generator_ensure_initialized(generator);
if (generator->execute_data) {
- /* Throw the exception in the context of the generator */
- zend_execute_data *current_execute_data = EG(current_execute_data);
- EG(current_execute_data) = generator->execute_data;
-
- zend_throw_exception_object(&exception_copy);
+ zend_generator *root = zend_generator_get_current(generator);
- EG(current_execute_data) = current_execute_data;
+ zend_generator_throw_exception(root, &exception_copy);
zend_generator_resume(generator);
- if (Z_TYPE(generator->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&generator->value);
+ root = zend_generator_get_current(generator);
+ if (Z_TYPE(root->value) != IS_UNDEF) {
+ RETURN_ZVAL_FAST(&root->value);
}
} else {
/* If the generator is already closed throw the exception in the
@@ -565,28 +994,34 @@ static int zend_generator_iterator_valid(zend_object_iterator *iterator) /* {{{
zend_generator_ensure_initialized(generator);
- return Z_TYPE(generator->value) != IS_UNDEF ? SUCCESS : FAILURE;
+ zend_generator_get_current(generator);
+
+ return Z_TYPE(generator->value) != IS_UNDEF || generator->node.parent != NULL ? SUCCESS : FAILURE;
}
/* }}} */
static zval *zend_generator_iterator_get_data(zend_object_iterator *iterator) /* {{{ */
{
- zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
+ zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data), *root;
zend_generator_ensure_initialized(generator);
- return &generator->value;
+ root = zend_generator_get_current(generator);
+
+ return &root->value;
}
/* }}} */
static void zend_generator_iterator_get_key(zend_object_iterator *iterator, zval *key) /* {{{ */
{
- zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
+ zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data), *root;
zend_generator_ensure_initialized(generator);
- if (Z_TYPE(generator->key) != IS_UNDEF) {
- ZVAL_ZVAL(key, &generator->key, 1, 0);
+ root = zend_generator_get_current(generator);
+
+ if (Z_TYPE(root->key) != IS_UNDEF) {
+ ZVAL_ZVAL(key, &root->key, 1, 0);
} else {
ZVAL_NULL(key);
}
@@ -691,6 +1126,9 @@ void zend_register_generator_ce(void) /* {{{ */
zend_generator_handlers.dtor_obj = zend_generator_dtor_storage;
zend_generator_handlers.clone_obj = NULL;
zend_generator_handlers.get_constructor = zend_generator_get_constructor;
+
+ INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", NULL);
+ zend_ce_ClosedGeneratorException = zend_register_internal_class_ex(&ce, zend_exception_get_default());
}
/* }}} */
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 2e70bc5a2f..ae1e312eee 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -13,6 +13,7 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Nikita Popov <nikic@php.net> |
+ | Bob Weinand <bobwei9@hotmail.com> |
+----------------------------------------------------------------------+
*/
@@ -24,8 +25,36 @@
BEGIN_EXTERN_C()
extern ZEND_API zend_class_entry *zend_ce_generator;
+extern ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException;
-typedef struct _zend_generator {
+typedef struct _zend_generator_node zend_generator_node;
+typedef struct _zend_generator zend_generator;
+
+/* The concept of `yield from` exposes problems when accessed at different levels of the chain of delegated generators. We need to be able to reference the currently executed Generator in all cases and still being able to access the return values of finished Generators.
+ * The solution to this problem is a doubly-linked tree, which all Generators referenced in maintain a reference to. It should be impossible to avoid walking the tree in all cases. This way, we only need tree walks from leaf to root in case where some part of the `yield from` chain is passed to another `yield from`. (Update of leaf node pointer and list of multi-children nodes needed when leaf gets a child in direct path from leaf to root node.) But only in that case, which should be a fairly rare case (which is then possible, but not totally cheap).
+ * The root of the tree is then the currently executed Generator. The subnodes of the tree (all except the root node) are all Generators which do `yield from`. Each node of the tree knows a pointer to one leaf descendant node. Each node with multiple children needs a list of all leaf descendant nodes paired with pointers to their respective child node. (The stack is determined by leaf node pointers) Nodes with only one child just don't need a list, there it is enough to just have a pointer to the child node. Further, leaf nodes store a pointer to the root node.
+ * That way, when we advance any generator, we just need to look up a leaf node (which all have a reference to a root node). Then we can see at the root node whether current Generator is finished. If it isn't, all is fine and we can just continue. If the Generator finished, there will be two cases. Either it is a simple node with just one child, then go down to child node. Or it has multiple children and we now will remove the current leaf node from the list of nodes (unnecessary, is microoptimization) and go down to the child node whose reference was paired with current leaf node. Child node is then removed its parent reference and becomes new top node. Or the current node references the Generator we're currently executing, then we can continue from the YIELD_FROM opcode. When a node referenced as root node in a leaf node has a parent, then we go the way up until we find a root node without parent.
+ * In case we go into a new `yield from` level, a node is created on top of current root and becomes the new root. Leaf node needs to be updated with new root node then.
+ * When a Generator referenced by a node of the tree is added to `yield from`, that node now gets a list of children (we need to walk the descendants of that node and nodes of the tree of the other Generator down to the first multi-children node and copy all the leaf node pointers from there). In case there was no multi-children node (linear tree), we just add a pair (pointer to leaf node, pointer to child node), with the child node being in a direct path from leaf to this node.
+ */
+
+struct _zend_generator_node {
+ zend_generator *parent; /* NULL for root */
+ uint32_t children;
+ union { /* HashTable / hard coded array for faster access */
+ HashTable ht; /* if > 4 children */
+ struct {
+ zend_generator *leaf;
+ zend_generator *child;
+ } array[4]; /* if <= 4 children */
+ } child;
+ union {
+ zend_generator *leaf; /* if > 0 children */
+ zend_generator *root; /* if 0 children */
+ } ptr;
+};
+
+struct _zend_generator {
zend_object std;
zend_object_iterator *iterator;
@@ -47,19 +76,37 @@ typedef struct _zend_generator {
/* Largest used integer key for auto-incrementing keys */
zend_long largest_used_integer_key;
+ /* Values specified by "yield from" to yield from this generator.
+ * This is only used for arrays or non-generator Traversables.
+ * This zval also uses the u2 structure in the same way as
+ * by-value foreach. */
+ zval values;
+
+ /* Node of waiting generators when multiple "yield *" expressions
+ * are nested. */
+ zend_generator_node node;
+
+ /* Fake execute_data for stacktraces */
+ zend_execute_data execute_fake;
+
/* ZEND_GENERATOR_* flags */
zend_uchar flags;
-} zend_generator;
+};
static const zend_uchar ZEND_GENERATOR_CURRENTLY_RUNNING = 0x1;
static const zend_uchar ZEND_GENERATOR_FORCED_CLOSE = 0x2;
static const zend_uchar ZEND_GENERATOR_AT_FIRST_YIELD = 0x4;
+static const zend_uchar ZEND_GENERATOR_DO_INIT = 0x8;
void zend_register_generator_ce(void);
ZEND_API void zend_generator_create_zval(zend_execute_data *call, zend_op_array *op_array, zval *return_value);
ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution);
ZEND_API void zend_generator_resume(zend_generator *generator);
+void zend_generator_yield_from(zend_generator *this, zend_generator *from);
+ZEND_API zend_generator *zend_generator_get_current(zend_generator *generator);
+ZEND_API zend_execute_data *zend_generator_check_placeholder_frame(zend_execute_data *ptr);
+
END_EXTERN_C()
#endif
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 3461925de6..9dec40d57a 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -578,6 +578,15 @@ static zend_always_inline void *zend_hash_str_update_mem(HashTable *ht, const ch
return zend_hash_str_update_ptr(ht, str, len, p);
}
+static zend_always_inline void *zend_hash_index_add_ptr(HashTable *ht, zend_ulong h, void *pData)
+{
+ zval tmp, *zv;
+
+ ZVAL_PTR(&tmp, pData);
+ zv = zend_hash_index_add(ht, h, &tmp);
+ return zv ? Z_PTR_P(zv) : NULL;
+}
+
static zend_always_inline void *zend_hash_index_update_ptr(HashTable *ht, zend_ulong h, void *pData)
{
zval tmp, *zv;
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 8db3fb2f3d..0aba081218 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -67,6 +67,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%right T_PRINT
%right T_YIELD
%right T_DOUBLE_ARROW
+%right T_YIELD_FROM
%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
%left '?' ':'
%right T_COALESCE
@@ -112,6 +113,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token T_LOGICAL_AND "and (T_LOGICAL_AND)"
%token T_PRINT "print (T_PRINT)"
%token T_YIELD "yield (T_YIELD)"
+%token T_YIELD_FROM "yield from (T_YIELD_FROM)"
%token T_PLUS_EQUAL "+= (T_PLUS_EQUAL)"
%token T_MINUS_EQUAL "-= (T_MINUS_EQUAL)"
%token T_MUL_EQUAL "*= (T_MUL_EQUAL)"
@@ -907,6 +909,7 @@ expr_without_variable:
| T_YIELD { $$ = zend_ast_create(ZEND_AST_YIELD, NULL, NULL); }
| T_YIELD expr { $$ = zend_ast_create(ZEND_AST_YIELD, $2, NULL); }
| T_YIELD expr T_DOUBLE_ARROW expr { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); }
+ | T_YIELD_FROM expr { $$ = zend_ast_create(ZEND_AST_YIELD_FROM, $2); }
| function returns_ref '(' parameter_list ')' lexical_vars return_type
backup_doc_comment '{' inner_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2, $1, $8,
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index 6f1bcd2f6d..37bfceef76 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -1136,7 +1136,7 @@ yyc_INITIAL:
yy3:
YYDEBUG(3, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1770 "Zend/zend_language_scanner.l"
+#line 1774 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
return 0;
@@ -1199,7 +1199,7 @@ yy5:
yy6:
YYDEBUG(6, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1761 "Zend/zend_language_scanner.l"
+#line 1765 "Zend/zend_language_scanner.l"
{
if (CG(short_tags)) {
BEGIN(ST_IN_SCRIPTING);
@@ -1214,7 +1214,7 @@ yy7:
++YYCURSOR;
YYDEBUG(8, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1748 "Zend/zend_language_scanner.l"
+#line 1752 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
return T_OPEN_TAG_WITH_ECHO;
@@ -1250,7 +1250,7 @@ yy13:
yy14:
YYDEBUG(14, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1754 "Zend/zend_language_scanner.l"
+#line 1758 "Zend/zend_language_scanner.l"
{
HANDLE_NEWLINE(yytext[yyleng-1]);
BEGIN(ST_IN_SCRIPTING);
@@ -1326,7 +1326,7 @@ yyc_ST_BACKQUOTE:
yy19:
YYDEBUG(19, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2184 "Zend/zend_language_scanner.l"
+#line 2188 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
return 0;
@@ -1380,7 +1380,7 @@ yy21:
++YYCURSOR;
YYDEBUG(22, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2126 "Zend/zend_language_scanner.l"
+#line 2130 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
return '`';
@@ -1395,7 +1395,7 @@ yy24:
++YYCURSOR;
YYDEBUG(25, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2113 "Zend/zend_language_scanner.l"
+#line 2117 "Zend/zend_language_scanner.l"
{
Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
@@ -1418,7 +1418,7 @@ yy26:
yy28:
YYDEBUG(28, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1835 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
return T_VARIABLE;
@@ -1429,7 +1429,7 @@ yy29:
++YYCURSOR;
YYDEBUG(30, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1556 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -1448,7 +1448,7 @@ yy33:
++YYCURSOR;
YYDEBUG(34, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
@@ -1473,7 +1473,7 @@ yy36:
++YYCURSOR;
YYDEBUG(37, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1823 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
@@ -1548,7 +1548,7 @@ yy40:
yy41:
YYDEBUG(41, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2132 "Zend/zend_language_scanner.l"
+#line 2136 "Zend/zend_language_scanner.l"
{
if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -1610,7 +1610,7 @@ yy43:
++YYCURSOR;
YYDEBUG(44, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2121 "Zend/zend_language_scanner.l"
+#line 2125 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
return '"';
@@ -1625,7 +1625,7 @@ yy46:
++YYCURSOR;
YYDEBUG(47, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2113 "Zend/zend_language_scanner.l"
+#line 2117 "Zend/zend_language_scanner.l"
{
Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
@@ -1648,7 +1648,7 @@ yy48:
yy50:
YYDEBUG(50, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1835 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
return T_VARIABLE;
@@ -1659,7 +1659,7 @@ yy51:
++YYCURSOR;
YYDEBUG(52, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1556 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -1678,7 +1678,7 @@ yy55:
++YYCURSOR;
YYDEBUG(56, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
@@ -1703,7 +1703,7 @@ yy58:
++YYCURSOR;
YYDEBUG(59, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1823 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
@@ -1721,7 +1721,7 @@ yyc_ST_END_HEREDOC:
++YYCURSOR;
YYDEBUG(63, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2099 "Zend/zend_language_scanner.l"
+#line 2103 "Zend/zend_language_scanner.l"
{
zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
@@ -1796,7 +1796,7 @@ yy66:
yy67:
YYDEBUG(67, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2228 "Zend/zend_language_scanner.l"
+#line 2232 "Zend/zend_language_scanner.l"
{
int newline = 0;
@@ -1886,7 +1886,7 @@ yy70:
++YYCURSOR;
YYDEBUG(71, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2113 "Zend/zend_language_scanner.l"
+#line 2117 "Zend/zend_language_scanner.l"
{
Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
@@ -1909,7 +1909,7 @@ yy72:
yy74:
YYDEBUG(74, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1835 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
return T_VARIABLE;
@@ -1920,7 +1920,7 @@ yy75:
++YYCURSOR;
YYDEBUG(76, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1556 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -1939,7 +1939,7 @@ yy79:
++YYCURSOR;
YYDEBUG(80, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
@@ -1964,7 +1964,7 @@ yy82:
++YYCURSOR;
YYDEBUG(83, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1823 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
@@ -2138,23 +2138,23 @@ yy86:
YYDEBUG(-1, yych);
switch ((yych = *YYCURSOR)) {
case 'C':
- case 'c': goto yy697;
+ case 'c': goto yy704;
case 'L':
- case 'l': goto yy698;
+ case 'l': goto yy705;
case 'M':
- case 'm': goto yy699;
+ case 'm': goto yy706;
case 'N':
- case 'n': goto yy700;
+ case 'n': goto yy707;
case 'V':
- case 'v': goto yy701;
+ case 'v': goto yy708;
case 'X':
- case 'x': goto yy702;
+ case 'x': goto yy709;
default: goto yy150;
}
yy87:
YYDEBUG(87, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1858 "Zend/zend_language_scanner.l"
+#line 1862 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, yytext, yyleng);
return T_STRING;
@@ -2165,20 +2165,20 @@ yy88:
yych = *++YYCURSOR;
if (yych <= 'O') {
if (yych <= 'H') {
- if (yych == 'E') goto yy679;
+ if (yych == 'E') goto yy686;
goto yy150;
} else {
- if (yych <= 'I') goto yy680;
+ if (yych <= 'I') goto yy687;
if (yych <= 'N') goto yy150;
- goto yy681;
+ goto yy688;
}
} else {
if (yych <= 'h') {
- if (yych == 'e') goto yy679;
+ if (yych == 'e') goto yy686;
goto yy150;
} else {
- if (yych <= 'i') goto yy680;
- if (yych == 'o') goto yy681;
+ if (yych <= 'i') goto yy687;
+ if (yych == 'o') goto yy688;
goto yy150;
}
}
@@ -2187,20 +2187,20 @@ yy89:
yych = *++YYCURSOR;
if (yych <= 'U') {
if (yych <= 'N') {
- if (yych == 'I') goto yy655;
+ if (yych == 'I') goto yy662;
goto yy150;
} else {
- if (yych <= 'O') goto yy656;
+ if (yych <= 'O') goto yy663;
if (yych <= 'T') goto yy150;
- goto yy657;
+ goto yy664;
}
} else {
if (yych <= 'n') {
- if (yych == 'i') goto yy655;
+ if (yych == 'i') goto yy662;
goto yy150;
} else {
- if (yych <= 'o') goto yy656;
- if (yych == 'u') goto yy657;
+ if (yych <= 'o') goto yy663;
+ if (yych == 'u') goto yy664;
goto yy150;
}
}
@@ -2209,28 +2209,28 @@ yy90:
yych = *++YYCURSOR;
if (yych <= 'O') {
if (yych <= 'K') {
- if (yych == 'A') goto yy620;
+ if (yych == 'A') goto yy627;
goto yy150;
} else {
- if (yych <= 'L') goto yy621;
+ if (yych <= 'L') goto yy628;
if (yych <= 'N') goto yy150;
- goto yy622;
+ goto yy629;
}
} else {
if (yych <= 'k') {
- if (yych == 'a') goto yy620;
+ if (yych == 'a') goto yy627;
goto yy150;
} else {
- if (yych <= 'l') goto yy621;
- if (yych == 'o') goto yy622;
+ if (yych <= 'l') goto yy628;
+ if (yych == 'o') goto yy629;
goto yy150;
}
}
yy91:
YYDEBUG(91, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy602;
- if (yych == 'e') goto yy602;
+ if (yych == 'E') goto yy609;
+ if (yych == 'e') goto yy609;
goto yy150;
yy92:
YYDEBUG(92, *YYCURSOR);
@@ -2391,7 +2391,7 @@ yy101:
yy102:
YYDEBUG(102, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1545 "Zend/zend_language_scanner.l"
+#line 1549 "Zend/zend_language_scanner.l"
{
return yytext[0];
}
@@ -2404,7 +2404,7 @@ yy103:
yy104:
YYDEBUG(104, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1260 "Zend/zend_language_scanner.l"
+#line 1264 "Zend/zend_language_scanner.l"
{
HANDLE_NEWLINES(yytext, yyleng);
return T_WHITESPACE;
@@ -2420,7 +2420,7 @@ yy106:
++YYCURSOR;
YYDEBUG(107, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1285 "Zend/zend_language_scanner.l"
+#line 1289 "Zend/zend_language_scanner.l"
{
return T_NS_SEPARATOR;
}
@@ -2653,7 +2653,7 @@ yy131:
++YYCURSOR;
YYDEBUG(132, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1550 "Zend/zend_language_scanner.l"
+#line 1554 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_IN_SCRIPTING);
return '{';
@@ -2664,7 +2664,7 @@ yy133:
++YYCURSOR;
YYDEBUG(134, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1562 "Zend/zend_language_scanner.l"
+#line 1566 "Zend/zend_language_scanner.l"
{
RESET_DOC_COMMENT();
if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -2700,7 +2700,7 @@ yy135:
yy136:
YYDEBUG(136, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1615 "Zend/zend_language_scanner.l"
+#line 1619 "Zend/zend_language_scanner.l"
{
char *end;
if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
@@ -2770,7 +2770,7 @@ yy139:
yy140:
YYDEBUG(140, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1864 "Zend/zend_language_scanner.l"
+#line 1868 "Zend/zend_language_scanner.l"
{
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
@@ -2806,7 +2806,7 @@ yy141:
yy142:
YYDEBUG(142, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1932 "Zend/zend_language_scanner.l"
+#line 1936 "Zend/zend_language_scanner.l"
{
register char *s, *t;
char *end;
@@ -2881,7 +2881,7 @@ yy143:
yy144:
YYDEBUG(144, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2001 "Zend/zend_language_scanner.l"
+#line 2005 "Zend/zend_language_scanner.l"
{
int bprefix = (yytext[0] != '"') ? 1 : 0;
@@ -2930,7 +2930,7 @@ yy145:
++YYCURSOR;
YYDEBUG(146, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2093 "Zend/zend_language_scanner.l"
+#line 2097 "Zend/zend_language_scanner.l"
{
BEGIN(ST_BACKQUOTE);
return '`';
@@ -2941,7 +2941,7 @@ yy147:
++YYCURSOR;
YYDEBUG(148, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2361 "Zend/zend_language_scanner.l"
+#line 2365 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
return 0;
@@ -2977,7 +2977,7 @@ yy151:
yy153:
YYDEBUG(153, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1706 "Zend/zend_language_scanner.l"
+#line 1710 "Zend/zend_language_scanner.l"
{
const char *end;
@@ -3018,7 +3018,7 @@ yy156:
yy157:
YYDEBUG(157, *YYCURSOR);
YYCURSOR = YYMARKER;
- if (yyaccept <= 2) {
+ if (yyaccept <= 3) {
if (yyaccept <= 1) {
if (yyaccept <= 0) {
goto yy87;
@@ -3026,17 +3026,21 @@ yy157:
goto yy102;
}
} else {
- goto yy136;
+ if (yyaccept <= 2) {
+ goto yy136;
+ } else {
+ goto yy153;
+ }
}
} else {
- if (yyaccept <= 4) {
- if (yyaccept <= 3) {
- goto yy153;
- } else {
+ if (yyaccept <= 5) {
+ if (yyaccept <= 4) {
goto yy190;
+ } else {
+ goto yy210;
}
} else {
- goto yy210;
+ goto yy601;
}
}
yy158:
@@ -3078,7 +3082,7 @@ yy163:
}
YYDEBUG(165, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1587 "Zend/zend_language_scanner.l"
+#line 1591 "Zend/zend_language_scanner.l"
{
char *bin = yytext + 2; /* Skip "0b" */
int len = yyleng - 2;
@@ -3106,7 +3110,7 @@ yy163:
return T_DNUMBER;
}
}
-#line 3110 "Zend/zend_language_scanner.c"
+#line 3114 "Zend/zend_language_scanner.c"
yy166:
YYDEBUG(166, *YYCURSOR);
++YYCURSOR;
@@ -3118,7 +3122,7 @@ yy166:
}
YYDEBUG(168, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1657 "Zend/zend_language_scanner.l"
+#line 1661 "Zend/zend_language_scanner.l"
{
char *hex = yytext + 2; /* Skip "0x" */
int len = yyleng - 2;
@@ -3146,7 +3150,7 @@ yy166:
return T_DNUMBER;
}
}
-#line 3150 "Zend/zend_language_scanner.c"
+#line 3154 "Zend/zend_language_scanner.c"
yy169:
YYDEBUG(169, *YYCURSOR);
++YYCURSOR;
@@ -3171,12 +3175,12 @@ yy169:
yy171:
YYDEBUG(171, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1835 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
return T_VARIABLE;
}
-#line 3180 "Zend/zend_language_scanner.c"
+#line 3184 "Zend/zend_language_scanner.c"
yy172:
YYDEBUG(172, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3190,11 +3194,11 @@ yy173:
}
YYDEBUG(174, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1533 "Zend/zend_language_scanner.l"
+#line 1537 "Zend/zend_language_scanner.l"
{
return T_LOGICAL_XOR;
}
-#line 3198 "Zend/zend_language_scanner.c"
+#line 3202 "Zend/zend_language_scanner.c"
yy175:
YYDEBUG(175, *YYCURSOR);
++YYCURSOR;
@@ -3203,71 +3207,71 @@ yy175:
}
YYDEBUG(176, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1525 "Zend/zend_language_scanner.l"
+#line 1529 "Zend/zend_language_scanner.l"
{
return T_LOGICAL_OR;
}
-#line 3211 "Zend/zend_language_scanner.c"
+#line 3215 "Zend/zend_language_scanner.c"
yy177:
YYDEBUG(177, *YYCURSOR);
++YYCURSOR;
YYDEBUG(178, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1513 "Zend/zend_language_scanner.l"
+#line 1517 "Zend/zend_language_scanner.l"
{
return T_XOR_EQUAL;
}
-#line 3221 "Zend/zend_language_scanner.c"
+#line 3225 "Zend/zend_language_scanner.c"
yy179:
YYDEBUG(179, *YYCURSOR);
++YYCURSOR;
YYDEBUG(180, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1517 "Zend/zend_language_scanner.l"
+#line 1521 "Zend/zend_language_scanner.l"
{
return T_BOOLEAN_OR;
}
-#line 3231 "Zend/zend_language_scanner.c"
+#line 3235 "Zend/zend_language_scanner.c"
yy181:
YYDEBUG(181, *YYCURSOR);
++YYCURSOR;
YYDEBUG(182, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1509 "Zend/zend_language_scanner.l"
+#line 1513 "Zend/zend_language_scanner.l"
{
return T_OR_EQUAL;
}
-#line 3241 "Zend/zend_language_scanner.c"
+#line 3245 "Zend/zend_language_scanner.c"
yy183:
YYDEBUG(183, *YYCURSOR);
++YYCURSOR;
YYDEBUG(184, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1521 "Zend/zend_language_scanner.l"
+#line 1525 "Zend/zend_language_scanner.l"
{
return T_BOOLEAN_AND;
}
-#line 3251 "Zend/zend_language_scanner.c"
+#line 3255 "Zend/zend_language_scanner.c"
yy185:
YYDEBUG(185, *YYCURSOR);
++YYCURSOR;
YYDEBUG(186, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1505 "Zend/zend_language_scanner.l"
+#line 1509 "Zend/zend_language_scanner.l"
{
return T_AND_EQUAL;
}
-#line 3261 "Zend/zend_language_scanner.c"
+#line 3265 "Zend/zend_language_scanner.c"
yy187:
YYDEBUG(187, *YYCURSOR);
++YYCURSOR;
YYDEBUG(188, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1493 "Zend/zend_language_scanner.l"
+#line 1497 "Zend/zend_language_scanner.l"
{
return T_MOD_EQUAL;
}
-#line 3271 "Zend/zend_language_scanner.c"
+#line 3275 "Zend/zend_language_scanner.c"
yy189:
YYDEBUG(189, *YYCURSOR);
yyaccept = 4;
@@ -3276,7 +3280,7 @@ yy189:
yy190:
YYDEBUG(190, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1893 "Zend/zend_language_scanner.l"
+#line 1897 "Zend/zend_language_scanner.l"
{
int doc_com;
@@ -3309,7 +3313,7 @@ yy190:
return T_COMMENT;
}
-#line 3313 "Zend/zend_language_scanner.c"
+#line 3317 "Zend/zend_language_scanner.c"
yy191:
YYDEBUG(191, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3319,11 +3323,11 @@ yy192:
++YYCURSOR;
YYDEBUG(193, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1485 "Zend/zend_language_scanner.l"
+#line 1489 "Zend/zend_language_scanner.l"
{
return T_DIV_EQUAL;
}
-#line 3327 "Zend/zend_language_scanner.c"
+#line 3331 "Zend/zend_language_scanner.c"
yy194:
YYDEBUG(194, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3347,62 +3351,62 @@ yy197:
if ((yych = *YYCURSOR) == '=') goto yy201;
YYDEBUG(198, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1477 "Zend/zend_language_scanner.l"
+#line 1481 "Zend/zend_language_scanner.l"
{
return T_POW;
}
-#line 3355 "Zend/zend_language_scanner.c"
+#line 3359 "Zend/zend_language_scanner.c"
yy199:
YYDEBUG(199, *YYCURSOR);
++YYCURSOR;
YYDEBUG(200, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1473 "Zend/zend_language_scanner.l"
+#line 1477 "Zend/zend_language_scanner.l"
{
return T_MUL_EQUAL;
}
-#line 3365 "Zend/zend_language_scanner.c"
+#line 3369 "Zend/zend_language_scanner.c"
yy201:
YYDEBUG(201, *YYCURSOR);
++YYCURSOR;
YYDEBUG(202, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1481 "Zend/zend_language_scanner.l"
+#line 1485 "Zend/zend_language_scanner.l"
{
return T_POW_EQUAL;
}
-#line 3375 "Zend/zend_language_scanner.c"
+#line 3379 "Zend/zend_language_scanner.c"
yy203:
YYDEBUG(203, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) == '=') goto yy207;
YYDEBUG(204, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1541 "Zend/zend_language_scanner.l"
+#line 1545 "Zend/zend_language_scanner.l"
{
return T_SR;
}
-#line 3386 "Zend/zend_language_scanner.c"
+#line 3390 "Zend/zend_language_scanner.c"
yy205:
YYDEBUG(205, *YYCURSOR);
++YYCURSOR;
YYDEBUG(206, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1461 "Zend/zend_language_scanner.l"
+#line 1465 "Zend/zend_language_scanner.l"
{
return T_IS_GREATER_OR_EQUAL;
}
-#line 3396 "Zend/zend_language_scanner.c"
+#line 3400 "Zend/zend_language_scanner.c"
yy207:
YYDEBUG(207, *YYCURSOR);
++YYCURSOR;
YYDEBUG(208, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1501 "Zend/zend_language_scanner.l"
+#line 1505 "Zend/zend_language_scanner.l"
{
return T_SR_EQUAL;
}
-#line 3406 "Zend/zend_language_scanner.c"
+#line 3410 "Zend/zend_language_scanner.c"
yy209:
YYDEBUG(209, *YYCURSOR);
yyaccept = 5;
@@ -3413,53 +3417,53 @@ yy209:
yy210:
YYDEBUG(210, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1537 "Zend/zend_language_scanner.l"
+#line 1541 "Zend/zend_language_scanner.l"
{
return T_SL;
}
-#line 3421 "Zend/zend_language_scanner.c"
+#line 3425 "Zend/zend_language_scanner.c"
yy211:
YYDEBUG(211, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) == '>') goto yy215;
YYDEBUG(212, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1457 "Zend/zend_language_scanner.l"
+#line 1461 "Zend/zend_language_scanner.l"
{
return T_IS_SMALLER_OR_EQUAL;
}
-#line 3432 "Zend/zend_language_scanner.c"
+#line 3436 "Zend/zend_language_scanner.c"
yy213:
YYDEBUG(213, *YYCURSOR);
++YYCURSOR;
yy214:
YYDEBUG(214, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1449 "Zend/zend_language_scanner.l"
+#line 1453 "Zend/zend_language_scanner.l"
{
return T_IS_NOT_EQUAL;
}
-#line 3443 "Zend/zend_language_scanner.c"
+#line 3447 "Zend/zend_language_scanner.c"
yy215:
YYDEBUG(215, *YYCURSOR);
++YYCURSOR;
YYDEBUG(216, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1453 "Zend/zend_language_scanner.l"
+#line 1457 "Zend/zend_language_scanner.l"
{
return T_SPACESHIP;
}
-#line 3453 "Zend/zend_language_scanner.c"
+#line 3457 "Zend/zend_language_scanner.c"
yy217:
YYDEBUG(217, *YYCURSOR);
++YYCURSOR;
YYDEBUG(218, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1497 "Zend/zend_language_scanner.l"
+#line 1501 "Zend/zend_language_scanner.l"
{
return T_SL_EQUAL;
}
-#line 3463 "Zend/zend_language_scanner.c"
+#line 3467 "Zend/zend_language_scanner.c"
yy219:
YYDEBUG(219, *YYCURSOR);
++YYCURSOR;
@@ -3564,7 +3568,7 @@ yy228:
yy229:
YYDEBUG(229, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2045 "Zend/zend_language_scanner.l"
+#line 2049 "Zend/zend_language_scanner.l"
{
char *s;
int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -3611,7 +3615,7 @@ yy229:
return T_START_HEREDOC;
}
-#line 3615 "Zend/zend_language_scanner.c"
+#line 3619 "Zend/zend_language_scanner.c"
yy230:
YYDEBUG(230, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3651,31 +3655,31 @@ yy233:
++YYCURSOR;
YYDEBUG(235, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1441 "Zend/zend_language_scanner.l"
+#line 1445 "Zend/zend_language_scanner.l"
{
return T_IS_NOT_IDENTICAL;
}
-#line 3659 "Zend/zend_language_scanner.c"
+#line 3663 "Zend/zend_language_scanner.c"
yy236:
YYDEBUG(236, *YYCURSOR);
++YYCURSOR;
YYDEBUG(237, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1465 "Zend/zend_language_scanner.l"
+#line 1469 "Zend/zend_language_scanner.l"
{
return T_PLUS_EQUAL;
}
-#line 3669 "Zend/zend_language_scanner.c"
+#line 3673 "Zend/zend_language_scanner.c"
yy238:
YYDEBUG(238, *YYCURSOR);
++YYCURSOR;
YYDEBUG(239, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1429 "Zend/zend_language_scanner.l"
+#line 1433 "Zend/zend_language_scanner.l"
{
return T_INC;
}
-#line 3679 "Zend/zend_language_scanner.c"
+#line 3683 "Zend/zend_language_scanner.c"
yy240:
YYDEBUG(240, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3694,42 +3698,42 @@ yy242:
}
YYDEBUG(243, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1417 "Zend/zend_language_scanner.l"
+#line 1421 "Zend/zend_language_scanner.l"
{
return T_LIST;
}
-#line 3702 "Zend/zend_language_scanner.c"
+#line 3706 "Zend/zend_language_scanner.c"
yy244:
YYDEBUG(244, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) == '=') goto yy248;
YYDEBUG(245, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1445 "Zend/zend_language_scanner.l"
+#line 1449 "Zend/zend_language_scanner.l"
{
return T_IS_EQUAL;
}
-#line 3713 "Zend/zend_language_scanner.c"
+#line 3717 "Zend/zend_language_scanner.c"
yy246:
YYDEBUG(246, *YYCURSOR);
++YYCURSOR;
YYDEBUG(247, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1413 "Zend/zend_language_scanner.l"
+#line 1417 "Zend/zend_language_scanner.l"
{
return T_DOUBLE_ARROW;
}
-#line 3723 "Zend/zend_language_scanner.c"
+#line 3727 "Zend/zend_language_scanner.c"
yy248:
YYDEBUG(248, *YYCURSOR);
++YYCURSOR;
YYDEBUG(249, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1441 "Zend/zend_language_scanner.l"
{
return T_IS_IDENTICAL;
}
-#line 3733 "Zend/zend_language_scanner.c"
+#line 3737 "Zend/zend_language_scanner.c"
yy250:
YYDEBUG(250, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3859,11 +3863,11 @@ yy266:
}
YYDEBUG(269, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1743 "Zend/zend_language_scanner.l"
+#line 1747 "Zend/zend_language_scanner.l"
{
return T_NS_C;
}
-#line 3867 "Zend/zend_language_scanner.c"
+#line 3871 "Zend/zend_language_scanner.c"
yy270:
YYDEBUG(270, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3883,11 +3887,11 @@ yy271:
}
YYDEBUG(274, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1739 "Zend/zend_language_scanner.l"
+#line 1743 "Zend/zend_language_scanner.l"
{
return T_DIR;
}
-#line 3891 "Zend/zend_language_scanner.c"
+#line 3895 "Zend/zend_language_scanner.c"
yy275:
YYDEBUG(275, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3912,11 +3916,11 @@ yy277:
}
YYDEBUG(280, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1731 "Zend/zend_language_scanner.l"
+#line 1735 "Zend/zend_language_scanner.l"
{
return T_LINE;
}
-#line 3920 "Zend/zend_language_scanner.c"
+#line 3924 "Zend/zend_language_scanner.c"
yy281:
YYDEBUG(281, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3951,11 +3955,11 @@ yy285:
}
YYDEBUG(288, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1727 "Zend/zend_language_scanner.l"
+#line 1731 "Zend/zend_language_scanner.l"
{
return T_METHOD_C;
}
-#line 3959 "Zend/zend_language_scanner.c"
+#line 3963 "Zend/zend_language_scanner.c"
yy289:
YYDEBUG(289, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4006,11 +4010,11 @@ yy296:
}
YYDEBUG(299, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1723 "Zend/zend_language_scanner.l"
+#line 1727 "Zend/zend_language_scanner.l"
{
return T_FUNC_C;
}
-#line 4014 "Zend/zend_language_scanner.c"
+#line 4018 "Zend/zend_language_scanner.c"
yy300:
YYDEBUG(300, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4030,11 +4034,11 @@ yy301:
}
YYDEBUG(304, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1735 "Zend/zend_language_scanner.l"
+#line 1739 "Zend/zend_language_scanner.l"
{
return T_FILE;
}
-#line 4038 "Zend/zend_language_scanner.c"
+#line 4042 "Zend/zend_language_scanner.c"
yy305:
YYDEBUG(305, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4064,11 +4068,11 @@ yy308:
}
YYDEBUG(311, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1719 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
return T_TRAIT_C;
}
-#line 4072 "Zend/zend_language_scanner.c"
+#line 4076 "Zend/zend_language_scanner.c"
yy312:
YYDEBUG(312, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4098,11 +4102,11 @@ yy315:
}
YYDEBUG(318, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1715 "Zend/zend_language_scanner.l"
+#line 1719 "Zend/zend_language_scanner.l"
{
return T_CLASS_C;
}
-#line 4106 "Zend/zend_language_scanner.c"
+#line 4110 "Zend/zend_language_scanner.c"
yy319:
YYDEBUG(319, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4164,11 +4168,11 @@ yy330:
}
YYDEBUG(331, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1381 "Zend/zend_language_scanner.l"
+#line 1385 "Zend/zend_language_scanner.l"
{
return T_HALT_COMPILER;
}
-#line 4172 "Zend/zend_language_scanner.c"
+#line 4176 "Zend/zend_language_scanner.c"
yy332:
YYDEBUG(332, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4188,11 +4192,11 @@ yy334:
}
YYDEBUG(335, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1361 "Zend/zend_language_scanner.l"
+#line 1365 "Zend/zend_language_scanner.l"
{
return T_USE;
}
-#line 4196 "Zend/zend_language_scanner.c"
+#line 4200 "Zend/zend_language_scanner.c"
yy336:
YYDEBUG(336, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4211,11 +4215,11 @@ yy338:
}
YYDEBUG(339, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1409 "Zend/zend_language_scanner.l"
+#line 1413 "Zend/zend_language_scanner.l"
{
return T_UNSET;
}
-#line 4219 "Zend/zend_language_scanner.c"
+#line 4223 "Zend/zend_language_scanner.c"
yy340:
YYDEBUG(340, *YYCURSOR);
++YYCURSOR;
@@ -4387,11 +4391,11 @@ yy355:
++YYCURSOR;
YYDEBUG(357, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1309 "Zend/zend_language_scanner.l"
+#line 1313 "Zend/zend_language_scanner.l"
{
return T_INT_CAST;
}
-#line 4395 "Zend/zend_language_scanner.c"
+#line 4399 "Zend/zend_language_scanner.c"
yy358:
YYDEBUG(358, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4435,11 +4439,11 @@ yy363:
++YYCURSOR;
YYDEBUG(366, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1313 "Zend/zend_language_scanner.l"
+#line 1317 "Zend/zend_language_scanner.l"
{
return T_DOUBLE_CAST;
}
-#line 4443 "Zend/zend_language_scanner.c"
+#line 4447 "Zend/zend_language_scanner.c"
yy367:
YYDEBUG(367, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4509,11 +4513,11 @@ yy377:
++YYCURSOR;
YYDEBUG(380, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1317 "Zend/zend_language_scanner.l"
+#line 1321 "Zend/zend_language_scanner.l"
{
return T_STRING_CAST;
}
-#line 4517 "Zend/zend_language_scanner.c"
+#line 4521 "Zend/zend_language_scanner.c"
yy381:
YYDEBUG(381, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4546,11 +4550,11 @@ yy384:
++YYCURSOR;
YYDEBUG(387, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1321 "Zend/zend_language_scanner.l"
+#line 1325 "Zend/zend_language_scanner.l"
{
return T_ARRAY_CAST;
}
-#line 4554 "Zend/zend_language_scanner.c"
+#line 4558 "Zend/zend_language_scanner.c"
yy388:
YYDEBUG(388, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4588,11 +4592,11 @@ yy392:
++YYCURSOR;
YYDEBUG(395, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1325 "Zend/zend_language_scanner.l"
+#line 1329 "Zend/zend_language_scanner.l"
{
return T_OBJECT_CAST;
}
-#line 4596 "Zend/zend_language_scanner.c"
+#line 4600 "Zend/zend_language_scanner.c"
yy396:
YYDEBUG(396, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4633,11 +4637,11 @@ yy401:
++YYCURSOR;
YYDEBUG(403, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1329 "Zend/zend_language_scanner.l"
+#line 1333 "Zend/zend_language_scanner.l"
{
return T_BOOL_CAST;
}
-#line 4641 "Zend/zend_language_scanner.c"
+#line 4645 "Zend/zend_language_scanner.c"
yy404:
YYDEBUG(404, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4697,11 +4701,11 @@ yy412:
++YYCURSOR;
YYDEBUG(415, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1333 "Zend/zend_language_scanner.l"
+#line 1337 "Zend/zend_language_scanner.l"
{
return T_UNSET_CAST;
}
-#line 4705 "Zend/zend_language_scanner.c"
+#line 4709 "Zend/zend_language_scanner.c"
yy416:
YYDEBUG(416, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4715,11 +4719,11 @@ yy417:
}
YYDEBUG(418, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1305 "Zend/zend_language_scanner.l"
+#line 1309 "Zend/zend_language_scanner.l"
{
return T_VAR;
}
-#line 4723 "Zend/zend_language_scanner.c"
+#line 4727 "Zend/zend_language_scanner.c"
yy419:
YYDEBUG(419, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4739,11 +4743,11 @@ yy421:
}
YYDEBUG(422, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1297 "Zend/zend_language_scanner.l"
+#line 1301 "Zend/zend_language_scanner.l"
{
return T_NEW;
}
-#line 4747 "Zend/zend_language_scanner.c"
+#line 4751 "Zend/zend_language_scanner.c"
yy423:
YYDEBUG(423, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4782,11 +4786,11 @@ yy429:
}
YYDEBUG(430, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1357 "Zend/zend_language_scanner.l"
+#line 1361 "Zend/zend_language_scanner.l"
{
return T_NAMESPACE;
}
-#line 4790 "Zend/zend_language_scanner.c"
+#line 4794 "Zend/zend_language_scanner.c"
yy431:
YYDEBUG(431, *YYCURSOR);
++YYCURSOR;
@@ -4795,22 +4799,22 @@ yy431:
yy432:
YYDEBUG(432, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1926 "Zend/zend_language_scanner.l"
+#line 1930 "Zend/zend_language_scanner.l"
{
BEGIN(INITIAL);
return T_CLOSE_TAG; /* implicit ';' at php-end tag */
}
-#line 4804 "Zend/zend_language_scanner.c"
+#line 4808 "Zend/zend_language_scanner.c"
yy433:
YYDEBUG(433, *YYCURSOR);
++YYCURSOR;
YYDEBUG(434, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1293 "Zend/zend_language_scanner.l"
+#line 1297 "Zend/zend_language_scanner.l"
{
return T_COALESCE;
}
-#line 4814 "Zend/zend_language_scanner.c"
+#line 4818 "Zend/zend_language_scanner.c"
yy435:
YYDEBUG(435, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4841,11 +4845,11 @@ yy439:
++YYCURSOR;
YYDEBUG(440, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1489 "Zend/zend_language_scanner.l"
+#line 1493 "Zend/zend_language_scanner.l"
{
return T_CONCAT_EQUAL;
}
-#line 4849 "Zend/zend_language_scanner.c"
+#line 4853 "Zend/zend_language_scanner.c"
yy441:
YYDEBUG(441, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4854,21 +4858,21 @@ yy441:
++YYCURSOR;
YYDEBUG(443, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1289 "Zend/zend_language_scanner.l"
+#line 1293 "Zend/zend_language_scanner.l"
{
return T_ELLIPSIS;
}
-#line 4862 "Zend/zend_language_scanner.c"
+#line 4866 "Zend/zend_language_scanner.c"
yy444:
YYDEBUG(444, *YYCURSOR);
++YYCURSOR;
YYDEBUG(445, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1281 "Zend/zend_language_scanner.l"
+#line 1285 "Zend/zend_language_scanner.l"
{
return T_PAAMAYIM_NEKUDOTAYIM;
}
-#line 4872 "Zend/zend_language_scanner.c"
+#line 4876 "Zend/zend_language_scanner.c"
yy446:
YYDEBUG(446, *YYCURSOR);
++YYCURSOR;
@@ -4890,32 +4894,32 @@ yy448:
++YYCURSOR;
YYDEBUG(449, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1473 "Zend/zend_language_scanner.l"
{
return T_MINUS_EQUAL;
}
-#line 4898 "Zend/zend_language_scanner.c"
+#line 4902 "Zend/zend_language_scanner.c"
yy450:
YYDEBUG(450, *YYCURSOR);
++YYCURSOR;
YYDEBUG(451, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1433 "Zend/zend_language_scanner.l"
+#line 1437 "Zend/zend_language_scanner.l"
{
return T_DEC;
}
-#line 4908 "Zend/zend_language_scanner.c"
+#line 4912 "Zend/zend_language_scanner.c"
yy452:
YYDEBUG(452, *YYCURSOR);
++YYCURSOR;
YYDEBUG(453, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1255 "Zend/zend_language_scanner.l"
+#line 1259 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_PROPERTY);
return T_OBJECT_OPERATOR;
}
-#line 4919 "Zend/zend_language_scanner.c"
+#line 4923 "Zend/zend_language_scanner.c"
yy454:
YYDEBUG(454, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4960,11 +4964,11 @@ yy459:
}
YYDEBUG(460, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1405 "Zend/zend_language_scanner.l"
+#line 1409 "Zend/zend_language_scanner.l"
{
return T_PUBLIC;
}
-#line 4968 "Zend/zend_language_scanner.c"
+#line 4972 "Zend/zend_language_scanner.c"
yy461:
YYDEBUG(461, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5019,11 +5023,11 @@ yy468:
}
YYDEBUG(469, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1401 "Zend/zend_language_scanner.l"
+#line 1405 "Zend/zend_language_scanner.l"
{
return T_PROTECTED;
}
-#line 5027 "Zend/zend_language_scanner.c"
+#line 5031 "Zend/zend_language_scanner.c"
yy470:
YYDEBUG(470, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5053,11 +5057,11 @@ yy474:
}
YYDEBUG(475, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1397 "Zend/zend_language_scanner.l"
+#line 1401 "Zend/zend_language_scanner.l"
{
return T_PRIVATE;
}
-#line 5061 "Zend/zend_language_scanner.c"
+#line 5065 "Zend/zend_language_scanner.c"
yy476:
YYDEBUG(476, *YYCURSOR);
++YYCURSOR;
@@ -5066,11 +5070,11 @@ yy476:
}
YYDEBUG(477, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1231 "Zend/zend_language_scanner.l"
+#line 1235 "Zend/zend_language_scanner.l"
{
return T_PRINT;
}
-#line 5074 "Zend/zend_language_scanner.c"
+#line 5078 "Zend/zend_language_scanner.c"
yy478:
YYDEBUG(478, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5095,11 +5099,11 @@ yy481:
}
YYDEBUG(482, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1223 "Zend/zend_language_scanner.l"
+#line 1227 "Zend/zend_language_scanner.l"
{
return T_GOTO;
}
-#line 5103 "Zend/zend_language_scanner.c"
+#line 5107 "Zend/zend_language_scanner.c"
yy483:
YYDEBUG(483, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5123,11 +5127,11 @@ yy486:
}
YYDEBUG(487, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1369 "Zend/zend_language_scanner.l"
+#line 1373 "Zend/zend_language_scanner.l"
{
return T_GLOBAL;
}
-#line 5131 "Zend/zend_language_scanner.c"
+#line 5135 "Zend/zend_language_scanner.c"
yy488:
YYDEBUG(488, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5164,11 +5168,11 @@ yy494:
}
YYDEBUG(495, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1215 "Zend/zend_language_scanner.l"
+#line 1219 "Zend/zend_language_scanner.l"
{
return T_BREAK;
}
-#line 5172 "Zend/zend_language_scanner.c"
+#line 5176 "Zend/zend_language_scanner.c"
yy496:
YYDEBUG(496, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5208,11 +5212,11 @@ yy502:
}
YYDEBUG(503, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1199 "Zend/zend_language_scanner.l"
+#line 1203 "Zend/zend_language_scanner.l"
{
return T_SWITCH;
}
-#line 5216 "Zend/zend_language_scanner.c"
+#line 5220 "Zend/zend_language_scanner.c"
yy504:
YYDEBUG(504, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5236,11 +5240,11 @@ yy507:
}
YYDEBUG(508, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1385 "Zend/zend_language_scanner.l"
+#line 1389 "Zend/zend_language_scanner.l"
{
return T_STATIC;
}
-#line 5244 "Zend/zend_language_scanner.c"
+#line 5248 "Zend/zend_language_scanner.c"
yy509:
YYDEBUG(509, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5267,11 +5271,11 @@ yy512:
}
YYDEBUG(513, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1195 "Zend/zend_language_scanner.l"
+#line 1199 "Zend/zend_language_scanner.l"
{
return T_AS;
}
-#line 5275 "Zend/zend_language_scanner.c"
+#line 5279 "Zend/zend_language_scanner.c"
yy514:
YYDEBUG(514, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5290,11 +5294,11 @@ yy516:
}
YYDEBUG(517, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1421 "Zend/zend_language_scanner.l"
+#line 1425 "Zend/zend_language_scanner.l"
{
return T_ARRAY;
}
-#line 5298 "Zend/zend_language_scanner.c"
+#line 5302 "Zend/zend_language_scanner.c"
yy518:
YYDEBUG(518, *YYCURSOR);
++YYCURSOR;
@@ -5303,11 +5307,11 @@ yy518:
}
YYDEBUG(519, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1529 "Zend/zend_language_scanner.l"
+#line 1533 "Zend/zend_language_scanner.l"
{
return T_LOGICAL_AND;
}
-#line 5311 "Zend/zend_language_scanner.c"
+#line 5315 "Zend/zend_language_scanner.c"
yy520:
YYDEBUG(520, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5341,11 +5345,11 @@ yy525:
}
YYDEBUG(526, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1389 "Zend/zend_language_scanner.l"
+#line 1393 "Zend/zend_language_scanner.l"
{
return T_ABSTRACT;
}
-#line 5349 "Zend/zend_language_scanner.c"
+#line 5353 "Zend/zend_language_scanner.c"
yy527:
YYDEBUG(527, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5369,11 +5373,11 @@ yy530:
}
YYDEBUG(531, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1155 "Zend/zend_language_scanner.l"
+#line 1159 "Zend/zend_language_scanner.l"
{
return T_WHILE;
}
-#line 5377 "Zend/zend_language_scanner.c"
+#line 5381 "Zend/zend_language_scanner.c"
yy532:
YYDEBUG(532, *YYCURSOR);
++YYCURSOR;
@@ -5382,11 +5386,11 @@ yy532:
}
YYDEBUG(533, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1139 "Zend/zend_language_scanner.l"
+#line 1143 "Zend/zend_language_scanner.l"
{
return T_IF;
}
-#line 5390 "Zend/zend_language_scanner.c"
+#line 5394 "Zend/zend_language_scanner.c"
yy534:
YYDEBUG(534, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5438,11 +5442,11 @@ yy539:
}
YYDEBUG(540, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1373 "Zend/zend_language_scanner.l"
+#line 1377 "Zend/zend_language_scanner.l"
{
return T_ISSET;
}
-#line 5446 "Zend/zend_language_scanner.c"
+#line 5450 "Zend/zend_language_scanner.c"
yy541:
YYDEBUG(541, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5496,11 +5500,11 @@ yy547:
yy548:
YYDEBUG(548, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1341 "Zend/zend_language_scanner.l"
+#line 1345 "Zend/zend_language_scanner.l"
{
return T_INCLUDE;
}
-#line 5504 "Zend/zend_language_scanner.c"
+#line 5508 "Zend/zend_language_scanner.c"
yy549:
YYDEBUG(549, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5529,11 +5533,11 @@ yy553:
}
YYDEBUG(554, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1345 "Zend/zend_language_scanner.l"
+#line 1349 "Zend/zend_language_scanner.l"
{
return T_INCLUDE_ONCE;
}
-#line 5537 "Zend/zend_language_scanner.c"
+#line 5541 "Zend/zend_language_scanner.c"
yy555:
YYDEBUG(555, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5567,11 +5571,11 @@ yy560:
}
YYDEBUG(561, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1239 "Zend/zend_language_scanner.l"
+#line 1243 "Zend/zend_language_scanner.l"
{
return T_INTERFACE;
}
-#line 5575 "Zend/zend_language_scanner.c"
+#line 5579 "Zend/zend_language_scanner.c"
yy562:
YYDEBUG(562, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5621,11 +5625,11 @@ yy568:
}
YYDEBUG(569, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1365 "Zend/zend_language_scanner.l"
+#line 1369 "Zend/zend_language_scanner.l"
{
return T_INSTEADOF;
}
-#line 5629 "Zend/zend_language_scanner.c"
+#line 5633 "Zend/zend_language_scanner.c"
yy570:
YYDEBUG(570, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5654,11 +5658,11 @@ yy574:
}
YYDEBUG(575, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1191 "Zend/zend_language_scanner.l"
+#line 1195 "Zend/zend_language_scanner.l"
{
return T_INSTANCEOF;
}
-#line 5662 "Zend/zend_language_scanner.c"
+#line 5666 "Zend/zend_language_scanner.c"
yy576:
YYDEBUG(576, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5702,11 +5706,11 @@ yy583:
}
YYDEBUG(584, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1251 "Zend/zend_language_scanner.l"
+#line 1255 "Zend/zend_language_scanner.l"
{
return T_IMPLEMENTS;
}
-#line 5710 "Zend/zend_language_scanner.c"
+#line 5714 "Zend/zend_language_scanner.c"
yy585:
YYDEBUG(585, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5734,11 +5738,11 @@ yy586:
}
YYDEBUG(588, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1123 "Zend/zend_language_scanner.l"
+#line 1127 "Zend/zend_language_scanner.l"
{
return T_TRY;
}
-#line 5742 "Zend/zend_language_scanner.c"
+#line 5746 "Zend/zend_language_scanner.c"
yy589:
YYDEBUG(589, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5757,11 +5761,11 @@ yy591:
}
YYDEBUG(592, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1243 "Zend/zend_language_scanner.l"
+#line 1247 "Zend/zend_language_scanner.l"
{
return T_TRAIT;
}
-#line 5765 "Zend/zend_language_scanner.c"
+#line 5769 "Zend/zend_language_scanner.c"
yy593:
YYDEBUG(593, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5780,11 +5784,11 @@ yy595:
}
YYDEBUG(596, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1135 "Zend/zend_language_scanner.l"
+#line 1139 "Zend/zend_language_scanner.l"
{
return T_THROW;
}
-#line 5788 "Zend/zend_language_scanner.c"
+#line 5792 "Zend/zend_language_scanner.c"
yy597:
YYDEBUG(597, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5802,1081 +5806,1136 @@ yy599:
if (yych != 'd') goto yy150;
yy600:
YYDEBUG(600, *YYCURSOR);
- ++YYCURSOR;
- if (yybm[0+(yych = *YYCURSOR)] & 4) {
+ yyaccept = 6;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yybm[0+yych] & 4) {
goto yy149;
}
+ if (yych <= '\f') {
+ if (yych <= 0x08) goto yy601;
+ if (yych <= '\n') goto yy602;
+ } else {
+ if (yych <= '\r') goto yy602;
+ if (yych == ' ') goto yy602;
+ }
+yy601:
YYDEBUG(601, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1119 "Zend/zend_language_scanner.l"
+#line 1123 "Zend/zend_language_scanner.l"
{
return T_YIELD;
}
-#line 5816 "Zend/zend_language_scanner.c"
+#line 5829 "Zend/zend_language_scanner.c"
yy602:
YYDEBUG(602, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(4);
+ yych = *YYCURSOR;
+ YYDEBUG(603, *YYCURSOR);
+ if (yych <= 0x1F) {
+ if (yych <= '\n') {
+ if (yych <= 0x08) goto yy157;
+ goto yy602;
+ } else {
+ if (yych == '\r') goto yy602;
+ goto yy157;
+ }
+ } else {
+ if (yych <= 'F') {
+ if (yych <= ' ') goto yy602;
+ if (yych <= 'E') goto yy157;
+ } else {
+ if (yych != 'f') goto yy157;
+ }
+ }
+ YYDEBUG(604, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == 'R') goto yy605;
+ if (yych != 'r') goto yy157;
+yy605:
+ YYDEBUG(605, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy606;
+ if (yych != 'o') goto yy157;
+yy606:
+ YYDEBUG(606, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy607;
+ if (yych != 'm') goto yy157;
+yy607:
+ YYDEBUG(607, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(608, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 1119 "Zend/zend_language_scanner.l"
+ {
+ return T_YIELD_FROM;
+}
+#line 5875 "Zend/zend_language_scanner.c"
+yy609:
+ YYDEBUG(609, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'T') {
- if (yych == 'Q') goto yy604;
+ if (yych == 'Q') goto yy611;
if (yych <= 'S') goto yy150;
} else {
if (yych <= 'q') {
if (yych <= 'p') goto yy150;
- goto yy604;
+ goto yy611;
} else {
if (yych != 't') goto yy150;
}
}
- YYDEBUG(603, *YYCURSOR);
+ YYDEBUG(610, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'U') goto yy616;
- if (yych == 'u') goto yy616;
+ if (yych == 'U') goto yy623;
+ if (yych == 'u') goto yy623;
goto yy150;
-yy604:
- YYDEBUG(604, *YYCURSOR);
+yy611:
+ YYDEBUG(611, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'U') goto yy605;
+ if (yych == 'U') goto yy612;
if (yych != 'u') goto yy150;
-yy605:
- YYDEBUG(605, *YYCURSOR);
+yy612:
+ YYDEBUG(612, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'I') goto yy606;
+ if (yych == 'I') goto yy613;
if (yych != 'i') goto yy150;
-yy606:
- YYDEBUG(606, *YYCURSOR);
+yy613:
+ YYDEBUG(613, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy607;
+ if (yych == 'R') goto yy614;
if (yych != 'r') goto yy150;
-yy607:
- YYDEBUG(607, *YYCURSOR);
+yy614:
+ YYDEBUG(614, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy608;
+ if (yych == 'E') goto yy615;
if (yych != 'e') goto yy150;
-yy608:
- YYDEBUG(608, *YYCURSOR);
+yy615:
+ YYDEBUG(615, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '^') {
if (yych <= '9') {
if (yych >= '0') goto yy149;
} else {
- if (yych <= '@') goto yy609;
+ if (yych <= '@') goto yy616;
if (yych <= 'Z') goto yy149;
}
} else {
if (yych <= '`') {
- if (yych <= '_') goto yy610;
+ if (yych <= '_') goto yy617;
} else {
if (yych <= 'z') goto yy149;
if (yych >= 0x7F) goto yy149;
}
}
-yy609:
- YYDEBUG(609, *YYCURSOR);
+yy616:
+ YYDEBUG(616, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1349 "Zend/zend_language_scanner.l"
+#line 1353 "Zend/zend_language_scanner.l"
{
return T_REQUIRE;
}
-#line 5881 "Zend/zend_language_scanner.c"
-yy610:
- YYDEBUG(610, *YYCURSOR);
+#line 5940 "Zend/zend_language_scanner.c"
+yy617:
+ YYDEBUG(617, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'O') goto yy611;
+ if (yych == 'O') goto yy618;
if (yych != 'o') goto yy150;
-yy611:
- YYDEBUG(611, *YYCURSOR);
+yy618:
+ YYDEBUG(618, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy612;
+ if (yych == 'N') goto yy619;
if (yych != 'n') goto yy150;
-yy612:
- YYDEBUG(612, *YYCURSOR);
+yy619:
+ YYDEBUG(619, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy613;
+ if (yych == 'C') goto yy620;
if (yych != 'c') goto yy150;
-yy613:
- YYDEBUG(613, *YYCURSOR);
+yy620:
+ YYDEBUG(620, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy614;
+ if (yych == 'E') goto yy621;
if (yych != 'e') goto yy150;
-yy614:
- YYDEBUG(614, *YYCURSOR);
+yy621:
+ YYDEBUG(621, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(615, *YYCURSOR);
+ YYDEBUG(622, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1353 "Zend/zend_language_scanner.l"
+#line 1357 "Zend/zend_language_scanner.l"
{
return T_REQUIRE_ONCE;
}
-#line 5914 "Zend/zend_language_scanner.c"
-yy616:
- YYDEBUG(616, *YYCURSOR);
+#line 5973 "Zend/zend_language_scanner.c"
+yy623:
+ YYDEBUG(623, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy617;
+ if (yych == 'R') goto yy624;
if (yych != 'r') goto yy150;
-yy617:
- YYDEBUG(617, *YYCURSOR);
+yy624:
+ YYDEBUG(624, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy618;
+ if (yych == 'N') goto yy625;
if (yych != 'n') goto yy150;
-yy618:
- YYDEBUG(618, *YYCURSOR);
+yy625:
+ YYDEBUG(625, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(619, *YYCURSOR);
+ YYDEBUG(626, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
#line 1115 "Zend/zend_language_scanner.l"
{
return T_RETURN;
}
-#line 5937 "Zend/zend_language_scanner.c"
-yy620:
- YYDEBUG(620, *YYCURSOR);
+#line 5996 "Zend/zend_language_scanner.c"
+yy627:
+ YYDEBUG(627, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'T') {
if (yych <= 'L') {
if (yych <= 'K') goto yy150;
- goto yy643;
+ goto yy650;
} else {
if (yych <= 'R') goto yy150;
- if (yych <= 'S') goto yy642;
- goto yy641;
+ if (yych <= 'S') goto yy649;
+ goto yy648;
}
} else {
if (yych <= 'r') {
- if (yych == 'l') goto yy643;
+ if (yych == 'l') goto yy650;
goto yy150;
} else {
- if (yych <= 's') goto yy642;
- if (yych <= 't') goto yy641;
+ if (yych <= 's') goto yy649;
+ if (yych <= 't') goto yy648;
goto yy150;
}
}
-yy621:
- YYDEBUG(621, *YYCURSOR);
+yy628:
+ YYDEBUG(628, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'O') {
- if (yych == 'A') goto yy633;
+ if (yych == 'A') goto yy640;
if (yych <= 'N') goto yy150;
- goto yy634;
+ goto yy641;
} else {
if (yych <= 'a') {
if (yych <= '`') goto yy150;
- goto yy633;
+ goto yy640;
} else {
- if (yych == 'o') goto yy634;
+ if (yych == 'o') goto yy641;
goto yy150;
}
}
-yy622:
- YYDEBUG(622, *YYCURSOR);
+yy629:
+ YYDEBUG(629, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy623;
+ if (yych == 'N') goto yy630;
if (yych != 'n') goto yy150;
-yy623:
- YYDEBUG(623, *YYCURSOR);
+yy630:
+ YYDEBUG(630, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'T') {
if (yych <= 'R') goto yy150;
- if (yych >= 'T') goto yy625;
+ if (yych >= 'T') goto yy632;
} else {
if (yych <= 'r') goto yy150;
- if (yych <= 's') goto yy624;
- if (yych <= 't') goto yy625;
+ if (yych <= 's') goto yy631;
+ if (yych <= 't') goto yy632;
goto yy150;
}
-yy624:
- YYDEBUG(624, *YYCURSOR);
+yy631:
+ YYDEBUG(631, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy631;
- if (yych == 't') goto yy631;
+ if (yych == 'T') goto yy638;
+ if (yych == 't') goto yy638;
goto yy150;
-yy625:
- YYDEBUG(625, *YYCURSOR);
+yy632:
+ YYDEBUG(632, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'I') goto yy626;
+ if (yych == 'I') goto yy633;
if (yych != 'i') goto yy150;
-yy626:
- YYDEBUG(626, *YYCURSOR);
+yy633:
+ YYDEBUG(633, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy627;
+ if (yych == 'N') goto yy634;
if (yych != 'n') goto yy150;
-yy627:
- YYDEBUG(627, *YYCURSOR);
+yy634:
+ YYDEBUG(634, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'U') goto yy628;
+ if (yych == 'U') goto yy635;
if (yych != 'u') goto yy150;
-yy628:
- YYDEBUG(628, *YYCURSOR);
+yy635:
+ YYDEBUG(635, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy629;
+ if (yych == 'E') goto yy636;
if (yych != 'e') goto yy150;
-yy629:
- YYDEBUG(629, *YYCURSOR);
+yy636:
+ YYDEBUG(636, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(630, *YYCURSOR);
+ YYDEBUG(637, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1219 "Zend/zend_language_scanner.l"
+#line 1223 "Zend/zend_language_scanner.l"
{
return T_CONTINUE;
}
-#line 6031 "Zend/zend_language_scanner.c"
-yy631:
- YYDEBUG(631, *YYCURSOR);
+#line 6090 "Zend/zend_language_scanner.c"
+yy638:
+ YYDEBUG(638, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(632, *YYCURSOR);
+ YYDEBUG(639, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
#line 1111 "Zend/zend_language_scanner.l"
{
return T_CONST;
}
-#line 6044 "Zend/zend_language_scanner.c"
-yy633:
- YYDEBUG(633, *YYCURSOR);
+#line 6103 "Zend/zend_language_scanner.c"
+yy640:
+ YYDEBUG(640, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'S') goto yy638;
- if (yych == 's') goto yy638;
+ if (yych == 'S') goto yy645;
+ if (yych == 's') goto yy645;
goto yy150;
-yy634:
- YYDEBUG(634, *YYCURSOR);
+yy641:
+ YYDEBUG(641, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy635;
+ if (yych == 'N') goto yy642;
if (yych != 'n') goto yy150;
-yy635:
- YYDEBUG(635, *YYCURSOR);
+yy642:
+ YYDEBUG(642, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy636;
+ if (yych == 'E') goto yy643;
if (yych != 'e') goto yy150;
-yy636:
- YYDEBUG(636, *YYCURSOR);
+yy643:
+ YYDEBUG(643, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(637, *YYCURSOR);
+ YYDEBUG(644, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1301 "Zend/zend_language_scanner.l"
+#line 1305 "Zend/zend_language_scanner.l"
{
return T_CLONE;
}
-#line 6073 "Zend/zend_language_scanner.c"
-yy638:
- YYDEBUG(638, *YYCURSOR);
+#line 6132 "Zend/zend_language_scanner.c"
+yy645:
+ YYDEBUG(645, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'S') goto yy639;
+ if (yych == 'S') goto yy646;
if (yych != 's') goto yy150;
-yy639:
- YYDEBUG(639, *YYCURSOR);
+yy646:
+ YYDEBUG(646, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(640, *YYCURSOR);
+ YYDEBUG(647, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1235 "Zend/zend_language_scanner.l"
+#line 1239 "Zend/zend_language_scanner.l"
{
return T_CLASS;
}
-#line 6091 "Zend/zend_language_scanner.c"
-yy641:
- YYDEBUG(641, *YYCURSOR);
+#line 6150 "Zend/zend_language_scanner.c"
+yy648:
+ YYDEBUG(648, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy652;
- if (yych == 'c') goto yy652;
+ if (yych == 'C') goto yy659;
+ if (yych == 'c') goto yy659;
goto yy150;
-yy642:
- YYDEBUG(642, *YYCURSOR);
+yy649:
+ YYDEBUG(649, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy650;
- if (yych == 'e') goto yy650;
+ if (yych == 'E') goto yy657;
+ if (yych == 'e') goto yy657;
goto yy150;
-yy643:
- YYDEBUG(643, *YYCURSOR);
+yy650:
+ YYDEBUG(650, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy644;
+ if (yych == 'L') goto yy651;
if (yych != 'l') goto yy150;
-yy644:
- YYDEBUG(644, *YYCURSOR);
+yy651:
+ YYDEBUG(651, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy645;
+ if (yych == 'A') goto yy652;
if (yych != 'a') goto yy150;
-yy645:
- YYDEBUG(645, *YYCURSOR);
+yy652:
+ YYDEBUG(652, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'B') goto yy646;
+ if (yych == 'B') goto yy653;
if (yych != 'b') goto yy150;
-yy646:
- YYDEBUG(646, *YYCURSOR);
+yy653:
+ YYDEBUG(653, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy647;
+ if (yych == 'L') goto yy654;
if (yych != 'l') goto yy150;
-yy647:
- YYDEBUG(647, *YYCURSOR);
+yy654:
+ YYDEBUG(654, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy648;
+ if (yych == 'E') goto yy655;
if (yych != 'e') goto yy150;
-yy648:
- YYDEBUG(648, *YYCURSOR);
+yy655:
+ YYDEBUG(655, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(649, *YYCURSOR);
+ YYDEBUG(656, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1425 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
{
return T_CALLABLE;
}
-#line 6141 "Zend/zend_language_scanner.c"
-yy650:
- YYDEBUG(650, *YYCURSOR);
+#line 6200 "Zend/zend_language_scanner.c"
+yy657:
+ YYDEBUG(657, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(651, *YYCURSOR);
+ YYDEBUG(658, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1207 "Zend/zend_language_scanner.l"
+#line 1211 "Zend/zend_language_scanner.l"
{
return T_CASE;
}
-#line 6154 "Zend/zend_language_scanner.c"
-yy652:
- YYDEBUG(652, *YYCURSOR);
+#line 6213 "Zend/zend_language_scanner.c"
+yy659:
+ YYDEBUG(659, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy653;
+ if (yych == 'H') goto yy660;
if (yych != 'h') goto yy150;
-yy653:
- YYDEBUG(653, *YYCURSOR);
+yy660:
+ YYDEBUG(660, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(654, *YYCURSOR);
+ YYDEBUG(661, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1127 "Zend/zend_language_scanner.l"
+#line 1131 "Zend/zend_language_scanner.l"
{
return T_CATCH;
}
-#line 6172 "Zend/zend_language_scanner.c"
-yy655:
- YYDEBUG(655, *YYCURSOR);
+#line 6231 "Zend/zend_language_scanner.c"
+yy662:
+ YYDEBUG(662, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy672;
- if (yych == 'n') goto yy672;
+ if (yych == 'N') goto yy679;
+ if (yych == 'n') goto yy679;
goto yy150;
-yy656:
- YYDEBUG(656, *YYCURSOR);
+yy663:
+ YYDEBUG(663, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy665;
- if (yych == 'r') goto yy665;
+ if (yych == 'R') goto yy672;
+ if (yych == 'r') goto yy672;
goto yy150;
-yy657:
- YYDEBUG(657, *YYCURSOR);
+yy664:
+ YYDEBUG(664, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy658;
+ if (yych == 'N') goto yy665;
if (yych != 'n') goto yy150;
-yy658:
- YYDEBUG(658, *YYCURSOR);
+yy665:
+ YYDEBUG(665, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy659;
+ if (yych == 'C') goto yy666;
if (yych != 'c') goto yy150;
-yy659:
- YYDEBUG(659, *YYCURSOR);
+yy666:
+ YYDEBUG(666, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy660;
+ if (yych == 'T') goto yy667;
if (yych != 't') goto yy150;
-yy660:
- YYDEBUG(660, *YYCURSOR);
+yy667:
+ YYDEBUG(667, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'I') goto yy661;
+ if (yych == 'I') goto yy668;
if (yych != 'i') goto yy150;
-yy661:
- YYDEBUG(661, *YYCURSOR);
+yy668:
+ YYDEBUG(668, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'O') goto yy662;
+ if (yych == 'O') goto yy669;
if (yych != 'o') goto yy150;
-yy662:
- YYDEBUG(662, *YYCURSOR);
+yy669:
+ YYDEBUG(669, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy663;
+ if (yych == 'N') goto yy670;
if (yych != 'n') goto yy150;
-yy663:
- YYDEBUG(663, *YYCURSOR);
+yy670:
+ YYDEBUG(670, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(664, *YYCURSOR);
+ YYDEBUG(671, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
#line 1107 "Zend/zend_language_scanner.l"
{
return T_FUNCTION;
}
-#line 6227 "Zend/zend_language_scanner.c"
-yy665:
- YYDEBUG(665, *YYCURSOR);
+#line 6286 "Zend/zend_language_scanner.c"
+yy672:
+ YYDEBUG(672, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '^') {
if (yych <= '@') {
- if (yych <= '/') goto yy666;
+ if (yych <= '/') goto yy673;
if (yych <= '9') goto yy149;
} else {
- if (yych == 'E') goto yy667;
+ if (yych == 'E') goto yy674;
if (yych <= 'Z') goto yy149;
}
} else {
if (yych <= 'd') {
if (yych != '`') goto yy149;
} else {
- if (yych <= 'e') goto yy667;
+ if (yych <= 'e') goto yy674;
if (yych <= 'z') goto yy149;
if (yych >= 0x7F) goto yy149;
}
}
-yy666:
- YYDEBUG(666, *YYCURSOR);
+yy673:
+ YYDEBUG(673, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1167 "Zend/zend_language_scanner.l"
+#line 1171 "Zend/zend_language_scanner.l"
{
return T_FOR;
}
-#line 6255 "Zend/zend_language_scanner.c"
-yy667:
- YYDEBUG(667, *YYCURSOR);
+#line 6314 "Zend/zend_language_scanner.c"
+yy674:
+ YYDEBUG(674, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy668;
+ if (yych == 'A') goto yy675;
if (yych != 'a') goto yy150;
-yy668:
- YYDEBUG(668, *YYCURSOR);
+yy675:
+ YYDEBUG(675, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy669;
+ if (yych == 'C') goto yy676;
if (yych != 'c') goto yy150;
-yy669:
- YYDEBUG(669, *YYCURSOR);
+yy676:
+ YYDEBUG(676, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy670;
+ if (yych == 'H') goto yy677;
if (yych != 'h') goto yy150;
-yy670:
- YYDEBUG(670, *YYCURSOR);
+yy677:
+ YYDEBUG(677, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(671, *YYCURSOR);
+ YYDEBUG(678, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1175 "Zend/zend_language_scanner.l"
+#line 1179 "Zend/zend_language_scanner.l"
{
return T_FOREACH;
}
-#line 6283 "Zend/zend_language_scanner.c"
-yy672:
- YYDEBUG(672, *YYCURSOR);
+#line 6342 "Zend/zend_language_scanner.c"
+yy679:
+ YYDEBUG(679, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy673;
+ if (yych == 'A') goto yy680;
if (yych != 'a') goto yy150;
-yy673:
- YYDEBUG(673, *YYCURSOR);
+yy680:
+ YYDEBUG(680, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy674;
+ if (yych == 'L') goto yy681;
if (yych != 'l') goto yy150;
-yy674:
- YYDEBUG(674, *YYCURSOR);
+yy681:
+ YYDEBUG(681, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '^') {
if (yych <= '@') {
- if (yych <= '/') goto yy675;
+ if (yych <= '/') goto yy682;
if (yych <= '9') goto yy149;
} else {
- if (yych == 'L') goto yy676;
+ if (yych == 'L') goto yy683;
if (yych <= 'Z') goto yy149;
}
} else {
if (yych <= 'k') {
if (yych != '`') goto yy149;
} else {
- if (yych <= 'l') goto yy676;
+ if (yych <= 'l') goto yy683;
if (yych <= 'z') goto yy149;
if (yych >= 0x7F) goto yy149;
}
}
-yy675:
- YYDEBUG(675, *YYCURSOR);
+yy682:
+ YYDEBUG(682, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1393 "Zend/zend_language_scanner.l"
+#line 1397 "Zend/zend_language_scanner.l"
{
return T_FINAL;
}
-#line 6321 "Zend/zend_language_scanner.c"
-yy676:
- YYDEBUG(676, *YYCURSOR);
+#line 6380 "Zend/zend_language_scanner.c"
+yy683:
+ YYDEBUG(683, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'Y') goto yy677;
+ if (yych == 'Y') goto yy684;
if (yych != 'y') goto yy150;
-yy677:
- YYDEBUG(677, *YYCURSOR);
+yy684:
+ YYDEBUG(684, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(678, *YYCURSOR);
+ YYDEBUG(685, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1131 "Zend/zend_language_scanner.l"
+#line 1135 "Zend/zend_language_scanner.l"
{
return T_FINALLY;
}
-#line 6339 "Zend/zend_language_scanner.c"
-yy679:
- YYDEBUG(679, *YYCURSOR);
+#line 6398 "Zend/zend_language_scanner.c"
+yy686:
+ YYDEBUG(686, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'F') {
- if (yych == 'C') goto yy685;
+ if (yych == 'C') goto yy692;
if (yych <= 'E') goto yy150;
- goto yy686;
+ goto yy693;
} else {
if (yych <= 'c') {
if (yych <= 'b') goto yy150;
- goto yy685;
+ goto yy692;
} else {
- if (yych == 'f') goto yy686;
+ if (yych == 'f') goto yy693;
goto yy150;
}
}
-yy680:
- YYDEBUG(680, *YYCURSOR);
+yy687:
+ YYDEBUG(687, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy683;
- if (yych == 'e') goto yy683;
+ if (yych == 'E') goto yy690;
+ if (yych == 'e') goto yy690;
goto yy150;
-yy681:
- YYDEBUG(681, *YYCURSOR);
+yy688:
+ YYDEBUG(688, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(682, *YYCURSOR);
+ YYDEBUG(689, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1163 "Zend/zend_language_scanner.l"
+#line 1167 "Zend/zend_language_scanner.l"
{
return T_DO;
}
-#line 6374 "Zend/zend_language_scanner.c"
-yy683:
- YYDEBUG(683, *YYCURSOR);
+#line 6433 "Zend/zend_language_scanner.c"
+yy690:
+ YYDEBUG(690, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(684, *YYCURSOR);
+ YYDEBUG(691, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
#line 1103 "Zend/zend_language_scanner.l"
{
return T_EXIT;
}
-#line 6387 "Zend/zend_language_scanner.c"
-yy685:
- YYDEBUG(685, *YYCURSOR);
+#line 6446 "Zend/zend_language_scanner.c"
+yy692:
+ YYDEBUG(692, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy692;
- if (yych == 'l') goto yy692;
+ if (yych == 'L') goto yy699;
+ if (yych == 'l') goto yy699;
goto yy150;
-yy686:
- YYDEBUG(686, *YYCURSOR);
+yy693:
+ YYDEBUG(693, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy687;
+ if (yych == 'A') goto yy694;
if (yych != 'a') goto yy150;
-yy687:
- YYDEBUG(687, *YYCURSOR);
+yy694:
+ YYDEBUG(694, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'U') goto yy688;
+ if (yych == 'U') goto yy695;
if (yych != 'u') goto yy150;
-yy688:
- YYDEBUG(688, *YYCURSOR);
+yy695:
+ YYDEBUG(695, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy689;
+ if (yych == 'L') goto yy696;
if (yych != 'l') goto yy150;
-yy689:
- YYDEBUG(689, *YYCURSOR);
+yy696:
+ YYDEBUG(696, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy690;
+ if (yych == 'T') goto yy697;
if (yych != 't') goto yy150;
-yy690:
- YYDEBUG(690, *YYCURSOR);
+yy697:
+ YYDEBUG(697, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(691, *YYCURSOR);
+ YYDEBUG(698, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1211 "Zend/zend_language_scanner.l"
+#line 1215 "Zend/zend_language_scanner.l"
{
return T_DEFAULT;
}
-#line 6426 "Zend/zend_language_scanner.c"
-yy692:
- YYDEBUG(692, *YYCURSOR);
+#line 6485 "Zend/zend_language_scanner.c"
+yy699:
+ YYDEBUG(699, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy693;
+ if (yych == 'A') goto yy700;
if (yych != 'a') goto yy150;
-yy693:
- YYDEBUG(693, *YYCURSOR);
+yy700:
+ YYDEBUG(700, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy694;
+ if (yych == 'R') goto yy701;
if (yych != 'r') goto yy150;
-yy694:
- YYDEBUG(694, *YYCURSOR);
+yy701:
+ YYDEBUG(701, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy695;
+ if (yych == 'E') goto yy702;
if (yych != 'e') goto yy150;
-yy695:
- YYDEBUG(695, *YYCURSOR);
+yy702:
+ YYDEBUG(702, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(696, *YYCURSOR);
+ YYDEBUG(703, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1183 "Zend/zend_language_scanner.l"
+#line 1187 "Zend/zend_language_scanner.l"
{
return T_DECLARE;
}
-#line 6454 "Zend/zend_language_scanner.c"
-yy697:
- YYDEBUG(697, *YYCURSOR);
+#line 6513 "Zend/zend_language_scanner.c"
+yy704:
+ YYDEBUG(704, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy759;
- if (yych == 'h') goto yy759;
+ if (yych == 'H') goto yy766;
+ if (yych == 'h') goto yy766;
goto yy150;
-yy698:
- YYDEBUG(698, *YYCURSOR);
+yy705:
+ YYDEBUG(705, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'S') goto yy753;
- if (yych == 's') goto yy753;
+ if (yych == 'S') goto yy760;
+ if (yych == 's') goto yy760;
goto yy150;
-yy699:
- YYDEBUG(699, *YYCURSOR);
+yy706:
+ YYDEBUG(706, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'P') goto yy749;
- if (yych == 'p') goto yy749;
+ if (yych == 'P') goto yy756;
+ if (yych == 'p') goto yy756;
goto yy150;
-yy700:
- YYDEBUG(700, *YYCURSOR);
+yy707:
+ YYDEBUG(707, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'D') goto yy715;
- if (yych == 'd') goto yy715;
+ if (yych == 'D') goto yy722;
+ if (yych == 'd') goto yy722;
goto yy150;
-yy701:
- YYDEBUG(701, *YYCURSOR);
+yy708:
+ YYDEBUG(708, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy712;
- if (yych == 'a') goto yy712;
+ if (yych == 'A') goto yy719;
+ if (yych == 'a') goto yy719;
goto yy150;
-yy702:
- YYDEBUG(702, *YYCURSOR);
+yy709:
+ YYDEBUG(709, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'T') {
- if (yych == 'I') goto yy703;
+ if (yych == 'I') goto yy710;
if (yych <= 'S') goto yy150;
- goto yy704;
+ goto yy711;
} else {
if (yych <= 'i') {
if (yych <= 'h') goto yy150;
} else {
- if (yych == 't') goto yy704;
+ if (yych == 't') goto yy711;
goto yy150;
}
}
-yy703:
- YYDEBUG(703, *YYCURSOR);
+yy710:
+ YYDEBUG(710, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy710;
- if (yych == 't') goto yy710;
+ if (yych == 'T') goto yy717;
+ if (yych == 't') goto yy717;
goto yy150;
-yy704:
- YYDEBUG(704, *YYCURSOR);
+yy711:
+ YYDEBUG(711, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy705;
+ if (yych == 'E') goto yy712;
if (yych != 'e') goto yy150;
-yy705:
- YYDEBUG(705, *YYCURSOR);
+yy712:
+ YYDEBUG(712, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'N') goto yy706;
+ if (yych == 'N') goto yy713;
if (yych != 'n') goto yy150;
-yy706:
- YYDEBUG(706, *YYCURSOR);
+yy713:
+ YYDEBUG(713, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'D') goto yy707;
+ if (yych == 'D') goto yy714;
if (yych != 'd') goto yy150;
-yy707:
- YYDEBUG(707, *YYCURSOR);
+yy714:
+ YYDEBUG(714, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'S') goto yy708;
+ if (yych == 'S') goto yy715;
if (yych != 's') goto yy150;
-yy708:
- YYDEBUG(708, *YYCURSOR);
+yy715:
+ YYDEBUG(715, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(709, *YYCURSOR);
+ YYDEBUG(716, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1247 "Zend/zend_language_scanner.l"
+#line 1251 "Zend/zend_language_scanner.l"
{
return T_EXTENDS;
}
-#line 6538 "Zend/zend_language_scanner.c"
-yy710:
- YYDEBUG(710, *YYCURSOR);
+#line 6597 "Zend/zend_language_scanner.c"
+yy717:
+ YYDEBUG(717, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(711, *YYCURSOR);
+ YYDEBUG(718, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
#line 1099 "Zend/zend_language_scanner.l"
{
return T_EXIT;
}
-#line 6551 "Zend/zend_language_scanner.c"
-yy712:
- YYDEBUG(712, *YYCURSOR);
+#line 6610 "Zend/zend_language_scanner.c"
+yy719:
+ YYDEBUG(719, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy713;
+ if (yych == 'L') goto yy720;
if (yych != 'l') goto yy150;
-yy713:
- YYDEBUG(713, *YYCURSOR);
+yy720:
+ YYDEBUG(720, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(714, *YYCURSOR);
+ YYDEBUG(721, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1337 "Zend/zend_language_scanner.l"
+#line 1341 "Zend/zend_language_scanner.l"
{
return T_EVAL;
}
-#line 6569 "Zend/zend_language_scanner.c"
-yy715:
- YYDEBUG(715, *YYCURSOR);
+#line 6628 "Zend/zend_language_scanner.c"
+yy722:
+ YYDEBUG(722, *YYCURSOR);
yych = *++YYCURSOR;
YYDEBUG(-1, yych);
switch (yych) {
case 'D':
- case 'd': goto yy716;
+ case 'd': goto yy723;
case 'F':
- case 'f': goto yy717;
+ case 'f': goto yy724;
case 'I':
- case 'i': goto yy718;
+ case 'i': goto yy725;
case 'S':
- case 's': goto yy719;
+ case 's': goto yy726;
case 'W':
- case 'w': goto yy720;
+ case 'w': goto yy727;
default: goto yy150;
}
-yy716:
- YYDEBUG(716, *YYCURSOR);
+yy723:
+ YYDEBUG(723, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy742;
- if (yych == 'e') goto yy742;
+ if (yych == 'E') goto yy749;
+ if (yych == 'e') goto yy749;
goto yy150;
-yy717:
- YYDEBUG(717, *YYCURSOR);
+yy724:
+ YYDEBUG(724, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'O') goto yy734;
- if (yych == 'o') goto yy734;
+ if (yych == 'O') goto yy741;
+ if (yych == 'o') goto yy741;
goto yy150;
-yy718:
- YYDEBUG(718, *YYCURSOR);
+yy725:
+ YYDEBUG(725, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'F') goto yy732;
- if (yych == 'f') goto yy732;
+ if (yych == 'F') goto yy739;
+ if (yych == 'f') goto yy739;
goto yy150;
-yy719:
- YYDEBUG(719, *YYCURSOR);
+yy726:
+ YYDEBUG(726, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'W') goto yy726;
- if (yych == 'w') goto yy726;
+ if (yych == 'W') goto yy733;
+ if (yych == 'w') goto yy733;
goto yy150;
-yy720:
- YYDEBUG(720, *YYCURSOR);
+yy727:
+ YYDEBUG(727, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy721;
+ if (yych == 'H') goto yy728;
if (yych != 'h') goto yy150;
-yy721:
- YYDEBUG(721, *YYCURSOR);
+yy728:
+ YYDEBUG(728, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'I') goto yy722;
+ if (yych == 'I') goto yy729;
if (yych != 'i') goto yy150;
-yy722:
- YYDEBUG(722, *YYCURSOR);
+yy729:
+ YYDEBUG(729, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy723;
+ if (yych == 'L') goto yy730;
if (yych != 'l') goto yy150;
-yy723:
- YYDEBUG(723, *YYCURSOR);
+yy730:
+ YYDEBUG(730, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy724;
+ if (yych == 'E') goto yy731;
if (yych != 'e') goto yy150;
-yy724:
- YYDEBUG(724, *YYCURSOR);
+yy731:
+ YYDEBUG(731, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(725, *YYCURSOR);
+ YYDEBUG(732, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1159 "Zend/zend_language_scanner.l"
+#line 1163 "Zend/zend_language_scanner.l"
{
return T_ENDWHILE;
}
-#line 6643 "Zend/zend_language_scanner.c"
-yy726:
- YYDEBUG(726, *YYCURSOR);
+#line 6702 "Zend/zend_language_scanner.c"
+yy733:
+ YYDEBUG(733, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'I') goto yy727;
+ if (yych == 'I') goto yy734;
if (yych != 'i') goto yy150;
-yy727:
- YYDEBUG(727, *YYCURSOR);
+yy734:
+ YYDEBUG(734, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy728;
+ if (yych == 'T') goto yy735;
if (yych != 't') goto yy150;
-yy728:
- YYDEBUG(728, *YYCURSOR);
+yy735:
+ YYDEBUG(735, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy729;
+ if (yych == 'C') goto yy736;
if (yych != 'c') goto yy150;
-yy729:
- YYDEBUG(729, *YYCURSOR);
+yy736:
+ YYDEBUG(736, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy730;
+ if (yych == 'H') goto yy737;
if (yych != 'h') goto yy150;
-yy730:
- YYDEBUG(730, *YYCURSOR);
+yy737:
+ YYDEBUG(737, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(731, *YYCURSOR);
+ YYDEBUG(738, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1203 "Zend/zend_language_scanner.l"
+#line 1207 "Zend/zend_language_scanner.l"
{
return T_ENDSWITCH;
}
-#line 6676 "Zend/zend_language_scanner.c"
-yy732:
- YYDEBUG(732, *YYCURSOR);
+#line 6735 "Zend/zend_language_scanner.c"
+yy739:
+ YYDEBUG(739, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(733, *YYCURSOR);
+ YYDEBUG(740, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1147 "Zend/zend_language_scanner.l"
+#line 1151 "Zend/zend_language_scanner.l"
{
return T_ENDIF;
}
-#line 6689 "Zend/zend_language_scanner.c"
-yy734:
- YYDEBUG(734, *YYCURSOR);
+#line 6748 "Zend/zend_language_scanner.c"
+yy741:
+ YYDEBUG(741, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy735;
+ if (yych == 'R') goto yy742;
if (yych != 'r') goto yy150;
-yy735:
- YYDEBUG(735, *YYCURSOR);
+yy742:
+ YYDEBUG(742, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '^') {
if (yych <= '@') {
- if (yych <= '/') goto yy736;
+ if (yych <= '/') goto yy743;
if (yych <= '9') goto yy149;
} else {
- if (yych == 'E') goto yy737;
+ if (yych == 'E') goto yy744;
if (yych <= 'Z') goto yy149;
}
} else {
if (yych <= 'd') {
if (yych != '`') goto yy149;
} else {
- if (yych <= 'e') goto yy737;
+ if (yych <= 'e') goto yy744;
if (yych <= 'z') goto yy149;
if (yych >= 0x7F) goto yy149;
}
}
-yy736:
- YYDEBUG(736, *YYCURSOR);
+yy743:
+ YYDEBUG(743, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1171 "Zend/zend_language_scanner.l"
+#line 1175 "Zend/zend_language_scanner.l"
{
return T_ENDFOR;
}
-#line 6722 "Zend/zend_language_scanner.c"
-yy737:
- YYDEBUG(737, *YYCURSOR);
+#line 6781 "Zend/zend_language_scanner.c"
+yy744:
+ YYDEBUG(744, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy738;
+ if (yych == 'A') goto yy745;
if (yych != 'a') goto yy150;
-yy738:
- YYDEBUG(738, *YYCURSOR);
+yy745:
+ YYDEBUG(745, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy739;
+ if (yych == 'C') goto yy746;
if (yych != 'c') goto yy150;
-yy739:
- YYDEBUG(739, *YYCURSOR);
+yy746:
+ YYDEBUG(746, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'H') goto yy740;
+ if (yych == 'H') goto yy747;
if (yych != 'h') goto yy150;
-yy740:
- YYDEBUG(740, *YYCURSOR);
+yy747:
+ YYDEBUG(747, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(741, *YYCURSOR);
+ YYDEBUG(748, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1179 "Zend/zend_language_scanner.l"
+#line 1183 "Zend/zend_language_scanner.l"
{
return T_ENDFOREACH;
}
-#line 6750 "Zend/zend_language_scanner.c"
-yy742:
- YYDEBUG(742, *YYCURSOR);
+#line 6809 "Zend/zend_language_scanner.c"
+yy749:
+ YYDEBUG(749, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'C') goto yy743;
+ if (yych == 'C') goto yy750;
if (yych != 'c') goto yy150;
-yy743:
- YYDEBUG(743, *YYCURSOR);
+yy750:
+ YYDEBUG(750, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy744;
+ if (yych == 'L') goto yy751;
if (yych != 'l') goto yy150;
-yy744:
- YYDEBUG(744, *YYCURSOR);
+yy751:
+ YYDEBUG(751, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy745;
+ if (yych == 'A') goto yy752;
if (yych != 'a') goto yy150;
-yy745:
- YYDEBUG(745, *YYCURSOR);
+yy752:
+ YYDEBUG(752, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy746;
+ if (yych == 'R') goto yy753;
if (yych != 'r') goto yy150;
-yy746:
- YYDEBUG(746, *YYCURSOR);
+yy753:
+ YYDEBUG(753, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy747;
+ if (yych == 'E') goto yy754;
if (yych != 'e') goto yy150;
-yy747:
- YYDEBUG(747, *YYCURSOR);
+yy754:
+ YYDEBUG(754, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(748, *YYCURSOR);
+ YYDEBUG(755, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1187 "Zend/zend_language_scanner.l"
+#line 1191 "Zend/zend_language_scanner.l"
{
return T_ENDDECLARE;
}
-#line 6788 "Zend/zend_language_scanner.c"
-yy749:
- YYDEBUG(749, *YYCURSOR);
+#line 6847 "Zend/zend_language_scanner.c"
+yy756:
+ YYDEBUG(756, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'T') goto yy750;
+ if (yych == 'T') goto yy757;
if (yych != 't') goto yy150;
-yy750:
- YYDEBUG(750, *YYCURSOR);
+yy757:
+ YYDEBUG(757, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'Y') goto yy751;
+ if (yych == 'Y') goto yy758;
if (yych != 'y') goto yy150;
-yy751:
- YYDEBUG(751, *YYCURSOR);
+yy758:
+ YYDEBUG(758, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(752, *YYCURSOR);
+ YYDEBUG(759, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1377 "Zend/zend_language_scanner.l"
+#line 1381 "Zend/zend_language_scanner.l"
{
return T_EMPTY;
}
-#line 6811 "Zend/zend_language_scanner.c"
-yy753:
- YYDEBUG(753, *YYCURSOR);
+#line 6870 "Zend/zend_language_scanner.c"
+yy760:
+ YYDEBUG(760, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy754;
+ if (yych == 'E') goto yy761;
if (yych != 'e') goto yy150;
-yy754:
- YYDEBUG(754, *YYCURSOR);
+yy761:
+ YYDEBUG(761, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '^') {
if (yych <= '@') {
- if (yych <= '/') goto yy755;
+ if (yych <= '/') goto yy762;
if (yych <= '9') goto yy149;
} else {
- if (yych == 'I') goto yy756;
+ if (yych == 'I') goto yy763;
if (yych <= 'Z') goto yy149;
}
} else {
if (yych <= 'h') {
if (yych != '`') goto yy149;
} else {
- if (yych <= 'i') goto yy756;
+ if (yych <= 'i') goto yy763;
if (yych <= 'z') goto yy149;
if (yych >= 0x7F) goto yy149;
}
}
-yy755:
- YYDEBUG(755, *YYCURSOR);
+yy762:
+ YYDEBUG(762, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1151 "Zend/zend_language_scanner.l"
+#line 1155 "Zend/zend_language_scanner.l"
{
return T_ELSE;
}
-#line 6844 "Zend/zend_language_scanner.c"
-yy756:
- YYDEBUG(756, *YYCURSOR);
+#line 6903 "Zend/zend_language_scanner.c"
+yy763:
+ YYDEBUG(763, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'F') goto yy757;
+ if (yych == 'F') goto yy764;
if (yych != 'f') goto yy150;
-yy757:
- YYDEBUG(757, *YYCURSOR);
+yy764:
+ YYDEBUG(764, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(758, *YYCURSOR);
+ YYDEBUG(765, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1143 "Zend/zend_language_scanner.l"
+#line 1147 "Zend/zend_language_scanner.l"
{
return T_ELSEIF;
}
-#line 6862 "Zend/zend_language_scanner.c"
-yy759:
- YYDEBUG(759, *YYCURSOR);
+#line 6921 "Zend/zend_language_scanner.c"
+yy766:
+ YYDEBUG(766, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'O') goto yy760;
+ if (yych == 'O') goto yy767;
if (yych != 'o') goto yy150;
-yy760:
- YYDEBUG(760, *YYCURSOR);
+yy767:
+ YYDEBUG(767, *YYCURSOR);
++YYCURSOR;
if (yybm[0+(yych = *YYCURSOR)] & 4) {
goto yy149;
}
- YYDEBUG(761, *YYCURSOR);
+ YYDEBUG(768, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1227 "Zend/zend_language_scanner.l"
+#line 1231 "Zend/zend_language_scanner.l"
{
return T_ECHO;
}
-#line 6880 "Zend/zend_language_scanner.c"
+#line 6939 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_LOOKING_FOR_PROPERTY:
@@ -6915,111 +6974,111 @@ yyc_ST_LOOKING_FOR_PROPERTY:
64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64,
};
- YYDEBUG(762, *YYCURSOR);
+ YYDEBUG(769, *YYCURSOR);
YYFILL(2);
yych = *YYCURSOR;
if (yych <= '-') {
if (yych <= '\r') {
- if (yych <= 0x08) goto yy770;
- if (yych <= '\n') goto yy764;
- if (yych <= '\f') goto yy770;
+ if (yych <= 0x08) goto yy777;
+ if (yych <= '\n') goto yy771;
+ if (yych <= '\f') goto yy777;
} else {
- if (yych == ' ') goto yy764;
- if (yych <= ',') goto yy770;
- goto yy766;
+ if (yych == ' ') goto yy771;
+ if (yych <= ',') goto yy777;
+ goto yy773;
}
} else {
if (yych <= '_') {
- if (yych <= '@') goto yy770;
- if (yych <= 'Z') goto yy768;
- if (yych <= '^') goto yy770;
- goto yy768;
+ if (yych <= '@') goto yy777;
+ if (yych <= 'Z') goto yy775;
+ if (yych <= '^') goto yy777;
+ goto yy775;
} else {
- if (yych <= '`') goto yy770;
- if (yych <= 'z') goto yy768;
- if (yych <= '~') goto yy770;
- goto yy768;
+ if (yych <= '`') goto yy777;
+ if (yych <= 'z') goto yy775;
+ if (yych <= '~') goto yy777;
+ goto yy775;
}
}
-yy764:
- YYDEBUG(764, *YYCURSOR);
+yy771:
+ YYDEBUG(771, *YYCURSOR);
++YYCURSOR;
yych = *YYCURSOR;
- goto yy776;
-yy765:
- YYDEBUG(765, *YYCURSOR);
+ goto yy783;
+yy772:
+ YYDEBUG(772, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1260 "Zend/zend_language_scanner.l"
+#line 1264 "Zend/zend_language_scanner.l"
{
HANDLE_NEWLINES(yytext, yyleng);
return T_WHITESPACE;
}
-#line 6958 "Zend/zend_language_scanner.c"
-yy766:
- YYDEBUG(766, *YYCURSOR);
+#line 7017 "Zend/zend_language_scanner.c"
+yy773:
+ YYDEBUG(773, *YYCURSOR);
++YYCURSOR;
- if ((yych = *YYCURSOR) == '>') goto yy773;
-yy767:
- YYDEBUG(767, *YYCURSOR);
+ if ((yych = *YYCURSOR) == '>') goto yy780;
+yy774:
+ YYDEBUG(774, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1275 "Zend/zend_language_scanner.l"
+#line 1279 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
goto restart;
}
-#line 6972 "Zend/zend_language_scanner.c"
-yy768:
- YYDEBUG(768, *YYCURSOR);
+#line 7031 "Zend/zend_language_scanner.c"
+yy775:
+ YYDEBUG(775, *YYCURSOR);
++YYCURSOR;
yych = *YYCURSOR;
- goto yy772;
-yy769:
- YYDEBUG(769, *YYCURSOR);
+ goto yy779;
+yy776:
+ YYDEBUG(776, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1269 "Zend/zend_language_scanner.l"
+#line 1273 "Zend/zend_language_scanner.l"
{
yy_pop_state();
zend_copy_value(zendlval, yytext, yyleng);
return T_STRING;
}
-#line 6987 "Zend/zend_language_scanner.c"
-yy770:
- YYDEBUG(770, *YYCURSOR);
+#line 7046 "Zend/zend_language_scanner.c"
+yy777:
+ YYDEBUG(777, *YYCURSOR);
yych = *++YYCURSOR;
- goto yy767;
-yy771:
- YYDEBUG(771, *YYCURSOR);
+ goto yy774;
+yy778:
+ YYDEBUG(778, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy772:
- YYDEBUG(772, *YYCURSOR);
+yy779:
+ YYDEBUG(779, *YYCURSOR);
if (yybm[0+yych] & 64) {
- goto yy771;
+ goto yy778;
}
- goto yy769;
-yy773:
- YYDEBUG(773, *YYCURSOR);
+ goto yy776;
+yy780:
+ YYDEBUG(780, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(774, *YYCURSOR);
+ YYDEBUG(781, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1265 "Zend/zend_language_scanner.l"
+#line 1269 "Zend/zend_language_scanner.l"
{
return T_OBJECT_OPERATOR;
}
-#line 7012 "Zend/zend_language_scanner.c"
-yy775:
- YYDEBUG(775, *YYCURSOR);
+#line 7071 "Zend/zend_language_scanner.c"
+yy782:
+ YYDEBUG(782, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy776:
- YYDEBUG(776, *YYCURSOR);
+yy783:
+ YYDEBUG(783, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy775;
+ goto yy782;
}
- goto yy765;
+ goto yy772;
}
/* *********************************** */
yyc_ST_LOOKING_FOR_VARNAME:
@@ -7058,74 +7117,74 @@ yyc_ST_LOOKING_FOR_VARNAME:
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
};
- YYDEBUG(777, *YYCURSOR);
+ YYDEBUG(784, *YYCURSOR);
YYFILL(2);
yych = *YYCURSOR;
if (yych <= '_') {
- if (yych <= '@') goto yy781;
- if (yych <= 'Z') goto yy779;
- if (yych <= '^') goto yy781;
+ if (yych <= '@') goto yy788;
+ if (yych <= 'Z') goto yy786;
+ if (yych <= '^') goto yy788;
} else {
- if (yych <= '`') goto yy781;
- if (yych <= 'z') goto yy779;
- if (yych <= '~') goto yy781;
+ if (yych <= '`') goto yy788;
+ if (yych <= 'z') goto yy786;
+ if (yych <= '~') goto yy788;
}
-yy779:
- YYDEBUG(779, *YYCURSOR);
+yy786:
+ YYDEBUG(786, *YYCURSOR);
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '_') {
if (yych <= '@') {
- if (yych <= '/') goto yy780;
- if (yych <= '9') goto yy783;
+ if (yych <= '/') goto yy787;
+ if (yych <= '9') goto yy790;
} else {
- if (yych <= '[') goto yy783;
- if (yych >= '_') goto yy783;
+ if (yych <= '[') goto yy790;
+ if (yych >= '_') goto yy790;
}
} else {
if (yych <= '|') {
- if (yych <= '`') goto yy780;
- if (yych <= 'z') goto yy783;
+ if (yych <= '`') goto yy787;
+ if (yych <= 'z') goto yy790;
} else {
- if (yych != '~') goto yy783;
+ if (yych != '~') goto yy790;
}
}
-yy780:
- YYDEBUG(780, *YYCURSOR);
+yy787:
+ YYDEBUG(787, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1580 "Zend/zend_language_scanner.l"
+#line 1584 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
goto restart;
}
-#line 7104 "Zend/zend_language_scanner.c"
-yy781:
- YYDEBUG(781, *YYCURSOR);
+#line 7163 "Zend/zend_language_scanner.c"
+yy788:
+ YYDEBUG(788, *YYCURSOR);
yych = *++YYCURSOR;
- goto yy780;
-yy782:
- YYDEBUG(782, *YYCURSOR);
+ goto yy787;
+yy789:
+ YYDEBUG(789, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy783:
- YYDEBUG(783, *YYCURSOR);
+yy790:
+ YYDEBUG(790, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy782;
+ goto yy789;
}
- if (yych == '[') goto yy785;
- if (yych == '}') goto yy785;
- YYDEBUG(784, *YYCURSOR);
+ if (yych == '[') goto yy792;
+ if (yych == '}') goto yy792;
+ YYDEBUG(791, *YYCURSOR);
YYCURSOR = YYMARKER;
- goto yy780;
-yy785:
- YYDEBUG(785, *YYCURSOR);
+ goto yy787;
+yy792:
+ YYDEBUG(792, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(786, *YYCURSOR);
+ YYDEBUG(793, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1571 "Zend/zend_language_scanner.l"
+#line 1575 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
zend_copy_value(zendlval, yytext, yyleng);
@@ -7133,18 +7192,18 @@ yy785:
yy_push_state(ST_IN_SCRIPTING);
return T_STRING_VARNAME;
}
-#line 7137 "Zend/zend_language_scanner.c"
+#line 7196 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_NOWDOC:
- YYDEBUG(787, *YYCURSOR);
+ YYDEBUG(794, *YYCURSOR);
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(789, *YYCURSOR);
+ YYDEBUG(796, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(790, *YYCURSOR);
+ YYDEBUG(797, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2304 "Zend/zend_language_scanner.l"
+#line 2308 "Zend/zend_language_scanner.l"
{
int newline = 0;
@@ -7200,7 +7259,7 @@ nowdoc_scan_done:
HANDLE_NEWLINES(yytext, yyleng - newline);
return T_ENCAPSED_AND_WHITESPACE;
}
-#line 7204 "Zend/zend_language_scanner.c"
+#line 7263 "Zend/zend_language_scanner.c"
/* *********************************** */
yyc_ST_VAR_OFFSET:
{
@@ -7238,76 +7297,76 @@ yyc_ST_VAR_OFFSET:
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
};
- YYDEBUG(791, *YYCURSOR);
+ YYDEBUG(798, *YYCURSOR);
YYFILL(3);
yych = *YYCURSOR;
if (yych <= '/') {
if (yych <= ' ') {
if (yych <= '\f') {
- if (yych <= 0x08) goto yy805;
- if (yych <= '\n') goto yy801;
- goto yy805;
+ if (yych <= 0x08) goto yy812;
+ if (yych <= '\n') goto yy808;
+ goto yy812;
} else {
- if (yych <= '\r') goto yy801;
- if (yych <= 0x1F) goto yy805;
- goto yy801;
+ if (yych <= '\r') goto yy808;
+ if (yych <= 0x1F) goto yy812;
+ goto yy808;
}
} else {
if (yych <= '$') {
- if (yych <= '"') goto yy800;
- if (yych <= '#') goto yy801;
- goto yy796;
+ if (yych <= '"') goto yy807;
+ if (yych <= '#') goto yy808;
+ goto yy803;
} else {
- if (yych == '\'') goto yy801;
- goto yy800;
+ if (yych == '\'') goto yy808;
+ goto yy807;
}
}
} else {
if (yych <= '\\') {
if (yych <= '@') {
- if (yych <= '0') goto yy793;
- if (yych <= '9') goto yy795;
- goto yy800;
+ if (yych <= '0') goto yy800;
+ if (yych <= '9') goto yy802;
+ goto yy807;
} else {
- if (yych <= 'Z') goto yy803;
- if (yych <= '[') goto yy800;
- goto yy801;
+ if (yych <= 'Z') goto yy810;
+ if (yych <= '[') goto yy807;
+ goto yy808;
}
} else {
if (yych <= '_') {
- if (yych <= ']') goto yy798;
- if (yych <= '^') goto yy800;
- goto yy803;
+ if (yych <= ']') goto yy805;
+ if (yych <= '^') goto yy807;
+ goto yy810;
} else {
- if (yych <= '`') goto yy800;
- if (yych <= 'z') goto yy803;
- if (yych <= '~') goto yy800;
- goto yy803;
+ if (yych <= '`') goto yy807;
+ if (yych <= 'z') goto yy810;
+ if (yych <= '~') goto yy807;
+ goto yy810;
}
}
}
-yy793:
- YYDEBUG(793, *YYCURSOR);
+yy800:
+ YYDEBUG(800, *YYCURSOR);
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= 'W') {
if (yych <= '9') {
- if (yych >= '0') goto yy817;
+ if (yych >= '0') goto yy824;
} else {
- if (yych == 'B') goto yy814;
+ if (yych == 'B') goto yy821;
}
} else {
if (yych <= 'b') {
- if (yych <= 'X') goto yy816;
- if (yych >= 'b') goto yy814;
+ if (yych <= 'X') goto yy823;
+ if (yych >= 'b') goto yy821;
} else {
- if (yych == 'x') goto yy816;
+ if (yych == 'x') goto yy823;
}
}
-yy794:
- YYDEBUG(794, *YYCURSOR);
+yy801:
+ YYDEBUG(801, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1685 "Zend/zend_language_scanner.l"
+#line 1689 "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;
@@ -7323,53 +7382,53 @@ string:
}
return T_NUM_STRING;
}
-#line 7327 "Zend/zend_language_scanner.c"
-yy795:
- YYDEBUG(795, *YYCURSOR);
+#line 7386 "Zend/zend_language_scanner.c"
+yy802:
+ YYDEBUG(802, *YYCURSOR);
yych = *++YYCURSOR;
- goto yy813;
-yy796:
- YYDEBUG(796, *YYCURSOR);
+ goto yy820;
+yy803:
+ YYDEBUG(803, *YYCURSOR);
++YYCURSOR;
if ((yych = *YYCURSOR) <= '_') {
- if (yych <= '@') goto yy797;
- if (yych <= 'Z') goto yy809;
- if (yych >= '_') goto yy809;
+ if (yych <= '@') goto yy804;
+ if (yych <= 'Z') goto yy816;
+ if (yych >= '_') goto yy816;
} else {
- if (yych <= '`') goto yy797;
- if (yych <= 'z') goto yy809;
- if (yych >= 0x7F) goto yy809;
+ if (yych <= '`') goto yy804;
+ if (yych <= 'z') goto yy816;
+ if (yych >= 0x7F) goto yy816;
}
-yy797:
- YYDEBUG(797, *YYCURSOR);
+yy804:
+ YYDEBUG(804, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1845 "Zend/zend_language_scanner.l"
+#line 1849 "Zend/zend_language_scanner.l"
{
/* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
return yytext[0];
}
-#line 7352 "Zend/zend_language_scanner.c"
-yy798:
- YYDEBUG(798, *YYCURSOR);
+#line 7411 "Zend/zend_language_scanner.c"
+yy805:
+ YYDEBUG(805, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(799, *YYCURSOR);
+ YYDEBUG(806, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1840 "Zend/zend_language_scanner.l"
+#line 1844 "Zend/zend_language_scanner.l"
{
yy_pop_state();
return ']';
}
-#line 7363 "Zend/zend_language_scanner.c"
-yy800:
- YYDEBUG(800, *YYCURSOR);
+#line 7422 "Zend/zend_language_scanner.c"
+yy807:
+ YYDEBUG(807, *YYCURSOR);
yych = *++YYCURSOR;
- goto yy797;
-yy801:
- YYDEBUG(801, *YYCURSOR);
+ goto yy804;
+yy808:
+ YYDEBUG(808, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(802, *YYCURSOR);
+ YYDEBUG(809, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1850 "Zend/zend_language_scanner.l"
+#line 1854 "Zend/zend_language_scanner.l"
{
/* Invalid rule to return a more explicit parse error with proper line number */
yyless(0);
@@ -7377,27 +7436,27 @@ yy801:
ZVAL_NULL(zendlval);
return T_ENCAPSED_AND_WHITESPACE;
}
-#line 7381 "Zend/zend_language_scanner.c"
-yy803:
- YYDEBUG(803, *YYCURSOR);
+#line 7440 "Zend/zend_language_scanner.c"
+yy810:
+ YYDEBUG(810, *YYCURSOR);
++YYCURSOR;
yych = *YYCURSOR;
- goto yy808;
-yy804:
- YYDEBUG(804, *YYCURSOR);
+ goto yy815;
+yy811:
+ YYDEBUG(811, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1858 "Zend/zend_language_scanner.l"
+#line 1862 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, yytext, yyleng);
return T_STRING;
}
-#line 7395 "Zend/zend_language_scanner.c"
-yy805:
- YYDEBUG(805, *YYCURSOR);
+#line 7454 "Zend/zend_language_scanner.c"
+yy812:
+ YYDEBUG(812, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(806, *YYCURSOR);
+ YYDEBUG(813, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2361 "Zend/zend_language_scanner.l"
+#line 2365 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
return 0;
@@ -7406,115 +7465,115 @@ yy805:
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
goto restart;
}
-#line 7410 "Zend/zend_language_scanner.c"
-yy807:
- YYDEBUG(807, *YYCURSOR);
+#line 7469 "Zend/zend_language_scanner.c"
+yy814:
+ YYDEBUG(814, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy808:
- YYDEBUG(808, *YYCURSOR);
+yy815:
+ YYDEBUG(815, *YYCURSOR);
if (yybm[0+yych] & 16) {
- goto yy807;
+ goto yy814;
}
- goto yy804;
-yy809:
- YYDEBUG(809, *YYCURSOR);
+ goto yy811;
+yy816:
+ YYDEBUG(816, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(810, *YYCURSOR);
+ YYDEBUG(817, *YYCURSOR);
if (yych <= '^') {
if (yych <= '9') {
- if (yych >= '0') goto yy809;
+ if (yych >= '0') goto yy816;
} else {
- if (yych <= '@') goto yy811;
- if (yych <= 'Z') goto yy809;
+ if (yych <= '@') goto yy818;
+ if (yych <= 'Z') goto yy816;
}
} else {
if (yych <= '`') {
- if (yych <= '_') goto yy809;
+ if (yych <= '_') goto yy816;
} else {
- if (yych <= 'z') goto yy809;
- if (yych >= 0x7F) goto yy809;
+ if (yych <= 'z') goto yy816;
+ if (yych >= 0x7F) goto yy816;
}
}
-yy811:
- YYDEBUG(811, *YYCURSOR);
+yy818:
+ YYDEBUG(818, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1835 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
{
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
return T_VARIABLE;
}
-#line 7451 "Zend/zend_language_scanner.c"
-yy812:
- YYDEBUG(812, *YYCURSOR);
+#line 7510 "Zend/zend_language_scanner.c"
+yy819:
+ YYDEBUG(819, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy813:
- YYDEBUG(813, *YYCURSOR);
+yy820:
+ YYDEBUG(820, *YYCURSOR);
if (yybm[0+yych] & 32) {
- goto yy812;
+ goto yy819;
}
- goto yy794;
-yy814:
- YYDEBUG(814, *YYCURSOR);
+ goto yy801;
+yy821:
+ YYDEBUG(821, *YYCURSOR);
yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy822;
+ goto yy829;
}
-yy815:
- YYDEBUG(815, *YYCURSOR);
+yy822:
+ YYDEBUG(822, *YYCURSOR);
YYCURSOR = YYMARKER;
- goto yy794;
-yy816:
- YYDEBUG(816, *YYCURSOR);
+ goto yy801;
+yy823:
+ YYDEBUG(823, *YYCURSOR);
yych = *++YYCURSOR;
if (yybm[0+yych] & 64) {
- goto yy820;
+ goto yy827;
}
- goto yy815;
-yy817:
- YYDEBUG(817, *YYCURSOR);
+ goto yy822;
+yy824:
+ YYDEBUG(824, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(818, *YYCURSOR);
- if (yych <= '/') goto yy819;
- if (yych <= '9') goto yy817;
-yy819:
- YYDEBUG(819, *YYCURSOR);
+ YYDEBUG(825, *YYCURSOR);
+ if (yych <= '/') goto yy826;
+ if (yych <= '9') goto yy824;
+yy826:
+ YYDEBUG(826, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1701 "Zend/zend_language_scanner.l"
+#line 1705 "Zend/zend_language_scanner.l"
{ /* Offset must be treated as a string */
ZVAL_STRINGL(zendlval, yytext, yyleng);
return T_NUM_STRING;
}
-#line 7496 "Zend/zend_language_scanner.c"
-yy820:
- YYDEBUG(820, *YYCURSOR);
+#line 7555 "Zend/zend_language_scanner.c"
+yy827:
+ YYDEBUG(827, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(821, *YYCURSOR);
+ YYDEBUG(828, *YYCURSOR);
if (yybm[0+yych] & 64) {
- goto yy820;
+ goto yy827;
}
- goto yy819;
-yy822:
- YYDEBUG(822, *YYCURSOR);
+ goto yy826;
+yy829:
+ YYDEBUG(829, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(823, *YYCURSOR);
+ YYDEBUG(830, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy822;
+ goto yy829;
}
- goto yy819;
+ goto yy826;
}
}
-#line 2370 "Zend/zend_language_scanner.l"
+#line 2374 "Zend/zend_language_scanner.l"
}
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 5e46d5142a..205eef1b3a 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -1116,6 +1116,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
return T_RETURN;
}
+<ST_IN_SCRIPTING>"yield"{WHITESPACE}"from" {
+ return T_YIELD_FROM;
+}
+
<ST_IN_SCRIPTING>"yield" {
return T_YIELD;
}
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index 92e36a5558..4be4723105 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -78,7 +78,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
{
uint32_t i;
- /* Free object properties but don't free object their selves */
+ /* Free object contents, but don't free objects themselves */
for (i = objects->top - 1; i > 0 ; i--) {
zend_object *obj = objects->object_buckets[i];
@@ -94,11 +94,13 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
}
}
- /* Now free objects theirselves */
+ /* Free objects themselves if they now have a refcount of 0, which means that
+ * they were previously part of a cycle. Everything else will report as a leak.
+ * Cycles are allowed because not all internal objects currently support GC. */
for (i = 1; i < objects->top ; i++) {
zend_object *obj = objects->object_buckets[i];
- if (IS_OBJ_VALID(obj)) {
+ if (IS_OBJ_VALID(obj) && GC_REFCOUNT(obj) == 0) {
/* Not adding to free list as we are shutting down anyway */
void *ptr = ((char*)obj) - obj->handlers->offset;
GC_REMOVE_FROM_BUFFER(obj);
diff --git a/Zend/zend_smart_str.c b/Zend/zend_smart_str.c
new file mode 100644
index 0000000000..d0d3689cd0
--- /dev/null
+++ b/Zend/zend_smart_str.c
@@ -0,0 +1,61 @@
+/*
+ +----------------------------------------------------------------------+
+ | 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. |
+ +----------------------------------------------------------------------+
+ | Author: Dmitry Stogov <dmitry@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+#include <zend.h>
+#include "zend_smart_str_public.h"
+
+#define SMART_STR_OVERHEAD (ZEND_MM_OVERHEAD + _STR_HEADER_SIZE)
+
+#ifndef SMART_STR_PAGE
+# define SMART_STR_PAGE 4096
+#endif
+
+#ifndef SMART_STR_START_SIZE
+# define SMART_STR_START_SIZE (256 - SMART_STR_OVERHEAD - 1)
+#endif
+
+#define SMART_STR_NEW_SIZE(len) \
+ (((len + SMART_STR_OVERHEAD + SMART_STR_PAGE) & ~(SMART_STR_PAGE - 1)) - SMART_STR_OVERHEAD - 1)
+
+ZEND_API void ZEND_FASTCALL smart_str_erealloc(smart_str *str, size_t len)
+{
+ if (UNEXPECTED(!str->s)) {
+ str->a = len < SMART_STR_START_SIZE
+ ? SMART_STR_START_SIZE
+ : SMART_STR_NEW_SIZE(len);
+ str->s = zend_string_alloc(str->a, 0);
+ str->s->len = 0;
+ } else {
+ str->a = SMART_STR_NEW_SIZE(len);
+ str->s = (zend_string *) erealloc2(str->s, _STR_HEADER_SIZE + str->a + 1, _STR_HEADER_SIZE + str->s->len + 1);
+ }
+}
+
+ZEND_API void ZEND_FASTCALL smart_str_realloc(smart_str *str, size_t len)
+{
+ if (UNEXPECTED(!str->s)) {
+ str->a = len < SMART_STR_START_SIZE
+ ? SMART_STR_START_SIZE
+ : SMART_STR_NEW_SIZE(len);
+ str->s = zend_string_alloc(str->a, 1);
+ str->s->len = 0;
+ } else {
+ str->a = SMART_STR_NEW_SIZE(len);
+ str->s = (zend_string *) realloc(str->s, _STR_HEADER_SIZE + str->a + 1);
+ }
+}
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index c18b133dfe..7eae04e892 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -22,14 +22,6 @@
#include <zend.h>
#include "zend_smart_str_public.h"
-#ifndef SMART_STR_PREALLOC
-#define SMART_STR_PREALLOC 128
-#endif
-
-#ifndef SMART_STR_START_SIZE
-#define SMART_STR_START_SIZE 78
-#endif
-
#define smart_str_appends_ex(dest, src, what) \
smart_str_appendl_ex((dest), (src), strlen(src), (what))
#define smart_str_appends(dest, src) \
@@ -49,23 +41,28 @@
#define smart_str_append_unsigned(dest, val) \
smart_str_append_unsigned_ex((dest), (val), 0)
+BEGIN_EXTERN_C()
+
+ZEND_API void ZEND_FASTCALL smart_str_erealloc(smart_str *str, size_t len);
+ZEND_API void ZEND_FASTCALL smart_str_realloc(smart_str *str, size_t len);
+
+END_EXTERN_C()
+
static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, zend_bool persistent) {
- size_t newlen;
- if (!str->s) {
- newlen = len;
- str->a = newlen < SMART_STR_START_SIZE
- ? SMART_STR_START_SIZE
- : newlen + SMART_STR_PREALLOC;
- str->s = zend_string_alloc(str->a, persistent);
- str->s->len = 0;
+ if (UNEXPECTED(!str->s)) {
+ goto do_smart_str_realloc;
} else {
- newlen = str->s->len + len;
- if (newlen >= str->a) {
- str->a = newlen + SMART_STR_PREALLOC;
- str->s = (zend_string *) perealloc(str->s, _STR_HEADER_SIZE + str->a + 1, persistent);
+ len += str->s->len;
+ if (UNEXPECTED(len >= str->a)) {
+do_smart_str_realloc:
+ if (persistent) {
+ smart_str_realloc(str, len);
+ } else {
+ smart_str_erealloc(str, len);
+ }
}
}
- return newlen;
+ return len;
}
static zend_always_inline void smart_str_free(smart_str *str) {
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index b15c761bec..36d532e098 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -43,8 +43,8 @@ ZEND_API void ZEND_FASTCALL _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC
ZEND_ASSERT(GC_REFCOUNT(arr) <= 1);
/* break possible cycles */
- GC_TYPE(arr) = IS_NULL;
GC_REMOVE_FROM_BUFFER(arr);
+ GC_TYPE_INFO(arr) = IS_NULL | (GC_WHITE << 16);
zend_array_destroy(arr);
break;
}
@@ -98,8 +98,8 @@ ZEND_API void ZEND_FASTCALL _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE
zend_array *arr = (zend_array*)p;
/* break possible cycles */
- GC_TYPE(arr) = IS_NULL;
GC_REMOVE_FROM_BUFFER(arr);
+ GC_TYPE_INFO(arr) = IS_NULL | (GC_WHITE << 16);
zend_array_destroy(arr);
break;
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 8859d674eb..811de533c5 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -33,22 +33,22 @@ ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -56,10 +56,10 @@ ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -77,22 +77,22 @@ ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -100,10 +100,10 @@ ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -121,25 +121,25 @@ ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -147,10 +147,10 @@ ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -183,8 +183,8 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -201,10 +201,10 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -298,19 +298,19 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -343,10 +343,10 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -366,19 +366,19 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -411,10 +411,10 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -434,29 +434,29 @@ ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -476,29 +476,29 @@ ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -605,13 +605,18 @@ ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
zval *val;
zend_free_op free_op1;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -682,11 +687,11 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -1114,11 +1119,11 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -1212,10 +1217,10 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -2347,9 +2352,9 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
{
zend_execute_data *old_execute_data;
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO();
- if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data);
@@ -2359,7 +2364,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
zend_vm_stack_free_extra_args(execute_data);
old_execute_data = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- if (UNEXPECTED(old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
object = Z_OBJ(old_execute_data->This);
@@ -2390,7 +2395,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (call_kind == ZEND_CALL_NESTED_CODE) {
+ } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
@@ -2408,14 +2413,14 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (call_kind == ZEND_CALL_TOP_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
zend_vm_stack_free_extra_args(execute_data);
EG(current_execute_data) = EX(prev_execute_data);
- if (EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
@@ -2454,14 +2459,17 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, ANY)
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
-
- if (Z_TYPE_P(val) == IS_TRUE) {
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2469,6 +2477,7 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, ANY)
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline++;
} else {
@@ -2487,14 +2496,18 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, ANY)
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
@@ -2502,6 +2515,7 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, ANY)
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = OP_JMP_ADDR(opline, opline->op2);
} else {
@@ -2520,14 +2534,17 @@ ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, ANY)
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2535,6 +2552,7 @@ ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, ANY)
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
} else {
@@ -2554,16 +2572,19 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, ANY)
zval *val;
int ret;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2571,6 +2592,7 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, ANY)
}
}
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
FREE_OP1();
if (ret) {
@@ -2593,22 +2615,28 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, ANY)
zval *val;
int ret;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
}
}
+
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
FREE_OP1();
if (ret) {
@@ -2819,6 +2847,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMPVAR|UNUSED|CV, CONST|TMPVAR|CV)
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -2902,8 +2931,10 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMPVAR|UNUSED|CV, CONST|TMPVAR|CV)
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
FREE_OP2();
FREE_OP1();
@@ -2919,6 +2950,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -3033,8 +3065,10 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -3045,6 +3079,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST)
USE_OPLINE
zend_function *fbc;
zval *function_name, *func;
+ zend_execute_data *call;
if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
@@ -3059,10 +3094,11 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
- /*CHECK_EXCEPTION();*/
ZEND_VM_NEXT_OPCODE();
}
@@ -3075,6 +3111,8 @@ ZEND_VM_HANDLER(128, ZEND_INIT_DYNAMIC_CALL, ANY, CONST|TMPVAR|CV)
zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
@@ -3110,6 +3148,7 @@ ZEND_VM_C_LABEL(try_function_name):
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
FREE_OP2();
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
@@ -3204,8 +3243,10 @@ ZEND_VM_C_LABEL(try_function_name):
FREE_OP2();
HANDLE_EXCEPTION();
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -3221,6 +3262,8 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
zend_function *func;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
@@ -3236,6 +3279,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
@@ -3264,8 +3308,10 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- func, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
FREE_OP2();
CHECK_EXCEPTION();
@@ -3278,6 +3324,7 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
zval *func_name;
zval *func;
zend_function *fbc;
+ zend_execute_data *call;
func_name = EX_CONSTANT(opline->op2) + 1;
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
@@ -3297,8 +3344,10 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
@@ -3310,6 +3359,7 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST)
zval *fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
zval *func;
zend_function *fbc;
+ zend_execute_data *call;
if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) {
fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
@@ -3322,11 +3372,11 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame_ex(
+ call = zend_vm_stack_push_call_frame_ex(
opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
-
- FREE_OP2();
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
@@ -3419,7 +3469,9 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY)
EG(scope) = NULL;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var));
+ ret = EX_VAR(opline->result.var);
+ zend_generator_create_zval(call, &fbc->op_array, ret);
+ Z_VAR_FLAGS_P(ret) = 0;
} else {
zend_vm_stack_free_args(call);
}
@@ -3542,7 +3594,9 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
EG(scope) = fbc->common.scope;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var));
+ ret = EX_VAR(opline->result.var);
+ zend_generator_create_zval(call, &fbc->op_array, ret);
+ Z_VAR_FLAGS_P(ret) = 0;
} else {
zend_vm_stack_free_args(call);
}
@@ -3767,11 +3821,21 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
zval *retval_ptr;
zend_free_op free_op1;
- SAVE_OPLINE();
- retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ CHECK_EXCEPTION();
+ }
if (!EX(return_value)) {
- FREE_OP1();
+ if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_TMP_VAR ) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ zval_dtor_func_for_ptr(Z_COUNTED_P(free_op1));
+ CHECK_EXCEPTION();
+ }
+ }
} else {
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
@@ -3871,8 +3935,7 @@ ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
zval *retval;
zend_free_op free_op1;
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
retval = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -4005,7 +4068,6 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
zval *value, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
@@ -4023,8 +4085,8 @@ ZEND_VM_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, ANY)
zval *value, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
+ SAVE_OPLINE();
zend_error(E_EXCEPTION | E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
FREE_UNFETCHED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -4048,8 +4110,12 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, ANY)
zval *varptr, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ 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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (OP1_TYPE == IS_CV) {
@@ -4080,15 +4146,18 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
zend_free_op free_op1;
zval *varptr, *arg;
- SAVE_OPLINE();
-
if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) {
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_VAR);
}
}
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ 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();
+ }
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)) {
@@ -4101,14 +4170,15 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
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);
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4158,8 +4228,13 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, ANY)
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
}
- SAVE_OPLINE();
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+
+ 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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (OP1_TYPE == IS_CV) {
@@ -4190,7 +4265,6 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
zend_free_op free_op1;
zval *args;
int arg_num;
- SAVE_OPLINE();
SAVE_OPLINE();
args = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -4368,7 +4442,7 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY)
}
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -4415,7 +4489,7 @@ ZEND_VM_C_LABEL(send_array):
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -4473,7 +4547,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -4514,13 +4588,14 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- SAVE_OPLINE();
if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
+ SAVE_OPLINE();
zend_verify_missing_arg(execute_data, arg_num);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
+ SAVE_OPLINE();
zend_verify_arg_type(EX(func), arg_num, param, NULL);
CHECK_EXCEPTION();
}
@@ -4606,13 +4681,18 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
zval *val;
zend_free_op free_op1;
- SAVE_OPLINE();
- val = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -4678,19 +4758,19 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -4719,10 +4799,10 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -4769,14 +4849,15 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY)
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
/* We are not handling overloaded classes right now */
- EX(call) = zend_vm_stack_push_call_frame(
+ zend_execute_data *call = zend_vm_stack_push_call_frame(
ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
- Z_OBJ(object_zval),
- EX(call));
+ Z_OBJ(object_zval));
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
if (EXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), &object_zval);
@@ -5299,7 +5380,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY)
new_op_array->scope = EG(scope);
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
- (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL);
+ (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
@@ -6462,7 +6543,6 @@ ZEND_VM_HANDLER(57, ZEND_BEGIN_SILENCE, ANY, ANY)
{
USE_OPLINE
- SAVE_OPLINE();
ZVAL_LONG(EX_VAR(opline->result.var), EG(error_reporting));
if (EG(error_reporting)) {
@@ -6489,7 +6569,6 @@ ZEND_VM_HANDLER(57, ZEND_BEGIN_SILENCE, ANY, ANY)
}
} while (0);
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -6497,7 +6576,6 @@ ZEND_VM_HANDLER(58, ZEND_END_SILENCE, TMP, ANY)
{
USE_OPLINE
- SAVE_OPLINE();
if (!EG(error_reporting) && Z_LVAL_P(EX_VAR(opline->op1.var)) != 0) {
EG(error_reporting) = Z_LVAL_P(EX_VAR(opline->op1.var));
}
@@ -6509,13 +6587,15 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, ANY)
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (OP1_TYPE == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
if (i_zend_is_true(value)) {
@@ -6526,9 +6606,11 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, ANY)
}
} else if (OP1_TYPE == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (OP1_TYPE == IS_VAR && is_ref) {
+ } else if (OP1_TYPE == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- FREE_OP1();
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -6543,13 +6625,15 @@ ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, ANY)
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (OP1_TYPE == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
@@ -6561,9 +6645,11 @@ ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, ANY)
}
} else if (OP1_TYPE == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (OP1_TYPE == IS_VAR && is_ref) {
+ } else if (OP1_TYPE == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- FREE_OP1();
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -6579,12 +6665,20 @@ ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
zend_free_op free_op1;
zval *value;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ 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();
+ }
if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value));
- FREE_OP1();
+ if (OP1_TYPE == IS_VAR) {
+ if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
+ efree_size(Z_REF_P(value), sizeof(zend_reference));
+ }
+ }
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (OP1_TYPE == IS_CONST) {
@@ -6600,31 +6694,31 @@ ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
ZEND_VM_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -6677,14 +6771,14 @@ ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY)
{
USE_OPLINE
- SAVE_OPLINE();
if ((uint32_t)++EG(ticks_count) >= opline->extended_value) {
EG(ticks_count) = 0;
if (zend_ticks_function) {
+ SAVE_OPLINE();
zend_ticks_function(opline->extended_value);
+ CHECK_EXCEPTION();
}
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -7006,8 +7100,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
ZEND_VM_CONTINUE();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -7040,8 +7133,7 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN:
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -7124,7 +7216,6 @@ ZEND_VM_HANDLER(156, ZEND_SEPARATE, VAR, UNUSED)
USE_OPLINE
zval *var_ptr;
- SAVE_OPLINE();
var_ptr = EX_VAR(opline->op1.var);
if (Z_TYPE_P(var_ptr) != IS_OBJECT &&
!Z_ISREF_P(var_ptr) &&
@@ -7141,8 +7232,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -7276,6 +7366,96 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
ZEND_VM_RETURN();
}
+ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(execute_data);
+
+ zval *val;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
+
+ if (Z_TYPE_P(val) == IS_ARRAY) {
+ ZVAL_COPY_VALUE(&generator->values, val);
+ if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
+ Z_ADDREF_P(val);
+ }
+ Z_FE_POS(generator->values) = 0;
+
+ FREE_OP1_IF_VAR();
+ } else if (OP1_TYPE != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce == zend_ce_generator) {
+ zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
+
+ if (OP1_TYPE != IS_TMP_VAR) {
+ Z_ADDREF_P(val);
+ }
+ FREE_OP1_IF_VAR();
+
+ if (Z_ISUNDEF(new_gen->retval)) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently run");
+ HANDLE_EXCEPTION();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue");
+ HANDLE_EXCEPTION();
+ } else {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
+ FREE_OP1();
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (!EG(exception)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZVAL_OBJ(&generator->values, &iter->std);
+ }
+ } else {
+ zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0);
+ HANDLE_EXCEPTION();
+ }
+
+ /* This is the default return value
+ * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
+}
+
ZEND_VM_HANDLER(159, ZEND_DISCARD_EXCEPTION, ANY, ANY)
{
USE_OPLINE
@@ -7337,8 +7517,7 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, ANY)
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
ZEND_VM_CONTINUE();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -7517,7 +7696,6 @@ ZEND_VM_HANDLER(122, ZEND_DEFINED, CONST, ANY)
USE_OPLINE
zend_constant *c;
- SAVE_OPLINE();
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
ZVAL_TRUE(EX_VAR(opline->result.var));
} else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op1), 0)) == NULL) {
@@ -7526,7 +7704,6 @@ ZEND_VM_HANDLER(122, ZEND_DEFINED, CONST, ANY)
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), c);
ZVAL_TRUE(EX_VAR(opline->result.var));
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -7589,7 +7766,8 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
call = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
zend_vm_stack_free_call_frame(call);
- call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object, execute_data);
+ call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object);
+ call->prev_execute_data = execute_data;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
@@ -7679,7 +7857,7 @@ ZEND_VM_C_LABEL(call_trampoline_end):
ZEND_VM_RETURN();
}
- LOAD_OPLINE();
+ opline = execute_data->opline;
if (object) {
OBJ_RELEASE(object);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f1ad2aa7d6..7775c83894 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -423,7 +423,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
}
execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE,
- (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL);
+ (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table();
} else {
@@ -437,9 +437,9 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
zend_execute_data *old_execute_data;
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO();
- if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data);
@@ -449,7 +449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
zend_vm_stack_free_extra_args(execute_data);
old_execute_data = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- if (UNEXPECTED(old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
object = Z_OBJ(old_execute_data->This);
@@ -480,7 +480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (call_kind == ZEND_CALL_NESTED_CODE) {
+ } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
@@ -498,14 +498,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (call_kind == ZEND_CALL_TOP_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
zend_vm_stack_free_extra_args(execute_data);
EG(current_execute_data) = EX(prev_execute_data);
- if (EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
@@ -626,7 +626,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(
EG(scope) = NULL;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var));
+ ret = EX_VAR(opline->result.var);
+ zend_generator_create_zval(call, &fbc->op_array, ret);
+ Z_VAR_FLAGS_P(ret) = 0;
} else {
zend_vm_stack_free_args(call);
}
@@ -749,7 +751,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPC
EG(scope) = fbc->common.scope;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var));
+ ret = EX_VAR(opline->result.var);
+ zend_generator_create_zval(call, &fbc->op_array, ret);
+ Z_VAR_FLAGS_P(ret) = 0;
} else {
zend_vm_stack_free_args(call);
}
@@ -925,7 +929,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_
zend_free_op free_op1;
zval *args;
int arg_num;
- SAVE_OPLINE();
SAVE_OPLINE();
args = get_zval_ptr(opline->op1_type, opline->op1, execute_data, &free_op1, BP_VAR_R);
@@ -1103,7 +1106,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_O
}
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -1150,7 +1153,7 @@ send_array:
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -1192,13 +1195,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- SAVE_OPLINE();
if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
+ SAVE_OPLINE();
zend_verify_missing_arg(execute_data, arg_num);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
+ SAVE_OPLINE();
zend_verify_arg_type(EX(func), arg_num, param, NULL);
CHECK_EXCEPTION();
}
@@ -1251,7 +1255,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEN
{
USE_OPLINE
- SAVE_OPLINE();
ZVAL_LONG(EX_VAR(opline->result.var), EG(error_reporting));
if (EG(error_reporting)) {
@@ -1278,37 +1281,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEN
}
} while (0);
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- SAVE_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();
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -1361,14 +1363,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE
{
USE_OPLINE
- SAVE_OPLINE();
if ((uint32_t)++EG(ticks_count) >= opline->extended_value) {
EG(ticks_count) = 0;
if (zend_ticks_function) {
+ SAVE_OPLINE();
zend_ticks_function(opline->extended_value);
+ CHECK_EXCEPTION();
}
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -1620,8 +1622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
ZEND_VM_CONTINUE();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -1654,8 +1655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_
ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN:
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -1733,8 +1733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPC
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]);
ZEND_VM_CONTINUE();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
@@ -1803,7 +1802,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
call = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
zend_vm_stack_free_call_frame(call);
- call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object, execute_data);
+ call = zend_vm_stack_push_call_frame(call_kind, fbc->common.prototype, 2, scope, object);
+ call->prev_execute_data = execute_data;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
@@ -1893,7 +1893,7 @@ call_trampoline_end:
ZEND_VM_RETURN();
}
- LOAD_OPLINE();
+ opline = execute_data->opline;
if (object) {
OBJ_RELEASE(object);
@@ -1959,6 +1959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_
USE_OPLINE
zend_function *fbc;
zval *function_name, *func;
+ zend_execute_data *call;
if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
@@ -1973,10 +1974,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
- /*CHECK_EXCEPTION();*/
ZEND_VM_NEXT_OPCODE();
}
@@ -1989,6 +1991,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_H
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = EX_CONSTANT(opline->op2);
@@ -2023,6 +2027,7 @@ try_function_name:
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
@@ -2117,8 +2122,10 @@ try_function_name:
HANDLE_EXCEPTION();
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -2130,6 +2137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON
zval *func_name;
zval *func;
zend_function *fbc;
+ zend_execute_data *call;
func_name = EX_CONSTANT(opline->op2) + 1;
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
@@ -2149,8 +2157,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
@@ -2162,6 +2172,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(
zval *fname = EX_CONSTANT(opline->op2);
zval *func;
zend_function *fbc;
+ zend_execute_data *call;
if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) {
fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
@@ -2174,9 +2185,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame_ex(
+ call = zend_vm_stack_push_call_frame_ex(
opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL, EX(call));
+ fbc, opline->extended_value, NULL, NULL);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
@@ -2384,6 +2397,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HAND
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -2418,6 +2433,7 @@ try_function_name:
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
@@ -2512,8 +2528,10 @@ try_function_name:
HANDLE_EXCEPTION();
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -2572,6 +2590,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_
zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -2607,6 +2627,7 @@ try_function_name:
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
zval_ptr_dtor_nogc(free_op2);
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
@@ -2701,8 +2722,10 @@ try_function_name:
zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -2727,13 +2750,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZE
zval *val;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -2775,14 +2803,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_O
zval *val;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2790,6 +2821,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_O
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline++;
} else {
@@ -2808,14 +2840,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_
zval *val;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
@@ -2823,6 +2859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = OP_JMP_ADDR(opline, opline->op2);
} else {
@@ -2841,14 +2878,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND
zval *val;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2856,6 +2896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
} else {
@@ -2875,16 +2916,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEN
zval *val;
int ret;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -2892,6 +2936,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEN
}
}
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
if (ret) {
@@ -2914,22 +2959,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZE
zval *val;
int ret;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
}
}
+
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
if (ret) {
@@ -2949,13 +3000,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND
{
USE_OPLINE
zval *retval_ptr;
+ zend_free_op free_op1;
-
- SAVE_OPLINE();
retval_ptr = EX_CONSTANT(opline->op1);
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ CHECK_EXCEPTION();
+ }
if (!EX(return_value)) {
-
+ if (IS_CONST == IS_VAR || IS_CONST == IS_TMP_VAR ) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ zval_dtor_func_for_ptr(Z_COUNTED_P(free_op1));
+ CHECK_EXCEPTION();
+ }
+ }
} else {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
@@ -3054,8 +3115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HA
zval *retval;
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
retval = EX_CONSTANT(opline->op1);
@@ -3137,7 +3197,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZE
zval *value, *arg;
- SAVE_OPLINE();
value = EX_CONSTANT(opline->op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
@@ -3155,8 +3214,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER
zval *value, *arg;
- SAVE_OPLINE();
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
+ SAVE_OPLINE();
zend_error(E_EXCEPTION | E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -3180,13 +3239,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_O
zval *val;
- SAVE_OPLINE();
val = EX_CONSTANT(opline->op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -3230,14 +3294,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
/* We are not handling overloaded classes right now */
- EX(call) = zend_vm_stack_push_call_frame(
+ zend_execute_data *call = zend_vm_stack_push_call_frame(
ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
- Z_OBJ(object_zval),
- EX(call));
+ Z_OBJ(object_zval));
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
if (EXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), &object_zval);
@@ -3524,7 +3589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
new_op_array->scope = EG(scope);
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
- (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL);
+ (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
@@ -3858,13 +3923,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
USE_OPLINE
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = EX_CONSTANT(opline->op1);
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_CONST == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
if (i_zend_is_true(value)) {
@@ -3875,9 +3942,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
}
} else if (IS_CONST == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_CONST == IS_VAR && is_ref) {
+ } else if (IS_CONST == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
-
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -3891,13 +3960,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZE
USE_OPLINE
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = EX_CONSTANT(opline->op1);
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_CONST == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
@@ -3909,9 +3980,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZE
}
} else if (IS_CONST == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_CONST == IS_VAR && is_ref) {
+ } else if (IS_CONST == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
-
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -3926,12 +3999,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(Z
zval *value;
- SAVE_OPLINE();
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();
+ }
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) {
ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value));
-
+ if (IS_CONST == IS_VAR) {
+ if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
+ efree_size(Z_REF_P(value), sizeof(zend_reference));
+ }
+ }
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (IS_CONST == IS_CONST) {
@@ -3945,6 +4026,93 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(execute_data);
+
+ zval *val;
+
+
+ SAVE_OPLINE();
+ val = EX_CONSTANT(opline->op1);
+
+ if (Z_TYPE_P(val) == IS_ARRAY) {
+ ZVAL_COPY_VALUE(&generator->values, val);
+ if (IS_CONST != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
+ Z_ADDREF_P(val);
+ }
+ Z_FE_POS(generator->values) = 0;
+
+ } else if (IS_CONST != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce == zend_ce_generator) {
+ zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
+
+ if (IS_CONST != IS_TMP_VAR) {
+ Z_ADDREF_P(val);
+ }
+
+ if (Z_ISUNDEF(new_gen->retval)) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently run");
+ HANDLE_EXCEPTION();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue");
+ HANDLE_EXCEPTION();
+ } else {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (!EG(exception)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZVAL_OBJ(&generator->values, &iter->std);
+ }
+ } else {
+ zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0);
+ HANDLE_EXCEPTION();
+ }
+
+ /* This is the default return value
+ * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -4038,7 +4206,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEN
USE_OPLINE
zend_constant *c;
- SAVE_OPLINE();
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
ZVAL_TRUE(EX_VAR(opline->result.var));
} else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op1), 0)) == NULL) {
@@ -4047,7 +4214,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEN
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), c);
ZVAL_TRUE(EX_VAR(opline->result.var));
}
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4059,22 +4225,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(Z
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -4082,10 +4248,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -4103,22 +4269,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(Z
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -4126,10 +4292,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -4147,25 +4313,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -4173,10 +4339,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -4209,8 +4375,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -4227,10 +4393,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -4324,19 +4490,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -4369,10 +4535,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -4392,19 +4558,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -4437,10 +4603,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -4460,29 +4626,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HA
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -4502,29 +4668,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -5137,6 +5303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -5251,8 +5418,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -5268,6 +5437,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
zend_function *func;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = EX_CONSTANT(opline->op2);
@@ -5283,6 +5454,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
@@ -5311,8 +5483,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- func, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -5326,19 +5500,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(
op1 = EX_CONSTANT(opline->op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -5367,10 +5541,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -6003,8 +6177,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -6187,8 +6360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -6717,8 +6889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -7086,6 +7257,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -7200,8 +7372,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -7594,8 +7768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -7736,22 +7909,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -7759,10 +7932,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -7780,22 +7953,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -7803,10 +7976,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -7824,25 +7997,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -7850,10 +8023,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -7886,8 +8059,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -7904,10 +8077,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -8001,19 +8174,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -8046,10 +8219,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -8069,19 +8242,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HAN
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -8114,10 +8287,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HAN
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -8137,29 +8310,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDL
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -8179,29 +8352,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -8594,6 +8767,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -8708,8 +8882,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -8725,6 +8901,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
zend_function *func;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
@@ -8740,6 +8918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
@@ -8768,8 +8947,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- func, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -8834,19 +9015,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEN
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -8875,10 +9056,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -9197,8 +9378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -9354,22 +9534,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -9377,10 +9557,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -9398,22 +9578,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -9421,10 +9601,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -9442,25 +9622,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -9468,10 +9648,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -9504,8 +9684,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -9522,10 +9702,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -9588,19 +9768,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -9633,10 +9813,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -9656,19 +9836,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -9701,10 +9881,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -9724,29 +9904,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_H
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -9766,29 +9946,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -10183,6 +10363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -10297,8 +10478,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10314,6 +10497,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
zend_function *func;
zend_class_entry *called_scope;
zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
@@ -10329,6 +10514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
@@ -10357,8 +10543,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- func, opline->extended_value, called_scope, object, EX(call));
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op2);
CHECK_EXCEPTION();
@@ -10373,19 +10561,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -10414,10 +10602,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -10755,11 +10943,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_O
zval *retval_ptr;
zend_free_op free_op1;
- SAVE_OPLINE();
retval_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
+ if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ CHECK_EXCEPTION();
+ }
if (!EX(return_value)) {
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_TMP_VAR ) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ zval_dtor_func_for_ptr(Z_COUNTED_P(free_op1));
+ CHECK_EXCEPTION();
+ }
+ }
} else {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
@@ -10858,8 +11056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_TMP_HAND
zval *retval;
zend_free_op free_op1;
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
retval = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
@@ -10941,7 +11138,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND
zval *value, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
@@ -10959,8 +11155,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(Z
zval *value, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
+ SAVE_OPLINE();
zend_error(E_EXCEPTION | E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -11354,7 +11550,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_END_SILENCE_SPEC_TMP_HANDLER(Z
{
USE_OPLINE
- SAVE_OPLINE();
if (!EG(error_reporting) && Z_LVAL_P(EX_VAR(opline->op1.var)) != 0) {
EG(error_reporting) = Z_LVAL_P(EX_VAR(opline->op1.var));
}
@@ -11366,13 +11561,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_TMP_VAR == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
if (i_zend_is_true(value)) {
@@ -11383,9 +11580,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
}
} else if (IS_TMP_VAR == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_TMP_VAR == IS_VAR && is_ref) {
+ } else if (IS_TMP_VAR == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- zval_ptr_dtor_nogc(free_op1);
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -11400,13 +11599,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_TMP_VAR == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
@@ -11418,9 +11619,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND
}
} else if (IS_TMP_VAR == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_TMP_VAR == IS_VAR && is_ref) {
+ } else if (IS_TMP_VAR == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- zval_ptr_dtor_nogc(free_op1);
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -11436,12 +11639,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEN
zend_free_op free_op1;
zval *value;
- SAVE_OPLINE();
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();
+ }
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) {
ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value));
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_TMP_VAR == IS_VAR) {
+ if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
+ efree_size(Z_REF_P(value), sizeof(zend_reference));
+ }
+ }
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (IS_TMP_VAR == IS_CONST) {
@@ -11455,6 +11666,94 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(execute_data);
+
+ zval *val;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ val = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
+
+ if (Z_TYPE_P(val) == IS_ARRAY) {
+ ZVAL_COPY_VALUE(&generator->values, val);
+ if (IS_TMP_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
+ Z_ADDREF_P(val);
+ }
+ Z_FE_POS(generator->values) = 0;
+
+ } else if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce == zend_ce_generator) {
+ zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
+
+ if (IS_TMP_VAR != IS_TMP_VAR) {
+ Z_ADDREF_P(val);
+ }
+
+ if (Z_ISUNDEF(new_gen->retval)) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently run");
+ HANDLE_EXCEPTION();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue");
+ HANDLE_EXCEPTION();
+ } else {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (!EG(exception)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZVAL_OBJ(&generator->values, &iter->std);
+ }
+ } else {
+ zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0);
+ HANDLE_EXCEPTION();
+ }
+
+ /* This is the default return value
+ * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -11890,8 +12189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -12059,8 +12357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -12228,8 +12525,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -12593,8 +12889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -13115,8 +13410,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -13787,11 +14081,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_O
zval *retval_ptr;
zend_free_op free_op1;
- SAVE_OPLINE();
retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ CHECK_EXCEPTION();
+ }
if (!EX(return_value)) {
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_VAR == IS_VAR || IS_VAR == IS_TMP_VAR ) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ zval_dtor_func_for_ptr(Z_COUNTED_P(free_op1));
+ CHECK_EXCEPTION();
+ }
+ }
} else {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
@@ -13891,8 +14195,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_VAR_HAND
zval *retval;
zend_free_op free_op1;
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
retval = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
@@ -13974,8 +14277,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND
zval *varptr, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_VAR == IS_CV) {
@@ -14006,8 +14313,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL
zend_free_op free_op1;
zval *varptr, *arg;
- SAVE_OPLINE();
-
if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) {
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
return ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -14015,6 +14320,11 @@ 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)) {
@@ -14027,14 +14337,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL
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);
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -14084,8 +14395,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(Z
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
return ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
- SAVE_OPLINE();
+
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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_VAR == IS_CV) {
@@ -14131,7 +14447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -14203,14 +14519,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
/* We are not handling overloaded classes right now */
- EX(call) = zend_vm_stack_push_call_frame(
+ zend_execute_data *call = zend_vm_stack_push_call_frame(
ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
(EXPECTED(RETURN_VALUE_USED(opline)) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
- Z_OBJ(object_zval),
- EX(call));
+ Z_OBJ(object_zval));
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
if (EXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), &object_zval);
@@ -14942,13 +15259,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_VAR == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
if (i_zend_is_true(value)) {
@@ -14959,9 +15278,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
}
} else if (IS_VAR == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_VAR == IS_VAR && is_ref) {
+ } else if (IS_VAR == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- zval_ptr_dtor_nogc(free_op1);
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -14976,13 +15297,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND
USE_OPLINE
zend_free_op free_op1;
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_VAR == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
@@ -14994,9 +15317,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND
}
} else if (IS_VAR == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_VAR == IS_VAR && is_ref) {
+ } else if (IS_VAR == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- zval_ptr_dtor_nogc(free_op1);
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -15012,12 +15337,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEN
zend_free_op free_op1;
zval *value;
- SAVE_OPLINE();
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();
+ }
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) {
ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value));
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_VAR == IS_VAR) {
+ if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
+ efree_size(Z_REF_P(value), sizeof(zend_reference));
+ }
+ }
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (IS_VAR == IS_CONST) {
@@ -15031,6 +15364,96 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(execute_data);
+
+ zval *val;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ val = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1);
+
+ if (Z_TYPE_P(val) == IS_ARRAY) {
+ ZVAL_COPY_VALUE(&generator->values, val);
+ if (IS_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
+ Z_ADDREF_P(val);
+ }
+ Z_FE_POS(generator->values) = 0;
+
+ zval_ptr_dtor_nogc(free_op1);
+ } else if (IS_VAR != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce == zend_ce_generator) {
+ zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
+
+ if (IS_VAR != IS_TMP_VAR) {
+ Z_ADDREF_P(val);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (Z_ISUNDEF(new_gen->retval)) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently run");
+ HANDLE_EXCEPTION();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue");
+ HANDLE_EXCEPTION();
+ } else {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (!EG(exception)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZVAL_OBJ(&generator->values, &iter->std);
+ }
+ } else {
+ zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0);
+ HANDLE_EXCEPTION();
+ }
+
+ /* This is the default return value
+ * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -15172,11 +15595,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -15602,11 +16025,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -15699,10 +16122,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -16241,6 +16664,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -16355,8 +16779,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16735,8 +17161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -16939,8 +17364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -17202,8 +17626,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -17836,6 +18259,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -17950,8 +18374,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -18145,7 +18571,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDL
USE_OPLINE
zval *var_ptr;
- SAVE_OPLINE();
var_ptr = EX_VAR(opline->op1.var);
if (Z_TYPE_P(var_ptr) != IS_OBJECT &&
!Z_ISREF_P(var_ptr) &&
@@ -18162,8 +18587,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -18391,11 +18815,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -18821,11 +19245,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -18918,10 +19342,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -19523,6 +19947,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -19637,8 +20062,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -19917,8 +20344,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -20120,11 +20546,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -20552,11 +20978,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -20650,10 +21076,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -21165,6 +21591,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
zend_class_entry *ce;
zend_object *object;
zend_function *fbc;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -21279,8 +21706,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
}
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -21734,11 +22163,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -22126,11 +22555,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -22223,10 +22652,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -22610,6 +23039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -22693,8 +23123,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
@@ -23141,8 +23573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -23279,8 +23710,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -23417,8 +23847,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -23930,8 +24359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -24127,11 +24555,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -24519,11 +24947,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -24616,10 +25044,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -25003,6 +25431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -25086,8 +25515,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
@@ -25434,8 +25865,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -25631,11 +26061,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -26024,11 +26454,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -26122,10 +26552,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -26512,6 +26942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -26595,8 +27026,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op2);
@@ -26962,13 +27395,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
zval *val;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -27184,14 +27622,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCO
zval *val;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -27199,6 +27640,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCO
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline++;
} else {
@@ -27217,14 +27659,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPC
zval *val;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
@@ -27232,6 +27678,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPC
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = OP_JMP_ADDR(opline, opline->op2);
} else {
@@ -27250,14 +27697,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OP
zval *val;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
- if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -27265,6 +27715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OP
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
} else {
@@ -27284,16 +27735,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O
zval *val;
int ret;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -27301,6 +27755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O
}
}
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
if (ret) {
@@ -27323,22 +27778,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_
zval *val;
int ret;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
}
}
+
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
if (ret) {
@@ -27358,13 +27819,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OP
{
USE_OPLINE
zval *retval_ptr;
+ zend_free_op free_op1;
-
- SAVE_OPLINE();
- retval_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ retval_ptr = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ CHECK_EXCEPTION();
+ }
if (!EX(return_value)) {
-
+ if (IS_CV == IS_VAR || IS_CV == IS_TMP_VAR ) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ zval_dtor_func_for_ptr(Z_COUNTED_P(free_op1));
+ CHECK_EXCEPTION();
+ }
+ }
} else {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
@@ -27463,8 +27934,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CV_HANDL
zval *retval;
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
retval = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
@@ -27546,8 +28016,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_
zval *varptr, *arg;
- SAVE_OPLINE();
- varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ 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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
@@ -27578,15 +28052,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLE
zval *varptr, *arg;
- SAVE_OPLINE();
-
if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND)) {
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
return ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
}
- varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ 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)) {
@@ -27599,14 +28076,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLE
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);
- CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -27655,8 +28133,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZE
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
return ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
- SAVE_OPLINE();
- varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+
+ 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();
+ }
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
@@ -27702,7 +28185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
@@ -27742,13 +28225,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
zval *val;
- SAVE_OPLINE();
- val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ val = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -28032,7 +28520,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
new_op_array->scope = EG(scope);
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
- (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL);
+ (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
@@ -28366,13 +28854,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
USE_OPLINE
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_CV == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
if (i_zend_is_true(value)) {
@@ -28383,9 +28873,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
}
} else if (IS_CV == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_CV == IS_VAR && is_ref) {
+ } else if (IS_CV == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
-
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -28399,13 +28891,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
USE_OPLINE
zval *value;
- int is_ref = 0;
+ zval *ref = NULL;
SAVE_OPLINE();
value = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) {
- is_ref = 1;
+ if (IS_CV == IS_VAR) {
+ ref = value;
+ }
value = Z_REFVAL_P(value);
}
@@ -28417,9 +28911,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
}
} else if (IS_CV == IS_CV) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- } else if (IS_CV == IS_VAR && is_ref) {
+ } else if (IS_CV == IS_VAR && ref) {
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
-
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
@@ -28434,12 +28930,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND
zval *value;
- SAVE_OPLINE();
- value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
+ 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();
+ }
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) {
ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value));
-
+ if (IS_CV == IS_VAR) {
+ if (UNEXPECTED(Z_DELREF_P(value) == 0)) {
+ efree_size(Z_REF_P(value), sizeof(zend_reference));
+ }
+ }
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (IS_CV == IS_CONST) {
@@ -28453,6 +28957,93 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(execute_data);
+
+ zval *val;
+
+
+ SAVE_OPLINE();
+ val = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var);
+
+ if (Z_TYPE_P(val) == IS_ARRAY) {
+ ZVAL_COPY_VALUE(&generator->values, val);
+ if (IS_CV != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) {
+ Z_ADDREF_P(val);
+ }
+ Z_FE_POS(generator->values) = 0;
+
+ } else if (IS_CV != IS_CONST && Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val)->get_iterator) {
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce == zend_ce_generator) {
+ zend_generator *new_gen = (zend_generator *) Z_OBJ_P(val);
+
+ if (IS_CV != IS_TMP_VAR) {
+ Z_ADDREF_P(val);
+ }
+
+ if (Z_ISUNDEF(new_gen->retval)) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently run");
+ HANDLE_EXCEPTION();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue");
+ HANDLE_EXCEPTION();
+ } else {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &new_gen->retval);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_object_iterator *iter = ce->get_iterator(ce, val, 0);
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (!EG(exception)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZVAL_OBJ(&generator->values, &iter->std);
+ }
+ } else {
+ zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0);
+ HANDLE_EXCEPTION();
+ }
+
+ /* This is the default return value
+ * when the expression is a Generator, it will be overwritten in zend_generator_resume() */
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -28549,22 +29140,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -28572,10 +29163,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -28593,22 +29184,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -28616,10 +29207,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -28637,25 +29228,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -28663,10 +29254,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -28699,8 +29290,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -28717,10 +29308,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -28814,19 +29405,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -28859,10 +29450,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -28882,19 +29473,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -28927,10 +29518,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -28950,29 +29541,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDL
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -28992,29 +29583,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CO
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -29165,11 +29756,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -29595,11 +30186,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -29692,10 +30283,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -30594,6 +31185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -30677,8 +31269,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
@@ -30693,19 +31287,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -30734,10 +31328,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -31411,8 +32005,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -31685,8 +32278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -32350,8 +32942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -33524,8 +34115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -33666,22 +34256,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OP
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -33689,10 +34279,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OP
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -33710,22 +34300,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OP
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -33733,10 +34323,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OP
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -33754,25 +34344,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OP
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -33780,10 +34370,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OP
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -33816,8 +34406,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -33834,10 +34424,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -33931,19 +34521,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -33976,10 +34566,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -33999,19 +34589,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -34044,10 +34634,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -34067,29 +34657,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -34109,29 +34699,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -34282,11 +34872,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -34712,11 +35302,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -34809,10 +35399,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -35553,6 +36143,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -35636,8 +36227,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
CHECK_EXCEPTION();
@@ -35652,19 +36245,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_O
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -35693,10 +36286,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_O
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -36150,8 +36743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
{
USE_OPLINE
- /* The generator object is stored in EX(return_value) */
- zend_generator *generator = (zend_generator *) EX(return_value);
+ zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
@@ -36312,22 +36904,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -36335,10 +36927,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -36356,22 +36948,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -36379,10 +36971,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -36400,25 +36992,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -36426,10 +37018,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -36462,8 +37054,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEN
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -36480,10 +37072,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEN
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -36546,19 +37138,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -36591,10 +37183,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -36614,19 +37206,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HA
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -36659,10 +37251,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HA
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -36682,29 +37274,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HAND
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -36724,29 +37316,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TM
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -36897,11 +37489,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
if (Z_OBJ_HT(obj)->read_property &&
(z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -37329,11 +37921,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -37427,10 +38019,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv);
- if (Z_REFCOUNT_P(z) == 0) {
- zend_objects_store_del(Z_OBJ_P(z));
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
ZVAL_COPY_VALUE(z, value);
}
@@ -38083,6 +38675,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -38166,8 +38759,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op2);
@@ -38183,19 +38778,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZE
op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -38224,10 +38819,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZE
}
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -38719,13 +39314,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z
zval *val;
zend_free_op free_op1;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -38768,14 +39368,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -38783,6 +39386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline++;
} else {
@@ -38801,14 +39405,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
@@ -38816,6 +39424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = OP_JMP_ADDR(opline, opline->op2);
} else {
@@ -38834,14 +39443,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEN
zend_free_op free_op1;
zval *val;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -38849,6 +39461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEN
}
}
+ SAVE_OPLINE();
if (i_zend_is_true(val)) {
opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
} else {
@@ -38868,16 +39481,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZE
zval *val;
int ret;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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);
+ }
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
} else {
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
@@ -38885,6 +39501,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZE
}
}
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
zval_ptr_dtor_nogc(free_op1);
if (ret) {
@@ -38907,22 +39524,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(Z
zval *val;
int ret;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } 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();
} else {
ZEND_VM_SET_NEXT_OPCODE(opline + 1);
ZEND_VM_CONTINUE();
}
}
+
+ SAVE_OPLINE();
ret = i_zend_is_true(val);
zval_ptr_dtor_nogc(free_op1);
if (ret) {
@@ -38969,13 +39592,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_
zval *val;
zend_free_op free_op1;
- SAVE_OPLINE();
val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (Z_TYPE_P(val) == IS_TRUE) {
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ 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();
@@ -39156,7 +39784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
new_op_array->scope = EG(scope);
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
- (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL);
+ (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
@@ -39267,22 +39895,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -39290,10 +39918,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -39311,22 +39939,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -39334,10 +39962,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -39355,25 +39983,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -39381,10 +40009,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -39417,8 +40045,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -39435,10 +40063,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -39501,19 +40129,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -39546,10 +40174,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -39569,19 +40197,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -39614,10 +40242,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -39637,29 +40265,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_H
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -39679,29 +40307,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -40157,6 +40785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -40240,8 +40869,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op1);
@@ -40257,19 +40888,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -40298,10 +40929,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -41495,22 +42126,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEN
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -41518,10 +42149,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEN
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -41539,22 +42170,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEN
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -41562,10 +42193,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEN
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -41583,25 +42214,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEN
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -41609,10 +42240,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEN
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -41645,8 +42276,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEN
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -41663,10 +42294,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEN
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -41729,19 +42360,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLE
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -41774,10 +42405,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLE
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -41797,19 +42428,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -41842,10 +42473,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HA
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -41865,29 +42496,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HAND
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -41907,29 +42538,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -42164,6 +42795,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -42247,8 +42879,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op1);
@@ -42264,19 +42898,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -42305,10 +42939,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -42512,22 +43146,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -42535,10 +43169,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
@@ -42556,22 +43190,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_sub_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -42579,10 +43213,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
@@ -42600,25 +43234,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
result = EX_VAR(opline->result.var);
ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
@@ -42626,10 +43260,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
@@ -42662,8 +43296,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
@@ -42680,10 +43314,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
@@ -42746,19 +43380,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -42791,10 +43425,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -42814,19 +43448,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) != Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -42859,10 +43493,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVA
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -42882,29 +43516,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) < Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -42924,29 +43558,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) <= Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -43182,6 +43816,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
zend_function *fbc;
zend_class_entry *called_scope;
zend_object *obj;
+ zend_execute_data *call;
SAVE_OPLINE();
@@ -43265,8 +43900,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, called_scope, obj, EX(call));
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
zval_ptr_dtor_nogc(free_op2);
zval_ptr_dtor_nogc(free_op1);
@@ -43283,19 +43920,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE
op1 = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
op2 = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_LVAL_P(op1) == Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), (double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_BOOL(EX_VAR(opline->result.var), Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
@@ -43324,10 +43961,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
@@ -47085,31 +47722,31 @@ void zend_init_opcodes_handlers(void)
ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
ZEND_DECLARE_FUNCTION_SPEC_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,
- ZEND_NULL_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,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 6b1720731d..5bbc390f5b 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -29,7 +29,7 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value
}
execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE,
- (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL);
+ (zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table();
} else {
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 2214cd9dc4..ff986d1855 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -164,7 +164,7 @@ const char *zend_vm_opcodes_map[171] = {
"ZEND_DECLARE_CLASS",
"ZEND_DECLARE_INHERITED_CLASS",
"ZEND_DECLARE_FUNCTION",
- NULL,
+ "ZEND_YIELD_FROM",
"ZEND_DECLARE_CONST",
"ZEND_ADD_INTERFACE",
"ZEND_DECLARE_INHERITED_CLASS_DELAYED",
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index 8b9321a991..edee61f6c9 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -173,6 +173,7 @@ END_EXTERN_C()
#define ZEND_DECLARE_CLASS 139
#define ZEND_DECLARE_INHERITED_CLASS 140
#define ZEND_DECLARE_FUNCTION 141
+#define ZEND_YIELD_FROM 142
#define ZEND_DECLARE_CONST 143
#define ZEND_ADD_INTERFACE 144
#define ZEND_DECLARE_INHERITED_CLASS_DELAYED 145
diff --git a/configure.in b/configure.in
index 4575405403..ffc714ff5f 100644
--- a/configure.in
+++ b/configure.in
@@ -1494,7 +1494,7 @@ PHP_ADD_SOURCES(Zend, \
zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \
zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c \
zend_virtual_cwd.c zend_ast.c zend_objects.c zend_object_handlers.c zend_objects_API.c \
- zend_default_classes.c zend_inheritance.c, \
+ zend_default_classes.c zend_inheritance.c zend_smart_str.c, \
-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
dnl Selectively disable optimization due to high RAM usage during
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index a51c03f47f..bf8d2f00eb 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1345,6 +1345,7 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
php_error_docref(NULL, E_WARNING, "Could not call the CURLOPT_WRITEFUNCTION");
length = -1;
} else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
if (Z_TYPE(retval) != IS_LONG) {
convert_to_long_ex(&retval);
}
@@ -1397,6 +1398,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
if (error == FAILURE) {
php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_FNMATCH_FUNCTION");
} else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
if (Z_TYPE(retval) != IS_LONG) {
convert_to_long_ex(&retval);
}
@@ -1456,6 +1458,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
if (error == FAILURE) {
php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_PROGRESSFUNCTION");
} else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
if (Z_TYPE(retval) != IS_LONG) {
convert_to_long_ex(&retval);
}
@@ -1524,6 +1527,7 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
length = CURL_READFUNC_ABORT;
#endif
} else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
if (Z_TYPE(retval) == IS_STRING) {
length = MIN((int) (size * nmemb), Z_STRLEN(retval));
memcpy(data, Z_STRVAL(retval), length);
@@ -1589,6 +1593,7 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
php_error_docref(NULL, E_WARNING, "Could not call the CURLOPT_HEADERFUNCTION");
length = -1;
} else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
if (Z_TYPE(retval) != IS_LONG) {
convert_to_long_ex(&retval);
}
diff --git a/ext/curl/tests/bug69316.phpt b/ext/curl/tests/bug69316.phpt
new file mode 100644
index 0000000000..16a655eef8
--- /dev/null
+++ b/ext/curl/tests/bug69316.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Bug #69316: Use-after-free in php_curl related to CURLOPT_FILE/_INFILE/_WRITEHEADER
+--SKIPIF--
+<?php include 'skipif.inc'; ?>
+--FILE--
+<?php
+ function hdr_callback($ch, $data) {
+ // close the stream, causing the FILE structure to be free()'d
+ if($GLOBALS['f_file']) {
+ fclose($GLOBALS['f_file']); $GLOBALS['f_file'] = 0;
+
+ // cause an allocation of approx the same size as a FILE structure, size varies a bit depending on platform/libc
+ $FILE_size = (PHP_INT_SIZE == 4 ? 0x160 : 0x238);
+ curl_setopt($ch, CURLOPT_COOKIE, str_repeat("a", $FILE_size - 1));
+ }
+ return strlen($data);
+ }
+
+ include 'server.inc';
+ $host = curl_cli_server_start();
+ $temp_file = dirname(__FILE__) . '/body.tmp';
+ $url = "{$host}/get.php?test=getpost";
+ $ch = curl_init();
+ $f_file = fopen($temp_file, "w") or die("failed to open file\n");
+ curl_setopt($ch, CURLOPT_BUFFERSIZE, 10);
+ curl_setopt($ch, CURLOPT_HEADERFUNCTION, "hdr_callback");
+ curl_setopt($ch, CURLOPT_FILE, $f_file);
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_exec($ch);
+ curl_close($ch);
+?>
+===DONE===
+--CLEAN--
+<?php
+unlink(dirname(__FILE__) . '/body.tmp');
+?>
+--EXPECTF--
+Warning: curl_exec(): CURLOPT_FILE resource has gone away, resetting to default in %s on line %d
+array(1) {
+ ["test"]=>
+ string(7) "getpost"
+}
+array(0) {
+}
+===DONE===
diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h
index 4efb251910..be13c3c750 100644
--- a/ext/date/lib/timezonedb.h
+++ b/ext/date/lib/timezonedb.h
@@ -193,398 +193,398 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[583] = {
{ "America/Santa_Isabel" , 0x01391C },
{ "America/Santarem" , 0x013CBF },
{ "America/Santiago" , 0x013DC4 },
- { "America/Santo_Domingo" , 0x014094 },
- { "America/Sao_Paulo" , 0x01415A },
- { "America/Scoresbysund" , 0x014469 },
- { "America/Shiprock" , 0x014757 },
- { "America/Sitka" , 0x014AD0 },
- { "America/St_Barthelemy" , 0x014E58 },
- { "America/St_Johns" , 0x014EAD },
- { "America/St_Kitts" , 0x015400 },
- { "America/St_Lucia" , 0x015455 },
- { "America/St_Thomas" , 0x0154AA },
- { "America/St_Vincent" , 0x0154FF },
- { "America/Swift_Current" , 0x015554 },
- { "America/Tegucigalpa" , 0x015675 },
- { "America/Thule" , 0x0156F4 },
- { "America/Thunder_Bay" , 0x01593B },
- { "America/Tijuana" , 0x015C84 },
- { "America/Toronto" , 0x01601D },
- { "America/Tortola" , 0x01653D },
- { "America/Vancouver" , 0x016592 },
- { "America/Virgin" , 0x0169CF },
- { "America/Whitehorse" , 0x016A24 },
- { "America/Winnipeg" , 0x016D41 },
- { "America/Yakutat" , 0x017181 },
- { "America/Yellowknife" , 0x0174EC },
- { "Antarctica/Casey" , 0x0177FC },
- { "Antarctica/Davis" , 0x01789A },
- { "Antarctica/DumontDUrville" , 0x01793B },
- { "Antarctica/Macquarie" , 0x0179CC },
- { "Antarctica/Mawson" , 0x017C19 },
- { "Antarctica/McMurdo" , 0x017C95 },
- { "Antarctica/Palmer" , 0x018040 },
- { "Antarctica/Rothera" , 0x018283 },
- { "Antarctica/South_Pole" , 0x0182F9 },
- { "Antarctica/Syowa" , 0x018677 },
- { "Antarctica/Troll" , 0x0186E5 },
- { "Antarctica/Vostok" , 0x0188B7 },
- { "Arctic/Longyearbyen" , 0x018928 },
- { "Asia/Aden" , 0x018C5A },
- { "Asia/Almaty" , 0x018CAF },
- { "Asia/Amman" , 0x018E2E },
- { "Asia/Anadyr" , 0x0190E4 },
- { "Asia/Aqtau" , 0x0192E6 },
- { "Asia/Aqtobe" , 0x0194E5 },
- { "Asia/Ashgabat" , 0x01969D },
- { "Asia/Ashkhabad" , 0x0197BA },
- { "Asia/Baghdad" , 0x0198D7 },
- { "Asia/Bahrain" , 0x019A4C },
- { "Asia/Baku" , 0x019AB2 },
- { "Asia/Bangkok" , 0x019D9A },
- { "Asia/Beirut" , 0x019DEF },
- { "Asia/Bishkek" , 0x01A0FC },
- { "Asia/Brunei" , 0x01A2A8 },
- { "Asia/Calcutta" , 0x01A30A },
- { "Asia/Chita" , 0x01A383 },
- { "Asia/Choibalsan" , 0x01A598 },
- { "Asia/Chongqing" , 0x01A7FF },
- { "Asia/Chungking" , 0x01A89F },
- { "Asia/Colombo" , 0x01A93F },
- { "Asia/Dacca" , 0x01A9DB },
- { "Asia/Damascus" , 0x01AA81 },
- { "Asia/Dhaka" , 0x01ADD1 },
- { "Asia/Dili" , 0x01AE77 },
- { "Asia/Dubai" , 0x01AF01 },
- { "Asia/Dushanbe" , 0x01AF56 },
- { "Asia/Gaza" , 0x01B059 },
- { "Asia/Harbin" , 0x01B3AC },
- { "Asia/Hebron" , 0x01B44C },
- { "Asia/Ho_Chi_Minh" , 0x01B7A8 },
- { "Asia/Hong_Kong" , 0x01B84A },
- { "Asia/Hovd" , 0x01BA0C },
- { "Asia/Irkutsk" , 0x01BC6A },
- { "Asia/Istanbul" , 0x01BE55 },
- { "Asia/Jakarta" , 0x01C242 },
- { "Asia/Jayapura" , 0x01C2EC },
- { "Asia/Jerusalem" , 0x01C389 },
- { "Asia/Kabul" , 0x01C6B8 },
- { "Asia/Kamchatka" , 0x01C709 },
- { "Asia/Karachi" , 0x01C902 },
- { "Asia/Kashgar" , 0x01C9B7 },
- { "Asia/Kathmandu" , 0x01CA0C },
- { "Asia/Katmandu" , 0x01CA72 },
- { "Asia/Khandyga" , 0x01CAD8 },
- { "Asia/Kolkata" , 0x01CD02 },
- { "Asia/Krasnoyarsk" , 0x01CD7B },
- { "Asia/Kuala_Lumpur" , 0x01CF68 },
- { "Asia/Kuching" , 0x01D025 },
- { "Asia/Kuwait" , 0x01D113 },
- { "Asia/Macao" , 0x01D168 },
- { "Asia/Macau" , 0x01D2A3 },
- { "Asia/Magadan" , 0x01D3DE },
- { "Asia/Makassar" , 0x01D5E2 },
- { "Asia/Manila" , 0x01D6A7 },
- { "Asia/Muscat" , 0x01D72C },
- { "Asia/Nicosia" , 0x01D781 },
- { "Asia/Novokuznetsk" , 0x01DA69 },
- { "Asia/Novosibirsk" , 0x01DC89 },
- { "Asia/Omsk" , 0x01DE79 },
- { "Asia/Oral" , 0x01E065 },
- { "Asia/Phnom_Penh" , 0x01E235 },
- { "Asia/Pontianak" , 0x01E28A },
- { "Asia/Pyongyang" , 0x01E34C },
- { "Asia/Qatar" , 0x01E3D1 },
- { "Asia/Qyzylorda" , 0x01E437 },
- { "Asia/Rangoon" , 0x01E60D },
- { "Asia/Riyadh" , 0x01E685 },
- { "Asia/Saigon" , 0x01E6DA },
- { "Asia/Sakhalin" , 0x01E77C },
- { "Asia/Samarkand" , 0x01E979 },
- { "Asia/Seoul" , 0x01EAAF },
- { "Asia/Shanghai" , 0x01EBA2 },
- { "Asia/Singapore" , 0x01EC4E },
- { "Asia/Srednekolymsk" , 0x01ED05 },
- { "Asia/Taipei" , 0x01EF05 },
- { "Asia/Tashkent" , 0x01F036 },
- { "Asia/Tbilisi" , 0x01F167 },
- { "Asia/Tehran" , 0x01F321 },
- { "Asia/Tel_Aviv" , 0x01F58F },
- { "Asia/Thimbu" , 0x01F8BE },
- { "Asia/Thimphu" , 0x01F924 },
- { "Asia/Tokyo" , 0x01F98A },
- { "Asia/Ujung_Pandang" , 0x01FA14 },
- { "Asia/Ulaanbaatar" , 0x01FA91 },
- { "Asia/Ulan_Bator" , 0x01FCD2 },
- { "Asia/Urumqi" , 0x01FF05 },
- { "Asia/Ust-Nera" , 0x01FF67 },
- { "Asia/Vientiane" , 0x020179 },
- { "Asia/Vladivostok" , 0x0201CE },
- { "Asia/Yakutsk" , 0x0203B8 },
- { "Asia/Yekaterinburg" , 0x0205A2 },
- { "Asia/Yerevan" , 0x0207C3 },
- { "Atlantic/Azores" , 0x0209C3 },
- { "Atlantic/Bermuda" , 0x020EC6 },
- { "Atlantic/Canary" , 0x0211A7 },
- { "Atlantic/Cape_Verde" , 0x02147D },
- { "Atlantic/Faeroe" , 0x0214F6 },
- { "Atlantic/Faroe" , 0x02179A },
- { "Atlantic/Jan_Mayen" , 0x021A3E },
- { "Atlantic/Madeira" , 0x021D70 },
- { "Atlantic/Reykjavik" , 0x022279 },
- { "Atlantic/South_Georgia" , 0x022446 },
- { "Atlantic/St_Helena" , 0x022658 },
- { "Atlantic/Stanley" , 0x02248A },
- { "Australia/ACT" , 0x0226AD },
- { "Australia/Adelaide" , 0x0229D0 },
- { "Australia/Brisbane" , 0x022D02 },
- { "Australia/Broken_Hill" , 0x022DCF },
- { "Australia/Canberra" , 0x023113 },
- { "Australia/Currie" , 0x023436 },
- { "Australia/Darwin" , 0x02376F },
- { "Australia/Eucla" , 0x0237FB },
- { "Australia/Hobart" , 0x0238D7 },
- { "Australia/LHI" , 0x023C3B },
- { "Australia/Lindeman" , 0x023EDC },
- { "Australia/Lord_Howe" , 0x023FC3 },
- { "Australia/Melbourne" , 0x024274 },
- { "Australia/North" , 0x02459F },
- { "Australia/NSW" , 0x024619 },
- { "Australia/Perth" , 0x02493C },
- { "Australia/Queensland" , 0x024A1A },
- { "Australia/South" , 0x024ACC },
- { "Australia/Sydney" , 0x024DEF },
- { "Australia/Tasmania" , 0x025132 },
- { "Australia/Victoria" , 0x02547D },
- { "Australia/West" , 0x0257A0 },
- { "Australia/Yancowinna" , 0x02585C },
- { "Brazil/Acre" , 0x025B84 },
- { "Brazil/DeNoronha" , 0x025C88 },
- { "Brazil/East" , 0x025DA8 },
- { "Brazil/West" , 0x026085 },
- { "Canada/Atlantic" , 0x02617D },
- { "Canada/Central" , 0x026665 },
- { "Canada/East-Saskatchewan" , 0x026F6F },
- { "Canada/Eastern" , 0x026A7F },
- { "Canada/Mountain" , 0x0270F8 },
- { "Canada/Newfoundland" , 0x02746E },
- { "Canada/Pacific" , 0x027999 },
- { "Canada/Saskatchewan" , 0x027DB2 },
- { "Canada/Yukon" , 0x027F3B },
- { "CET" , 0x02823E },
- { "Chile/Continental" , 0x028547 },
- { "Chile/EasterIsland" , 0x028809 },
- { "CST6CDT" , 0x028A72 },
- { "Cuba" , 0x028DC3 },
- { "EET" , 0x029136 },
- { "Egypt" , 0x0293E9 },
- { "Eire" , 0x0297D0 },
- { "EST" , 0x029CE1 },
- { "EST5EDT" , 0x029D25 },
- { "Etc/GMT" , 0x02A076 },
- { "Etc/GMT+0" , 0x02A142 },
- { "Etc/GMT+1" , 0x02A1CC },
- { "Etc/GMT+10" , 0x02A259 },
- { "Etc/GMT+11" , 0x02A2E7 },
- { "Etc/GMT+12" , 0x02A375 },
- { "Etc/GMT+2" , 0x02A490 },
- { "Etc/GMT+3" , 0x02A51C },
- { "Etc/GMT+4" , 0x02A5A8 },
- { "Etc/GMT+5" , 0x02A634 },
- { "Etc/GMT+6" , 0x02A6C0 },
- { "Etc/GMT+7" , 0x02A74C },
- { "Etc/GMT+8" , 0x02A7D8 },
- { "Etc/GMT+9" , 0x02A864 },
- { "Etc/GMT-0" , 0x02A0FE },
- { "Etc/GMT-1" , 0x02A186 },
- { "Etc/GMT-10" , 0x02A212 },
- { "Etc/GMT-11" , 0x02A2A0 },
- { "Etc/GMT-12" , 0x02A32E },
- { "Etc/GMT-13" , 0x02A3BC },
- { "Etc/GMT-14" , 0x02A403 },
- { "Etc/GMT-2" , 0x02A44A },
- { "Etc/GMT-3" , 0x02A4D6 },
- { "Etc/GMT-4" , 0x02A562 },
- { "Etc/GMT-5" , 0x02A5EE },
- { "Etc/GMT-6" , 0x02A67A },
- { "Etc/GMT-7" , 0x02A706 },
- { "Etc/GMT-8" , 0x02A792 },
- { "Etc/GMT-9" , 0x02A81E },
- { "Etc/GMT0" , 0x02A0BA },
- { "Etc/Greenwich" , 0x02A8AA },
- { "Etc/UCT" , 0x02A8EE },
- { "Etc/Universal" , 0x02A932 },
- { "Etc/UTC" , 0x02A976 },
- { "Etc/Zulu" , 0x02A9BA },
- { "Europe/Amsterdam" , 0x02A9FE },
- { "Europe/Andorra" , 0x02AE3C },
- { "Europe/Athens" , 0x02B0B8 },
- { "Europe/Belfast" , 0x02B3FB },
- { "Europe/Belgrade" , 0x02B932 },
- { "Europe/Berlin" , 0x02BBFB },
- { "Europe/Bratislava" , 0x02BF5F },
- { "Europe/Brussels" , 0x02C291 },
- { "Europe/Bucharest" , 0x02C6C8 },
- { "Europe/Budapest" , 0x02C9F2 },
- { "Europe/Busingen" , 0x02CD5B },
- { "Europe/Chisinau" , 0x02D012 },
- { "Europe/Copenhagen" , 0x02D3A0 },
- { "Europe/Dublin" , 0x02D6AA },
- { "Europe/Gibraltar" , 0x02DBBB },
- { "Europe/Guernsey" , 0x02E012 },
- { "Europe/Helsinki" , 0x02E549 },
- { "Europe/Isle_of_Man" , 0x02E7FF },
- { "Europe/Istanbul" , 0x02ED36 },
- { "Europe/Jersey" , 0x02F123 },
- { "Europe/Kaliningrad" , 0x02F65A },
- { "Europe/Kiev" , 0x02F8C5 },
- { "Europe/Lisbon" , 0x02FBE1 },
- { "Europe/Ljubljana" , 0x0300E5 },
- { "Europe/London" , 0x0303AE },
- { "Europe/Luxembourg" , 0x0308E5 },
- { "Europe/Madrid" , 0x030D3B },
- { "Europe/Malta" , 0x031101 },
- { "Europe/Mariehamn" , 0x0314BA },
- { "Europe/Minsk" , 0x031770 },
- { "Europe/Monaco" , 0x031983 },
- { "Europe/Moscow" , 0x031DBE },
- { "Europe/Nicosia" , 0x032018 },
- { "Europe/Oslo" , 0x032300 },
- { "Europe/Paris" , 0x032632 },
- { "Europe/Podgorica" , 0x032A78 },
- { "Europe/Prague" , 0x032D41 },
- { "Europe/Riga" , 0x033073 },
- { "Europe/Rome" , 0x0333B8 },
- { "Europe/Samara" , 0x03377B },
- { "Europe/San_Marino" , 0x0339E4 },
- { "Europe/Sarajevo" , 0x033DA7 },
- { "Europe/Simferopol" , 0x034070 },
- { "Europe/Skopje" , 0x0342C1 },
- { "Europe/Sofia" , 0x03458A },
- { "Europe/Stockholm" , 0x034892 },
- { "Europe/Tallinn" , 0x034B41 },
- { "Europe/Tirane" , 0x034E7B },
- { "Europe/Tiraspol" , 0x035181 },
- { "Europe/Uzhgorod" , 0x03550F },
- { "Europe/Vaduz" , 0x035826 },
- { "Europe/Vatican" , 0x035AD5 },
- { "Europe/Vienna" , 0x035E98 },
- { "Europe/Vilnius" , 0x0361C5 },
- { "Europe/Volgograd" , 0x036504 },
- { "Europe/Warsaw" , 0x036729 },
- { "Europe/Zagreb" , 0x036B0A },
- { "Europe/Zaporozhye" , 0x036DD3 },
- { "Europe/Zurich" , 0x037114 },
- { "Factory" , 0x0373C3 },
- { "GB" , 0x037434 },
- { "GB-Eire" , 0x03796B },
- { "GMT" , 0x037EA2 },
- { "GMT+0" , 0x037F6E },
- { "GMT-0" , 0x037F2A },
- { "GMT0" , 0x037EE6 },
- { "Greenwich" , 0x037FB2 },
- { "Hongkong" , 0x037FF6 },
- { "HST" , 0x0381B8 },
- { "Iceland" , 0x0381FC },
- { "Indian/Antananarivo" , 0x0383C9 },
- { "Indian/Chagos" , 0x038448 },
- { "Indian/Christmas" , 0x0384AA },
- { "Indian/Cocos" , 0x0384EE },
- { "Indian/Comoro" , 0x038532 },
- { "Indian/Kerguelen" , 0x0385B1 },
- { "Indian/Mahe" , 0x038606 },
- { "Indian/Maldives" , 0x03865B },
- { "Indian/Mauritius" , 0x0386B0 },
- { "Indian/Mayotte" , 0x038726 },
- { "Indian/Reunion" , 0x0387A5 },
- { "Iran" , 0x0387FA },
- { "Israel" , 0x038A68 },
- { "Jamaica" , 0x038D97 },
- { "Japan" , 0x038E5C },
- { "Kwajalein" , 0x038EE6 },
- { "Libya" , 0x038F49 },
- { "MET" , 0x039052 },
- { "Mexico/BajaNorte" , 0x03935B },
- { "Mexico/BajaSur" , 0x0396C4 },
- { "Mexico/General" , 0x039909 },
- { "MST" , 0x039B67 },
- { "MST7MDT" , 0x039BAB },
- { "Navajo" , 0x039EFC },
- { "NZ" , 0x03A275 },
- { "NZ-CHAT" , 0x03A5F3 },
- { "Pacific/Apia" , 0x03A8D7 },
- { "Pacific/Auckland" , 0x03AA73 },
- { "Pacific/Bougainville" , 0x03ADFF },
- { "Pacific/Chatham" , 0x03AE76 },
- { "Pacific/Chuuk" , 0x03B169 },
- { "Pacific/Easter" , 0x03B1C2 },
- { "Pacific/Efate" , 0x03B438 },
- { "Pacific/Enderbury" , 0x03B4FE },
- { "Pacific/Fakaofo" , 0x03B56C },
- { "Pacific/Fiji" , 0x03B5BD },
- { "Pacific/Funafuti" , 0x03B750 },
- { "Pacific/Galapagos" , 0x03B794 },
- { "Pacific/Gambier" , 0x03B80C },
- { "Pacific/Guadalcanal" , 0x03B871 },
- { "Pacific/Guam" , 0x03B8C6 },
- { "Pacific/Honolulu" , 0x03B91C },
- { "Pacific/Johnston" , 0x03B993 },
- { "Pacific/Kiritimati" , 0x03BA12 },
- { "Pacific/Kosrae" , 0x03BA7D },
- { "Pacific/Kwajalein" , 0x03BADA },
- { "Pacific/Majuro" , 0x03BB46 },
- { "Pacific/Marquesas" , 0x03BBA5 },
- { "Pacific/Midway" , 0x03BC0C },
- { "Pacific/Nauru" , 0x03BC91 },
- { "Pacific/Niue" , 0x03BD09 },
- { "Pacific/Norfolk" , 0x03BD67 },
- { "Pacific/Noumea" , 0x03BDBC },
- { "Pacific/Pago_Pago" , 0x03BE4C },
- { "Pacific/Palau" , 0x03BEC3 },
- { "Pacific/Pitcairn" , 0x03BF07 },
- { "Pacific/Pohnpei" , 0x03BF5C },
- { "Pacific/Ponape" , 0x03BFB1 },
- { "Pacific/Port_Moresby" , 0x03BFF6 },
- { "Pacific/Rarotonga" , 0x03C048 },
- { "Pacific/Saipan" , 0x03C124 },
- { "Pacific/Samoa" , 0x03C17A },
- { "Pacific/Tahiti" , 0x03C1F1 },
- { "Pacific/Tarawa" , 0x03C256 },
- { "Pacific/Tongatapu" , 0x03C2AA },
- { "Pacific/Truk" , 0x03C336 },
- { "Pacific/Wake" , 0x03C37B },
- { "Pacific/Wallis" , 0x03C3CB },
- { "Pacific/Yap" , 0x03C40F },
- { "Poland" , 0x03C454 },
- { "Portugal" , 0x03C835 },
- { "PRC" , 0x03CD31 },
- { "PST8PDT" , 0x03CDD1 },
- { "ROC" , 0x03D122 },
- { "ROK" , 0x03D253 },
- { "Singapore" , 0x03D346 },
- { "Turkey" , 0x03D3FD },
- { "UCT" , 0x03D7EA },
- { "Universal" , 0x03D82E },
- { "US/Alaska" , 0x03D872 },
- { "US/Aleutian" , 0x03DBDB },
- { "US/Arizona" , 0x03DF41 },
- { "US/Central" , 0x03DFCF },
- { "US/East-Indiana" , 0x03E9D9 },
- { "US/Eastern" , 0x03E4DA },
- { "US/Hawaii" , 0x03EC43 },
- { "US/Indiana-Starke" , 0x03ECB4 },
- { "US/Michigan" , 0x03F025 },
- { "US/Mountain" , 0x03F35C },
- { "US/Pacific" , 0x03F6D5 },
- { "US/Pacific-New" , 0x03FADA },
- { "US/Samoa" , 0x03FEDF },
- { "UTC" , 0x03FF56 },
- { "W-SU" , 0x04024D },
- { "WET" , 0x03FF9A },
- { "Zulu" , 0x040490 },
+ { "America/Santo_Domingo" , 0x014096 },
+ { "America/Sao_Paulo" , 0x01415C },
+ { "America/Scoresbysund" , 0x01446B },
+ { "America/Shiprock" , 0x014759 },
+ { "America/Sitka" , 0x014AD2 },
+ { "America/St_Barthelemy" , 0x014E5A },
+ { "America/St_Johns" , 0x014EAF },
+ { "America/St_Kitts" , 0x015402 },
+ { "America/St_Lucia" , 0x015457 },
+ { "America/St_Thomas" , 0x0154AC },
+ { "America/St_Vincent" , 0x015501 },
+ { "America/Swift_Current" , 0x015556 },
+ { "America/Tegucigalpa" , 0x015677 },
+ { "America/Thule" , 0x0156F6 },
+ { "America/Thunder_Bay" , 0x01593D },
+ { "America/Tijuana" , 0x015C86 },
+ { "America/Toronto" , 0x01601F },
+ { "America/Tortola" , 0x01653F },
+ { "America/Vancouver" , 0x016594 },
+ { "America/Virgin" , 0x0169D1 },
+ { "America/Whitehorse" , 0x016A26 },
+ { "America/Winnipeg" , 0x016D43 },
+ { "America/Yakutat" , 0x017183 },
+ { "America/Yellowknife" , 0x0174EE },
+ { "Antarctica/Casey" , 0x0177FE },
+ { "Antarctica/Davis" , 0x01789C },
+ { "Antarctica/DumontDUrville" , 0x01793D },
+ { "Antarctica/Macquarie" , 0x0179CE },
+ { "Antarctica/Mawson" , 0x017C1B },
+ { "Antarctica/McMurdo" , 0x017C97 },
+ { "Antarctica/Palmer" , 0x018042 },
+ { "Antarctica/Rothera" , 0x018285 },
+ { "Antarctica/South_Pole" , 0x0182FB },
+ { "Antarctica/Syowa" , 0x018679 },
+ { "Antarctica/Troll" , 0x0186E7 },
+ { "Antarctica/Vostok" , 0x0188B9 },
+ { "Arctic/Longyearbyen" , 0x01892A },
+ { "Asia/Aden" , 0x018C5C },
+ { "Asia/Almaty" , 0x018CB1 },
+ { "Asia/Amman" , 0x018E30 },
+ { "Asia/Anadyr" , 0x0190E6 },
+ { "Asia/Aqtau" , 0x0192E8 },
+ { "Asia/Aqtobe" , 0x0194E7 },
+ { "Asia/Ashgabat" , 0x01969F },
+ { "Asia/Ashkhabad" , 0x0197BC },
+ { "Asia/Baghdad" , 0x0198D9 },
+ { "Asia/Bahrain" , 0x019A4E },
+ { "Asia/Baku" , 0x019AB4 },
+ { "Asia/Bangkok" , 0x019D9C },
+ { "Asia/Beirut" , 0x019DF1 },
+ { "Asia/Bishkek" , 0x01A0FE },
+ { "Asia/Brunei" , 0x01A2AA },
+ { "Asia/Calcutta" , 0x01A30C },
+ { "Asia/Chita" , 0x01A385 },
+ { "Asia/Choibalsan" , 0x01A59A },
+ { "Asia/Chongqing" , 0x01A801 },
+ { "Asia/Chungking" , 0x01A8A1 },
+ { "Asia/Colombo" , 0x01A941 },
+ { "Asia/Dacca" , 0x01A9DD },
+ { "Asia/Damascus" , 0x01AA83 },
+ { "Asia/Dhaka" , 0x01ADD3 },
+ { "Asia/Dili" , 0x01AE79 },
+ { "Asia/Dubai" , 0x01AF03 },
+ { "Asia/Dushanbe" , 0x01AF58 },
+ { "Asia/Gaza" , 0x01B05B },
+ { "Asia/Harbin" , 0x01B3AE },
+ { "Asia/Hebron" , 0x01B44E },
+ { "Asia/Ho_Chi_Minh" , 0x01B7AA },
+ { "Asia/Hong_Kong" , 0x01B84C },
+ { "Asia/Hovd" , 0x01BA0E },
+ { "Asia/Irkutsk" , 0x01BC6C },
+ { "Asia/Istanbul" , 0x01BE57 },
+ { "Asia/Jakarta" , 0x01C244 },
+ { "Asia/Jayapura" , 0x01C2EE },
+ { "Asia/Jerusalem" , 0x01C38B },
+ { "Asia/Kabul" , 0x01C6BA },
+ { "Asia/Kamchatka" , 0x01C70B },
+ { "Asia/Karachi" , 0x01C904 },
+ { "Asia/Kashgar" , 0x01C9B9 },
+ { "Asia/Kathmandu" , 0x01CA0E },
+ { "Asia/Katmandu" , 0x01CA74 },
+ { "Asia/Khandyga" , 0x01CADA },
+ { "Asia/Kolkata" , 0x01CD04 },
+ { "Asia/Krasnoyarsk" , 0x01CD7D },
+ { "Asia/Kuala_Lumpur" , 0x01CF6A },
+ { "Asia/Kuching" , 0x01D027 },
+ { "Asia/Kuwait" , 0x01D115 },
+ { "Asia/Macao" , 0x01D16A },
+ { "Asia/Macau" , 0x01D2A5 },
+ { "Asia/Magadan" , 0x01D3E0 },
+ { "Asia/Makassar" , 0x01D5E4 },
+ { "Asia/Manila" , 0x01D6A9 },
+ { "Asia/Muscat" , 0x01D72E },
+ { "Asia/Nicosia" , 0x01D783 },
+ { "Asia/Novokuznetsk" , 0x01DA6B },
+ { "Asia/Novosibirsk" , 0x01DC8B },
+ { "Asia/Omsk" , 0x01DE7B },
+ { "Asia/Oral" , 0x01E067 },
+ { "Asia/Phnom_Penh" , 0x01E237 },
+ { "Asia/Pontianak" , 0x01E28C },
+ { "Asia/Pyongyang" , 0x01E34E },
+ { "Asia/Qatar" , 0x01E3D3 },
+ { "Asia/Qyzylorda" , 0x01E439 },
+ { "Asia/Rangoon" , 0x01E60F },
+ { "Asia/Riyadh" , 0x01E687 },
+ { "Asia/Saigon" , 0x01E6DC },
+ { "Asia/Sakhalin" , 0x01E77E },
+ { "Asia/Samarkand" , 0x01E97B },
+ { "Asia/Seoul" , 0x01EAB1 },
+ { "Asia/Shanghai" , 0x01EBA4 },
+ { "Asia/Singapore" , 0x01EC50 },
+ { "Asia/Srednekolymsk" , 0x01ED07 },
+ { "Asia/Taipei" , 0x01EF07 },
+ { "Asia/Tashkent" , 0x01F038 },
+ { "Asia/Tbilisi" , 0x01F169 },
+ { "Asia/Tehran" , 0x01F323 },
+ { "Asia/Tel_Aviv" , 0x01F591 },
+ { "Asia/Thimbu" , 0x01F8C0 },
+ { "Asia/Thimphu" , 0x01F926 },
+ { "Asia/Tokyo" , 0x01F98C },
+ { "Asia/Ujung_Pandang" , 0x01FA16 },
+ { "Asia/Ulaanbaatar" , 0x01FA93 },
+ { "Asia/Ulan_Bator" , 0x01FCD4 },
+ { "Asia/Urumqi" , 0x01FF07 },
+ { "Asia/Ust-Nera" , 0x01FF69 },
+ { "Asia/Vientiane" , 0x02017B },
+ { "Asia/Vladivostok" , 0x0201D0 },
+ { "Asia/Yakutsk" , 0x0203BA },
+ { "Asia/Yekaterinburg" , 0x0205A4 },
+ { "Asia/Yerevan" , 0x0207C5 },
+ { "Atlantic/Azores" , 0x0209C5 },
+ { "Atlantic/Bermuda" , 0x020EC8 },
+ { "Atlantic/Canary" , 0x0211A9 },
+ { "Atlantic/Cape_Verde" , 0x02147F },
+ { "Atlantic/Faeroe" , 0x0214F8 },
+ { "Atlantic/Faroe" , 0x02179C },
+ { "Atlantic/Jan_Mayen" , 0x021A40 },
+ { "Atlantic/Madeira" , 0x021D72 },
+ { "Atlantic/Reykjavik" , 0x02227B },
+ { "Atlantic/South_Georgia" , 0x022448 },
+ { "Atlantic/St_Helena" , 0x02265A },
+ { "Atlantic/Stanley" , 0x02248C },
+ { "Australia/ACT" , 0x0226AF },
+ { "Australia/Adelaide" , 0x0229D2 },
+ { "Australia/Brisbane" , 0x022D04 },
+ { "Australia/Broken_Hill" , 0x022DD1 },
+ { "Australia/Canberra" , 0x023115 },
+ { "Australia/Currie" , 0x023438 },
+ { "Australia/Darwin" , 0x023771 },
+ { "Australia/Eucla" , 0x0237FD },
+ { "Australia/Hobart" , 0x0238D9 },
+ { "Australia/LHI" , 0x023C3D },
+ { "Australia/Lindeman" , 0x023EDE },
+ { "Australia/Lord_Howe" , 0x023FC5 },
+ { "Australia/Melbourne" , 0x024276 },
+ { "Australia/North" , 0x0245A1 },
+ { "Australia/NSW" , 0x02461B },
+ { "Australia/Perth" , 0x02493E },
+ { "Australia/Queensland" , 0x024A1C },
+ { "Australia/South" , 0x024ACE },
+ { "Australia/Sydney" , 0x024DF1 },
+ { "Australia/Tasmania" , 0x025134 },
+ { "Australia/Victoria" , 0x02547F },
+ { "Australia/West" , 0x0257A2 },
+ { "Australia/Yancowinna" , 0x02585E },
+ { "Brazil/Acre" , 0x025B86 },
+ { "Brazil/DeNoronha" , 0x025C8A },
+ { "Brazil/East" , 0x025DAA },
+ { "Brazil/West" , 0x026087 },
+ { "Canada/Atlantic" , 0x02617F },
+ { "Canada/Central" , 0x026667 },
+ { "Canada/East-Saskatchewan" , 0x026F71 },
+ { "Canada/Eastern" , 0x026A81 },
+ { "Canada/Mountain" , 0x0270FA },
+ { "Canada/Newfoundland" , 0x027470 },
+ { "Canada/Pacific" , 0x02799B },
+ { "Canada/Saskatchewan" , 0x027DB4 },
+ { "Canada/Yukon" , 0x027F3D },
+ { "CET" , 0x028240 },
+ { "Chile/Continental" , 0x028549 },
+ { "Chile/EasterIsland" , 0x02880D },
+ { "CST6CDT" , 0x028A67 },
+ { "Cuba" , 0x028DB8 },
+ { "EET" , 0x02912B },
+ { "Egypt" , 0x0293DE },
+ { "Eire" , 0x0297C5 },
+ { "EST" , 0x029CD6 },
+ { "EST5EDT" , 0x029D1A },
+ { "Etc/GMT" , 0x02A06B },
+ { "Etc/GMT+0" , 0x02A137 },
+ { "Etc/GMT+1" , 0x02A1C1 },
+ { "Etc/GMT+10" , 0x02A24E },
+ { "Etc/GMT+11" , 0x02A2DC },
+ { "Etc/GMT+12" , 0x02A36A },
+ { "Etc/GMT+2" , 0x02A485 },
+ { "Etc/GMT+3" , 0x02A511 },
+ { "Etc/GMT+4" , 0x02A59D },
+ { "Etc/GMT+5" , 0x02A629 },
+ { "Etc/GMT+6" , 0x02A6B5 },
+ { "Etc/GMT+7" , 0x02A741 },
+ { "Etc/GMT+8" , 0x02A7CD },
+ { "Etc/GMT+9" , 0x02A859 },
+ { "Etc/GMT-0" , 0x02A0F3 },
+ { "Etc/GMT-1" , 0x02A17B },
+ { "Etc/GMT-10" , 0x02A207 },
+ { "Etc/GMT-11" , 0x02A295 },
+ { "Etc/GMT-12" , 0x02A323 },
+ { "Etc/GMT-13" , 0x02A3B1 },
+ { "Etc/GMT-14" , 0x02A3F8 },
+ { "Etc/GMT-2" , 0x02A43F },
+ { "Etc/GMT-3" , 0x02A4CB },
+ { "Etc/GMT-4" , 0x02A557 },
+ { "Etc/GMT-5" , 0x02A5E3 },
+ { "Etc/GMT-6" , 0x02A66F },
+ { "Etc/GMT-7" , 0x02A6FB },
+ { "Etc/GMT-8" , 0x02A787 },
+ { "Etc/GMT-9" , 0x02A813 },
+ { "Etc/GMT0" , 0x02A0AF },
+ { "Etc/Greenwich" , 0x02A89F },
+ { "Etc/UCT" , 0x02A8E3 },
+ { "Etc/Universal" , 0x02A927 },
+ { "Etc/UTC" , 0x02A96B },
+ { "Etc/Zulu" , 0x02A9AF },
+ { "Europe/Amsterdam" , 0x02A9F3 },
+ { "Europe/Andorra" , 0x02AE31 },
+ { "Europe/Athens" , 0x02B0AD },
+ { "Europe/Belfast" , 0x02B3F0 },
+ { "Europe/Belgrade" , 0x02B927 },
+ { "Europe/Berlin" , 0x02BBF0 },
+ { "Europe/Bratislava" , 0x02BF54 },
+ { "Europe/Brussels" , 0x02C286 },
+ { "Europe/Bucharest" , 0x02C6BD },
+ { "Europe/Budapest" , 0x02C9E7 },
+ { "Europe/Busingen" , 0x02CD50 },
+ { "Europe/Chisinau" , 0x02D007 },
+ { "Europe/Copenhagen" , 0x02D395 },
+ { "Europe/Dublin" , 0x02D69F },
+ { "Europe/Gibraltar" , 0x02DBB0 },
+ { "Europe/Guernsey" , 0x02E007 },
+ { "Europe/Helsinki" , 0x02E53E },
+ { "Europe/Isle_of_Man" , 0x02E7F4 },
+ { "Europe/Istanbul" , 0x02ED2B },
+ { "Europe/Jersey" , 0x02F118 },
+ { "Europe/Kaliningrad" , 0x02F64F },
+ { "Europe/Kiev" , 0x02F8BA },
+ { "Europe/Lisbon" , 0x02FBD6 },
+ { "Europe/Ljubljana" , 0x0300DA },
+ { "Europe/London" , 0x0303A3 },
+ { "Europe/Luxembourg" , 0x0308DA },
+ { "Europe/Madrid" , 0x030D30 },
+ { "Europe/Malta" , 0x0310F6 },
+ { "Europe/Mariehamn" , 0x0314AF },
+ { "Europe/Minsk" , 0x031765 },
+ { "Europe/Monaco" , 0x031978 },
+ { "Europe/Moscow" , 0x031DB3 },
+ { "Europe/Nicosia" , 0x03200D },
+ { "Europe/Oslo" , 0x0322F5 },
+ { "Europe/Paris" , 0x032627 },
+ { "Europe/Podgorica" , 0x032A6D },
+ { "Europe/Prague" , 0x032D36 },
+ { "Europe/Riga" , 0x033068 },
+ { "Europe/Rome" , 0x0333AD },
+ { "Europe/Samara" , 0x033770 },
+ { "Europe/San_Marino" , 0x0339D9 },
+ { "Europe/Sarajevo" , 0x033D9C },
+ { "Europe/Simferopol" , 0x034065 },
+ { "Europe/Skopje" , 0x0342B6 },
+ { "Europe/Sofia" , 0x03457F },
+ { "Europe/Stockholm" , 0x034887 },
+ { "Europe/Tallinn" , 0x034B36 },
+ { "Europe/Tirane" , 0x034E70 },
+ { "Europe/Tiraspol" , 0x035176 },
+ { "Europe/Uzhgorod" , 0x035504 },
+ { "Europe/Vaduz" , 0x03581B },
+ { "Europe/Vatican" , 0x035ACA },
+ { "Europe/Vienna" , 0x035E8D },
+ { "Europe/Vilnius" , 0x0361BA },
+ { "Europe/Volgograd" , 0x0364F9 },
+ { "Europe/Warsaw" , 0x03671E },
+ { "Europe/Zagreb" , 0x036AFF },
+ { "Europe/Zaporozhye" , 0x036DC8 },
+ { "Europe/Zurich" , 0x037109 },
+ { "Factory" , 0x0373B8 },
+ { "GB" , 0x037429 },
+ { "GB-Eire" , 0x037960 },
+ { "GMT" , 0x037E97 },
+ { "GMT+0" , 0x037F63 },
+ { "GMT-0" , 0x037F1F },
+ { "GMT0" , 0x037EDB },
+ { "Greenwich" , 0x037FA7 },
+ { "Hongkong" , 0x037FEB },
+ { "HST" , 0x0381AD },
+ { "Iceland" , 0x0381F1 },
+ { "Indian/Antananarivo" , 0x0383BE },
+ { "Indian/Chagos" , 0x03843D },
+ { "Indian/Christmas" , 0x03849F },
+ { "Indian/Cocos" , 0x0384E3 },
+ { "Indian/Comoro" , 0x038527 },
+ { "Indian/Kerguelen" , 0x0385A6 },
+ { "Indian/Mahe" , 0x0385FB },
+ { "Indian/Maldives" , 0x038650 },
+ { "Indian/Mauritius" , 0x0386A5 },
+ { "Indian/Mayotte" , 0x03871B },
+ { "Indian/Reunion" , 0x03879A },
+ { "Iran" , 0x0387EF },
+ { "Israel" , 0x038A5D },
+ { "Jamaica" , 0x038D8C },
+ { "Japan" , 0x038E51 },
+ { "Kwajalein" , 0x038EDB },
+ { "Libya" , 0x038F3E },
+ { "MET" , 0x039047 },
+ { "Mexico/BajaNorte" , 0x039350 },
+ { "Mexico/BajaSur" , 0x0396B9 },
+ { "Mexico/General" , 0x0398FE },
+ { "MST" , 0x039B5C },
+ { "MST7MDT" , 0x039BA0 },
+ { "Navajo" , 0x039EF1 },
+ { "NZ" , 0x03A26A },
+ { "NZ-CHAT" , 0x03A5E8 },
+ { "Pacific/Apia" , 0x03A8CC },
+ { "Pacific/Auckland" , 0x03AA68 },
+ { "Pacific/Bougainville" , 0x03ADF4 },
+ { "Pacific/Chatham" , 0x03AE6B },
+ { "Pacific/Chuuk" , 0x03B15E },
+ { "Pacific/Easter" , 0x03B1B7 },
+ { "Pacific/Efate" , 0x03B41E },
+ { "Pacific/Enderbury" , 0x03B4E4 },
+ { "Pacific/Fakaofo" , 0x03B552 },
+ { "Pacific/Fiji" , 0x03B5A3 },
+ { "Pacific/Funafuti" , 0x03B736 },
+ { "Pacific/Galapagos" , 0x03B77A },
+ { "Pacific/Gambier" , 0x03B7F2 },
+ { "Pacific/Guadalcanal" , 0x03B857 },
+ { "Pacific/Guam" , 0x03B8AC },
+ { "Pacific/Honolulu" , 0x03B902 },
+ { "Pacific/Johnston" , 0x03B979 },
+ { "Pacific/Kiritimati" , 0x03B9F8 },
+ { "Pacific/Kosrae" , 0x03BA63 },
+ { "Pacific/Kwajalein" , 0x03BAC0 },
+ { "Pacific/Majuro" , 0x03BB2C },
+ { "Pacific/Marquesas" , 0x03BB8B },
+ { "Pacific/Midway" , 0x03BBF2 },
+ { "Pacific/Nauru" , 0x03BC77 },
+ { "Pacific/Niue" , 0x03BCEF },
+ { "Pacific/Norfolk" , 0x03BD4D },
+ { "Pacific/Noumea" , 0x03BDA2 },
+ { "Pacific/Pago_Pago" , 0x03BE32 },
+ { "Pacific/Palau" , 0x03BEA9 },
+ { "Pacific/Pitcairn" , 0x03BEED },
+ { "Pacific/Pohnpei" , 0x03BF42 },
+ { "Pacific/Ponape" , 0x03BF97 },
+ { "Pacific/Port_Moresby" , 0x03BFDC },
+ { "Pacific/Rarotonga" , 0x03C02E },
+ { "Pacific/Saipan" , 0x03C10A },
+ { "Pacific/Samoa" , 0x03C160 },
+ { "Pacific/Tahiti" , 0x03C1D7 },
+ { "Pacific/Tarawa" , 0x03C23C },
+ { "Pacific/Tongatapu" , 0x03C290 },
+ { "Pacific/Truk" , 0x03C31C },
+ { "Pacific/Wake" , 0x03C361 },
+ { "Pacific/Wallis" , 0x03C3B1 },
+ { "Pacific/Yap" , 0x03C3F5 },
+ { "Poland" , 0x03C43A },
+ { "Portugal" , 0x03C81B },
+ { "PRC" , 0x03CD17 },
+ { "PST8PDT" , 0x03CDB7 },
+ { "ROC" , 0x03D108 },
+ { "ROK" , 0x03D239 },
+ { "Singapore" , 0x03D32C },
+ { "Turkey" , 0x03D3E3 },
+ { "UCT" , 0x03D7D0 },
+ { "Universal" , 0x03D814 },
+ { "US/Alaska" , 0x03D858 },
+ { "US/Aleutian" , 0x03DBC1 },
+ { "US/Arizona" , 0x03DF27 },
+ { "US/Central" , 0x03DFB5 },
+ { "US/East-Indiana" , 0x03E9BF },
+ { "US/Eastern" , 0x03E4C0 },
+ { "US/Hawaii" , 0x03EC29 },
+ { "US/Indiana-Starke" , 0x03EC9A },
+ { "US/Michigan" , 0x03F00B },
+ { "US/Mountain" , 0x03F342 },
+ { "US/Pacific" , 0x03F6BB },
+ { "US/Pacific-New" , 0x03FAC0 },
+ { "US/Samoa" , 0x03FEC5 },
+ { "UTC" , 0x03FF3C },
+ { "W-SU" , 0x040233 },
+ { "WET" , 0x03FF80 },
+ { "Zulu" , 0x040476 },
};
/* This is a generated file, do not modify */
-const unsigned char timelib_timezone_db_data_builtin[263380] = {
+const unsigned char timelib_timezone_db_data_builtin[263354] = {
/* Africa/Abidjan */
@@ -761,7 +761,7 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x46, 0xE0, 0x6A, 0x50, 0x48, 0x11, 0x02, 0xE0, 0x48, 0xB7, 0x11, 0xD0, 0x49, 0xF0, 0xE4, 0xE0,
0x4A, 0x8D, 0xB9, 0x50, 0x4B, 0xDA, 0x01, 0x60, 0x4C, 0x61, 0xBD, 0xD0, 0x4C, 0x89, 0x58, 0xE0,
0x4C, 0xA4, 0xFA, 0x50, 0x53, 0x75, 0x38, 0xE0, 0x53, 0xAC, 0x89, 0xD0, 0x53, 0xDA, 0xBC, 0x60,
-0x54, 0x24, 0x82, 0x50, 0x55, 0x39, 0x6B, 0x60, 0x55, 0x79, 0xF6, 0xD0, 0x55, 0xB1, 0x63, 0xE0,
+0x54, 0x24, 0x82, 0x50, 0x55, 0x42, 0xA5, 0xE0, 0x55, 0x79, 0xF6, 0xD0, 0x55, 0xB1, 0x63, 0xE0,
0x56, 0x04, 0x64, 0x50, 0x57, 0x22, 0x87, 0xE0, 0x57, 0x50, 0x9E, 0x50, 0x57, 0x7E, 0xD0, 0xE0,
0x57, 0xED, 0x80, 0xD0, 0x59, 0x02, 0x69, 0xE0, 0x59, 0x27, 0x45, 0xD0, 0x59, 0x55, 0x78, 0x60,
0x59, 0xCD, 0x62, 0xD0, 0x5A, 0xE2, 0x4B, 0xE0, 0x5A, 0xF4, 0xB2, 0xD0, 0x5B, 0x22, 0xE5, 0x60,
@@ -769,12 +769,12 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0xD0, 0x34, 0x60, 0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x9D, 0xA1, 0x60,
0x61, 0x56, 0x25, 0x50, 0x62, 0x74, 0x48, 0xE0, 0x63, 0x36, 0x07, 0x50, 0x64, 0x4A, 0xF0, 0x60,
0x65, 0x15, 0xE9, 0x50, 0x66, 0x2A, 0xD2, 0x60, 0x66, 0xF5, 0xCB, 0x50, 0x68, 0x0A, 0xB4, 0x60,
-0x68, 0xD5, 0xAD, 0x50, 0x69, 0xEA, 0x96, 0x60, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xD3, 0xB2, 0xE0,
+0x68, 0xD5, 0xAD, 0x50, 0x69, 0xF3, 0xD0, 0xE0, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xD3, 0xB2, 0xE0,
0x6C, 0x9E, 0xAB, 0xD0, 0x6D, 0xB3, 0x94, 0xE0, 0x6E, 0x7E, 0x8D, 0xD0, 0x6F, 0x93, 0x76, 0xE0,
0x70, 0x5E, 0x6F, 0xD0, 0x71, 0x73, 0x58, 0xE0, 0x72, 0x3E, 0x51, 0xD0, 0x73, 0x53, 0x3A, 0xE0,
0x74, 0x1E, 0x33, 0xD0, 0x75, 0x3C, 0x57, 0x60, 0x76, 0x07, 0x50, 0x50, 0x77, 0x1C, 0x39, 0x60,
0x77, 0xE7, 0x32, 0x50, 0x78, 0xFC, 0x1B, 0x60, 0x79, 0xC7, 0x14, 0x50, 0x7A, 0xDB, 0xFD, 0x60,
-0x7B, 0xA6, 0xF6, 0x50, 0x7C, 0xBB, 0xDF, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x9B, 0xC1, 0x60,
+0x7B, 0xA6, 0xF6, 0x50, 0x7C, 0xBB, 0xDF, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0xA4, 0xFB, 0xE0,
0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
@@ -783,10 +783,10 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01,
-0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01,
-0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00,
0x00, 0x00, 0x1C, 0x20, 0x00, 0x05, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00, 0x45, 0x45, 0x53, 0x54,
0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x2E, 0x88, 0x01,
0x42, 0x57, 0x88, 0x00, 0x00, 0x00, 0x00,
@@ -5070,22 +5070,22 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
/* America/Montreal */
0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9C, 0xBD, 0x01, 0xF0,
-0x9C, 0xE4, 0x64, 0xC0, 0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x58, 0xF8,
-0xA1, 0x99, 0x82, 0xE8, 0xA2, 0x94, 0x0D, 0xF8, 0xA3, 0x5F, 0x06, 0xE8, 0xA4, 0x73, 0xE8, 0xF0,
-0xA5, 0x3E, 0xE8, 0xE8, 0xA6, 0x53, 0xCA, 0xF0, 0xA7, 0x1E, 0xCA, 0xE8, 0xAA, 0x2D, 0xEC, 0xF0,
-0xAA, 0xDE, 0x8E, 0xE8, 0xAB, 0xFC, 0xAB, 0x70, 0xAC, 0xBE, 0x70, 0xE8, 0xAD, 0xDC, 0x8D, 0x70,
-0xAE, 0x9E, 0x52, 0xE8, 0xAF, 0xBC, 0x53, 0x50, 0xB0, 0x7E, 0x11, 0xC0, 0xB1, 0x9C, 0x35, 0x50,
-0xB2, 0x67, 0x2E, 0x40, 0xB3, 0x7C, 0x17, 0x50, 0xB4, 0x47, 0x10, 0x40, 0xB5, 0x5B, 0xF9, 0x50,
-0xB6, 0x26, 0xF2, 0x40, 0xB7, 0x3B, 0xDB, 0x50, 0xB8, 0x06, 0xD4, 0x40, 0xB9, 0x24, 0xF7, 0xD0,
-0xB9, 0xE6, 0xB6, 0x40, 0xBB, 0x04, 0xD9, 0xD0, 0xBB, 0xCF, 0xD2, 0xC0, 0xBC, 0xE4, 0xBB, 0xD0,
-0xBD, 0xAF, 0xB4, 0xC0, 0xBE, 0xC4, 0x9D, 0xD0, 0xBF, 0x8F, 0x96, 0xC0, 0xC0, 0xA4, 0x7F, 0xD0,
-0xC1, 0x6F, 0x78, 0xC0, 0xC2, 0x84, 0x61, 0xD0, 0xC3, 0x4F, 0x5A, 0xC0, 0xC4, 0x64, 0x43, 0xD0,
-0xC5, 0x2F, 0x3C, 0xC0, 0xC6, 0x4D, 0x60, 0x50, 0xC7, 0x0F, 0x1E, 0xC0, 0xC8, 0x2D, 0x42, 0x50,
+0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9E, 0xB8, 0x93, 0x70,
+0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x2E, 0xC8, 0xA1, 0x9A, 0xB1, 0x40, 0xA2, 0x94, 0x06, 0xF0,
+0xA3, 0x55, 0xA9, 0x40, 0xA4, 0x86, 0x5D, 0xF0, 0xA5, 0x28, 0x78, 0x60, 0xA6, 0x66, 0x3F, 0xF0,
+0xA7, 0x0C, 0x4E, 0xE0, 0xA8, 0x46, 0x21, 0xF0, 0xA8, 0xEC, 0x30, 0xE0, 0xAA, 0x1C, 0xC9, 0x70,
+0xAA, 0xD5, 0x4D, 0x60, 0xAB, 0xFC, 0xAB, 0x70, 0xAC, 0xB5, 0x2F, 0x60, 0xAD, 0xDC, 0x8D, 0x70,
+0xAE, 0x95, 0x11, 0x60, 0xAF, 0xBC, 0x6F, 0x70, 0xB0, 0x7E, 0x2D, 0xE0, 0xB1, 0x9C, 0x51, 0x70,
+0xB2, 0x67, 0x4A, 0x60, 0xB3, 0x7C, 0x33, 0x70, 0xB4, 0x47, 0x2C, 0x60, 0xB5, 0x5C, 0x15, 0x70,
+0xB6, 0x27, 0x0E, 0x60, 0xB7, 0x3B, 0xF7, 0x70, 0xB8, 0x06, 0xF0, 0x60, 0xB9, 0x25, 0x13, 0xF0,
+0xB9, 0xE6, 0xD2, 0x60, 0xBB, 0x04, 0xF5, 0xF0, 0xBB, 0xCF, 0xEE, 0xE0, 0xBC, 0xE4, 0xD7, 0xF0,
+0xBD, 0xAF, 0xD0, 0xE0, 0xBE, 0xC4, 0xB9, 0xF0, 0xBF, 0x8F, 0xB2, 0xE0, 0xC0, 0xA4, 0x9B, 0xF0,
+0xC1, 0x6F, 0x94, 0xE0, 0xC2, 0x84, 0x7D, 0xF0, 0xC3, 0x4F, 0x76, 0xE0, 0xC4, 0x64, 0x5F, 0xF0,
+0xC5, 0x2F, 0x58, 0xE0, 0xC6, 0x4D, 0x7C, 0x70, 0xC7, 0x0F, 0x3A, 0xE0, 0xC8, 0x2D, 0x5E, 0x70,
0xCB, 0x88, 0xF0, 0x70, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, 0xD3, 0x75, 0xE4, 0xF0,
-0xD4, 0x40, 0xDD, 0xE0, 0xD5, 0x55, 0xC6, 0xF0, 0xD6, 0x20, 0xBF, 0xE0, 0xD7, 0x35, 0xA8, 0xF0,
-0xD8, 0x00, 0xA1, 0xE0, 0xD9, 0x15, 0x8A, 0xF0, 0xDA, 0x0E, 0xA8, 0x60, 0xDA, 0xFE, 0xA7, 0x70,
-0xDB, 0xEE, 0x8A, 0x60, 0xDC, 0xDE, 0x89, 0x70, 0xDD, 0xA9, 0x82, 0x60, 0xDE, 0xBE, 0x6B, 0x70,
+0xD4, 0x40, 0xDD, 0xE0, 0xD5, 0x55, 0xAA, 0xD0, 0xD6, 0x20, 0xA3, 0xC0, 0xD7, 0x35, 0x8C, 0xD0,
+0xD8, 0x00, 0x85, 0xC0, 0xD9, 0x15, 0x6E, 0xD0, 0xDA, 0x33, 0x76, 0x40, 0xDA, 0xFE, 0xA7, 0x70,
+0xDC, 0x13, 0x74, 0x60, 0xDC, 0xDE, 0x89, 0x70, 0xDD, 0xA9, 0x82, 0x60, 0xDE, 0xBE, 0x6B, 0x70,
0xDF, 0x89, 0x64, 0x60, 0xE0, 0x9E, 0x4D, 0x70, 0xE1, 0x69, 0x46, 0x60, 0xE2, 0x7E, 0x2F, 0x70,
0xE3, 0x49, 0x28, 0x60, 0xE4, 0x5E, 0x11, 0x70, 0xE5, 0x29, 0x0A, 0x60, 0xE6, 0x47, 0x2D, 0xF0,
0xE7, 0x12, 0x26, 0xE0, 0xE8, 0x27, 0x0F, 0xF0, 0xE9, 0x16, 0xF2, 0xE0, 0xEA, 0x06, 0xF1, 0xF0,
@@ -6165,51 +6165,51 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
/* America/Santiago */
0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x8F, 0x24, 0x69, 0xC6,
-0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x71, 0x05, 0x46, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC6,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0D, 0x8F, 0x30, 0x47, 0x46,
+0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC6,
0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50,
0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50,
0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0,
-0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x76, 0xA0, 0x50, 0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0,
-0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0,
-0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0,
-0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0, 0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0,
-0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30, 0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30,
-0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30, 0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30,
-0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30, 0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0,
-0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0, 0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0,
-0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0, 0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0,
-0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0, 0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30,
-0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30, 0x23, 0x45, 0xA9, 0xC0, 0x24, 0x19, 0xDD, 0x30,
-0x25, 0x38, 0x00, 0xC0, 0x26, 0x02, 0xF9, 0xB0, 0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30,
-0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0, 0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0,
-0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0, 0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0,
-0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0, 0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30,
-0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30, 0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0,
-0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30, 0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30,
-0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30, 0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30,
-0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0, 0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0,
-0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0, 0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0,
-0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30, 0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30,
-0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0, 0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30,
-0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0,
-0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0,
-0x01, 0x00, 0x02, 0x00, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04,
-0x05, 0x04, 0x02, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x08, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7,
-0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF,
-0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00,
-0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x53, 0x4D, 0x54, 0x00, 0x43, 0x4C, 0x54, 0x00, 0x43,
-0x4C, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
-0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x56, 0x49, 0xD8, 0x00, 0xA6, 0xD4, 0x55, 0x00, 0x00,
-0x00, 0x0E, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73,
-
+0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, 0xD5, 0x76, 0x92, 0x40,
+0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0,
+0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0,
+0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0,
+0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30,
+0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30,
+0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30,
+0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0,
+0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0,
+0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0,
+0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30,
+0x23, 0x4E, 0xE4, 0x40, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x25, 0xF9, 0xBF, 0x30,
+0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0,
+0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0,
+0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0,
+0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30,
+0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30,
+0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30,
+0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0,
+0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0,
+0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30,
+0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0,
+0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0,
+0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0,
+0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0, 0x01, 0x00, 0x02, 0x00, 0x03, 0x01, 0x03, 0x01,
+0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0xFF, 0xFF, 0xBD, 0xBA, 0x00,
+0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xC7,
+0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF,
+0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x53, 0x4D, 0x54, 0x00, 0x43,
+0x4C, 0x54, 0x00, 0x43, 0x4C, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x56, 0x49, 0xD8, 0x00, 0xA6, 0xD4, 0x55,
+0x00, 0x00, 0x00, 0x0E, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F,
+0x6E, 0x73,
/* America/Santo_Domingo */
0x50, 0x48, 0x50, 0x31, 0x01, 0x44, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -7316,8 +7316,8 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x17, 0x30, 0xBC, 0xB0, 0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0,
0x1A, 0xB1, 0x38, 0xB0, 0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40,
0x1E, 0x70, 0xFC, 0xB0, 0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40,
-0x22, 0x39, 0xFB, 0x30, 0x23, 0x45, 0xA9, 0xC0, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0,
-0x26, 0x02, 0xF9, 0xB0, 0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0,
+0x22, 0x39, 0xFB, 0x30, 0x23, 0x4E, 0xE4, 0x40, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0,
+0x25, 0xF9, 0xBF, 0x30, 0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0,
0x29, 0xC2, 0xBD, 0xB0, 0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0,
0x2D, 0x82, 0x81, 0xB0, 0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40,
0x31, 0x42, 0x45, 0xB0, 0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40,
@@ -11869,91 +11869,90 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
/* Chile/Continental */
0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x8F, 0x24, 0x69, 0xC6,
-0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x71, 0x05, 0x46, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC6,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0D, 0x8F, 0x30, 0x47, 0x46,
+0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC6,
0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50,
0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50,
0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0,
-0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x76, 0xA0, 0x50, 0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0,
-0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0,
-0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0,
-0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0, 0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0,
-0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30, 0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30,
-0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30, 0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30,
-0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30, 0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0,
-0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0, 0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0,
-0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0, 0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0,
-0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0, 0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30,
-0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30, 0x23, 0x45, 0xA9, 0xC0, 0x24, 0x19, 0xDD, 0x30,
-0x25, 0x38, 0x00, 0xC0, 0x26, 0x02, 0xF9, 0xB0, 0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30,
-0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0, 0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0,
-0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0, 0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0,
-0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0, 0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30,
-0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30, 0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0,
-0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30, 0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30,
-0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30, 0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30,
-0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0, 0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0,
-0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0, 0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0,
-0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30, 0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30,
-0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0, 0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30,
-0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0,
-0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0,
-0x01, 0x00, 0x02, 0x00, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04,
-0x05, 0x04, 0x02, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06,
-0x08, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7,
-0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF,
-0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00,
-0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x53, 0x4D, 0x54, 0x00, 0x43, 0x4C, 0x54, 0x00, 0x43,
-0x4C, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
-0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00,
-0x00, 0x00,
+0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, 0xD5, 0x76, 0x92, 0x40,
+0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0,
+0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0,
+0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0,
+0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30,
+0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30,
+0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30,
+0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0,
+0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0,
+0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0,
+0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30,
+0x23, 0x4E, 0xE4, 0x40, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x25, 0xF9, 0xBF, 0x30,
+0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0,
+0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0,
+0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0,
+0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30,
+0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30,
+0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30,
+0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0,
+0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0,
+0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30,
+0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0,
+0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0,
+0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0,
+0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0, 0x01, 0x00, 0x02, 0x00, 0x03, 0x01, 0x03, 0x01,
+0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05,
+0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0xFF, 0xFF, 0xBD, 0xBA, 0x00,
+0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xC7,
+0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF,
+0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x53, 0x4D, 0x54, 0x00, 0x43,
+0x4C, 0x54, 0x00, 0x43, 0x4C, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80,
+0x00, 0x00, 0x00, 0x00,
/* Chile/EasterIsland */
0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0xB9, 0xC7, 0x40, 0x88,
-0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD4, 0x1B, 0xC9, 0xB0, 0xFD, 0xD1, 0x3C, 0x40,
-0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0,
-0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40,
-0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0, 0x08, 0xFE, 0x13, 0x40,
-0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30, 0x0C, 0xBD, 0xD7, 0x40,
-0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30, 0x10, 0x86, 0xD5, 0xC0,
-0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30, 0x14, 0x46, 0x99, 0xC0,
-0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0, 0x18, 0x06, 0x5D, 0xC0,
-0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0, 0x1B, 0xCF, 0x5C, 0x40,
-0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0, 0x1F, 0x8F, 0x20, 0x40,
-0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30, 0x23, 0x45, 0xA9, 0xC0,
-0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x26, 0x02, 0xF9, 0xB0, 0x26, 0xF2, 0xF8, 0xC0,
-0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0, 0x2A, 0xD7, 0xA6, 0xC0,
-0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0, 0x2E, 0x97, 0x6A, 0xC0,
-0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0, 0x32, 0x60, 0x69, 0x40,
-0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30, 0x36, 0x0D, 0xB8, 0x40,
-0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30, 0x39, 0xE9, 0x2B, 0xC0,
-0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30, 0x3D, 0xA8, 0xEF, 0xC0,
-0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0, 0x41, 0x68, 0xB3, 0xC0,
-0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0, 0x45, 0x31, 0xB2, 0x40,
-0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30, 0x48, 0xF1, 0x76, 0x40,
-0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0, 0x4C, 0xB1, 0x3A, 0x40,
-0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0,
-0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40,
-0x55, 0x3C, 0x54, 0xB0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0xB9, 0xC7, 0x40, 0x88,
+0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0,
+0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0,
+0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0,
+0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30,
+0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30,
+0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30,
+0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0,
+0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0,
+0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0,
+0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30,
+0x23, 0x4E, 0xE4, 0x40, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x25, 0xF9, 0xBF, 0x30,
+0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0,
+0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0,
+0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0,
+0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30,
+0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30,
+0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30,
+0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0,
+0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0,
+0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30,
+0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0,
+0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0,
+0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0,
+0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90,
-0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x09, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x09, 0xFF, 0xFF,
-0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x09, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04,
-0x45, 0x4D, 0x54, 0x00, 0x45, 0x41, 0x53, 0x54, 0x00, 0x45, 0x41, 0x53, 0x53, 0x54, 0x00, 0x00,
-0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x89, 0x54,
-0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xAB,
+0xA0, 0x01, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0A, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0A, 0xFF,
+0xFF, 0xAB, 0xA0, 0x00, 0x0A, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00,
+0x0A, 0x45, 0x4D, 0x54, 0x00, 0x45, 0x41, 0x53, 0x53, 0x54, 0x00, 0x45, 0x41, 0x53, 0x54, 0x00,
+0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x89,
+0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00,
/* CST6CDT */
0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -12150,7 +12149,7 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x46, 0xE0, 0x6A, 0x50, 0x48, 0x11, 0x02, 0xE0, 0x48, 0xB7, 0x11, 0xD0, 0x49, 0xF0, 0xE4, 0xE0,
0x4A, 0x8D, 0xB9, 0x50, 0x4B, 0xDA, 0x01, 0x60, 0x4C, 0x61, 0xBD, 0xD0, 0x4C, 0x89, 0x58, 0xE0,
0x4C, 0xA4, 0xFA, 0x50, 0x53, 0x75, 0x38, 0xE0, 0x53, 0xAC, 0x89, 0xD0, 0x53, 0xDA, 0xBC, 0x60,
-0x54, 0x24, 0x82, 0x50, 0x55, 0x39, 0x6B, 0x60, 0x55, 0x79, 0xF6, 0xD0, 0x55, 0xB1, 0x63, 0xE0,
+0x54, 0x24, 0x82, 0x50, 0x55, 0x42, 0xA5, 0xE0, 0x55, 0x79, 0xF6, 0xD0, 0x55, 0xB1, 0x63, 0xE0,
0x56, 0x04, 0x64, 0x50, 0x57, 0x22, 0x87, 0xE0, 0x57, 0x50, 0x9E, 0x50, 0x57, 0x7E, 0xD0, 0xE0,
0x57, 0xED, 0x80, 0xD0, 0x59, 0x02, 0x69, 0xE0, 0x59, 0x27, 0x45, 0xD0, 0x59, 0x55, 0x78, 0x60,
0x59, 0xCD, 0x62, 0xD0, 0x5A, 0xE2, 0x4B, 0xE0, 0x5A, 0xF4, 0xB2, 0xD0, 0x5B, 0x22, 0xE5, 0x60,
@@ -12158,12 +12157,12 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0xD0, 0x34, 0x60, 0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x9D, 0xA1, 0x60,
0x61, 0x56, 0x25, 0x50, 0x62, 0x74, 0x48, 0xE0, 0x63, 0x36, 0x07, 0x50, 0x64, 0x4A, 0xF0, 0x60,
0x65, 0x15, 0xE9, 0x50, 0x66, 0x2A, 0xD2, 0x60, 0x66, 0xF5, 0xCB, 0x50, 0x68, 0x0A, 0xB4, 0x60,
-0x68, 0xD5, 0xAD, 0x50, 0x69, 0xEA, 0x96, 0x60, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xD3, 0xB2, 0xE0,
+0x68, 0xD5, 0xAD, 0x50, 0x69, 0xF3, 0xD0, 0xE0, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xD3, 0xB2, 0xE0,
0x6C, 0x9E, 0xAB, 0xD0, 0x6D, 0xB3, 0x94, 0xE0, 0x6E, 0x7E, 0x8D, 0xD0, 0x6F, 0x93, 0x76, 0xE0,
0x70, 0x5E, 0x6F, 0xD0, 0x71, 0x73, 0x58, 0xE0, 0x72, 0x3E, 0x51, 0xD0, 0x73, 0x53, 0x3A, 0xE0,
0x74, 0x1E, 0x33, 0xD0, 0x75, 0x3C, 0x57, 0x60, 0x76, 0x07, 0x50, 0x50, 0x77, 0x1C, 0x39, 0x60,
0x77, 0xE7, 0x32, 0x50, 0x78, 0xFC, 0x1B, 0x60, 0x79, 0xC7, 0x14, 0x50, 0x7A, 0xDB, 0xFD, 0x60,
-0x7B, 0xA6, 0xF6, 0x50, 0x7C, 0xBB, 0xDF, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x9B, 0xC1, 0x60,
+0x7B, 0xA6, 0xF6, 0x50, 0x7C, 0xBB, 0xDF, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0xA4, 0xFB, 0xE0,
0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
@@ -12172,10 +12171,10 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01,
-0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01,
-0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00,
0x00, 0x00, 0x1C, 0x20, 0x00, 0x05, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x00, 0x45, 0x45, 0x53, 0x54,
0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01,
0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00,
@@ -17051,44 +17050,43 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
/* Pacific/Easter */
0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0xB9, 0xC7, 0x40, 0x88,
-0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD4, 0x1B, 0xC9, 0xB0, 0xFD, 0xD1, 0x3C, 0x40,
-0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0,
-0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40,
-0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0, 0x08, 0xFE, 0x13, 0x40,
-0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30, 0x0C, 0xBD, 0xD7, 0x40,
-0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30, 0x10, 0x86, 0xD5, 0xC0,
-0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30, 0x14, 0x46, 0x99, 0xC0,
-0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0, 0x18, 0x06, 0x5D, 0xC0,
-0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0, 0x1B, 0xCF, 0x5C, 0x40,
-0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0, 0x1F, 0x8F, 0x20, 0x40,
-0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30, 0x23, 0x45, 0xA9, 0xC0,
-0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x26, 0x02, 0xF9, 0xB0, 0x26, 0xF2, 0xF8, 0xC0,
-0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0, 0x2A, 0xD7, 0xA6, 0xC0,
-0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0, 0x2E, 0x97, 0x6A, 0xC0,
-0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0, 0x32, 0x60, 0x69, 0x40,
-0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30, 0x36, 0x0D, 0xB8, 0x40,
-0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30, 0x39, 0xE9, 0x2B, 0xC0,
-0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30, 0x3D, 0xA8, 0xEF, 0xC0,
-0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0, 0x41, 0x68, 0xB3, 0xC0,
-0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0, 0x45, 0x31, 0xB2, 0x40,
-0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30, 0x48, 0xF1, 0x76, 0x40,
-0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0, 0x4C, 0xB1, 0x3A, 0x40,
-0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0,
-0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40,
-0x55, 0x3C, 0x54, 0xB0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0xB9, 0xC7, 0x40, 0x88,
+0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0,
+0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0,
+0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, 0x07, 0xDF, 0xEF, 0xB0,
+0x08, 0xFE, 0x13, 0x40, 0x09, 0xBF, 0xD1, 0xB0, 0x0A, 0xDD, 0xF5, 0x40, 0x0B, 0xA8, 0xEE, 0x30,
+0x0C, 0xBD, 0xD7, 0x40, 0x0D, 0x88, 0xD0, 0x30, 0x0E, 0x9D, 0xB9, 0x40, 0x0F, 0x68, 0xB2, 0x30,
+0x10, 0x86, 0xD5, 0xC0, 0x11, 0x48, 0x94, 0x30, 0x12, 0x66, 0xB7, 0xC0, 0x13, 0x28, 0x76, 0x30,
+0x14, 0x46, 0x99, 0xC0, 0x15, 0x11, 0x92, 0xB0, 0x16, 0x26, 0x7B, 0xC0, 0x16, 0xF1, 0x74, 0xB0,
+0x18, 0x06, 0x5D, 0xC0, 0x18, 0xD1, 0x56, 0xB0, 0x19, 0xE6, 0x3F, 0xC0, 0x1A, 0xB1, 0x38, 0xB0,
+0x1B, 0xCF, 0x5C, 0x40, 0x1C, 0x91, 0x1A, 0xB0, 0x1D, 0xAF, 0x3E, 0x40, 0x1E, 0x70, 0xFC, 0xB0,
+0x1F, 0x8F, 0x20, 0x40, 0x20, 0x7F, 0x03, 0x30, 0x21, 0x6F, 0x02, 0x40, 0x22, 0x39, 0xFB, 0x30,
+0x23, 0x4E, 0xE4, 0x40, 0x24, 0x19, 0xDD, 0x30, 0x25, 0x38, 0x00, 0xC0, 0x25, 0xF9, 0xBF, 0x30,
+0x26, 0xF2, 0xF8, 0xC0, 0x27, 0xD9, 0xA1, 0x30, 0x28, 0xF7, 0xC4, 0xC0, 0x29, 0xC2, 0xBD, 0xB0,
+0x2A, 0xD7, 0xA6, 0xC0, 0x2B, 0xA2, 0x9F, 0xB0, 0x2C, 0xB7, 0x88, 0xC0, 0x2D, 0x82, 0x81, 0xB0,
+0x2E, 0x97, 0x6A, 0xC0, 0x2F, 0x62, 0x63, 0xB0, 0x30, 0x80, 0x87, 0x40, 0x31, 0x42, 0x45, 0xB0,
+0x32, 0x60, 0x69, 0x40, 0x33, 0x3D, 0xD7, 0x30, 0x34, 0x40, 0x4B, 0x40, 0x35, 0x0B, 0x44, 0x30,
+0x36, 0x0D, 0xB8, 0x40, 0x37, 0x06, 0xD5, 0xB0, 0x38, 0x00, 0x0F, 0x40, 0x38, 0xCB, 0x08, 0x30,
+0x39, 0xE9, 0x2B, 0xC0, 0x3A, 0xAA, 0xEA, 0x30, 0x3B, 0xC9, 0x0D, 0xC0, 0x3C, 0x8A, 0xCC, 0x30,
+0x3D, 0xA8, 0xEF, 0xC0, 0x3E, 0x6A, 0xAE, 0x30, 0x3F, 0x88, 0xD1, 0xC0, 0x40, 0x53, 0xCA, 0xB0,
+0x41, 0x68, 0xB3, 0xC0, 0x42, 0x33, 0xAC, 0xB0, 0x43, 0x48, 0x95, 0xC0, 0x44, 0x13, 0x8E, 0xB0,
+0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0, 0x47, 0x11, 0x94, 0x40, 0x47, 0xEF, 0x02, 0x30,
+0x48, 0xF1, 0x76, 0x40, 0x49, 0xBC, 0x6F, 0x30, 0x4A, 0xD1, 0x58, 0x40, 0x4B, 0xB8, 0x00, 0xB0,
+0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0,
+0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0,
+0x54, 0x0B, 0xD8, 0x40, 0x55, 0x3C, 0x54, 0xB0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04,
-0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90,
-0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x09, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x09, 0xFF, 0xFF,
-0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x09, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04,
-0x45, 0x4D, 0x54, 0x00, 0x45, 0x41, 0x53, 0x54, 0x00, 0x45, 0x41, 0x53, 0x53, 0x54, 0x00, 0x00,
-0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x5F, 0xE6,
-0xC8, 0x00, 0x6B, 0xAD, 0x1A, 0x00, 0x00, 0x00, 0x0D, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20,
-0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64,
+0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05,
+0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xAB,
+0xA0, 0x01, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0A, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0A, 0xFF,
+0xFF, 0xAB, 0xA0, 0x00, 0x0A, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00,
+0x0A, 0x45, 0x4D, 0x54, 0x00, 0x45, 0x41, 0x53, 0x53, 0x54, 0x00, 0x45, 0x41, 0x53, 0x54, 0x00,
+0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x5F,
+0xE6, 0xC8, 0x00, 0x6B, 0xAD, 0x1A, 0x00, 0x00, 0x00, 0x0D, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72,
+0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64,
/* Pacific/Efate */
0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -18546,4 +18544,4 @@ const unsigned char timelib_timezone_db_data_builtin[263380] = {
0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80,
0x00, 0x00, 0x00, 0x00,};
-const timelib_tzdb timezonedb_builtin = { "2015.2", 583, timezonedb_idx_builtin, timelib_timezone_db_data_builtin };
+const timelib_tzdb timezonedb_builtin = { "2015.3", 583, timezonedb_idx_builtin, timelib_timezone_db_data_builtin };
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 959ab4896c..f00ce047b4 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -3630,6 +3630,7 @@ PHP_FUNCTION(timezone_open)
}
tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, return_value));
if (SUCCESS != timezone_initialize(tzobj, tz)) {
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
}
diff --git a/ext/date/tests/DateTimeZone_getTransitions_basic1.phpt b/ext/date/tests/DateTimeZone_getTransitions_basic1.phpt
index f3640d1c1a..d17808035b 100644
--- a/ext/date/tests/DateTimeZone_getTransitions_basic1.phpt
+++ b/ext/date/tests/DateTimeZone_getTransitions_basic1.phpt
@@ -16,7 +16,7 @@ date_default_timezone_set("Europe/London");
// Create a DateTimeZone object
$tz = new DateTimeZone("Europe/London");
-$tran = $tz->getTransitions();
+$tran = $tz->getTransitions(-306972000, -37241999);
if (!is_array($tran)) {
echo "TEST FAILED: Expected an array\n";
@@ -25,14 +25,14 @@ if (!is_array($tran)) {
echo "\n-- Total number of transitions: " . count($tran). " --\n";
echo "\n-- Format a sample entry for Spring 1963 --\n";
-var_dump( $tran[97] );
+var_dump( $tran[6] );
?>
===DONE===
--EXPECT--
*** Testing DateTimeZone::getTransitions() : basic functionality ***
--- Total number of transitions: 243 --
+-- Total number of transitions: 18 --
-- Format a sample entry for Spring 1963 --
array(5) {
diff --git a/ext/date/tests/DateTime_add-massive.phpt b/ext/date/tests/DateTime_add-massive.phpt
index ca5bef985e..6093d05180 100644
--- a/ext/date/tests/DateTime_add-massive.phpt
+++ b/ext/date/tests/DateTime_add-massive.phpt
@@ -10,6 +10,6 @@ define('PHPT_DATETIME_SHOW', PHPT_DATETIME_SHOW_ADD);
require 'DateTime_data-massive.inc';
?>
---EXPECT--
-test_massive_positive: ADD: -333333-01-01 16:18:02 EST + P+666666Y0M0DT0H0M0S = **333333-01-01 16:18:02 EST**
-test_massive_negative: ADD: 333333-01-01 16:18:02 EST + P-666666Y0M0DT0H0M0S = **-333333-01-01 16:18:02 EST**
+--EXPECTF--
+test_massive_positive: ADD: -333333-01-01 16:18:02 %s + P+666666Y0M0DT0H0M0S = **333333-01-01 16:18:02 %s**
+test_massive_negative: ADD: 333333-01-01 16:18:02 %s + P-666666Y0M0DT0H0M0S = **-333333-01-01 16:18:02 %s**
diff --git a/ext/date/tests/DateTime_diff-massive.phpt b/ext/date/tests/DateTime_diff-massive.phpt
index 2199f84864..12a7d0fb2d 100644
--- a/ext/date/tests/DateTime_diff-massive.phpt
+++ b/ext/date/tests/DateTime_diff-massive.phpt
@@ -10,6 +10,6 @@ define('PHPT_DATETIME_SHOW', PHPT_DATETIME_SHOW_DIFF);
require 'DateTime_data-massive.inc';
?>
---EXPECT--
-test_massive_positive: DIFF: 333333-01-01 16:18:02 EST - -333333-01-01 16:18:02 EST = **P+666666Y0M0DT0H0M0S**
-test_massive_negative: DIFF: -333333-01-01 16:18:02 EST - 333333-01-01 16:18:02 EST = **P-666666Y0M0DT0H0M0S**
+--EXPECTF--
+test_massive_positive: DIFF: 333333-01-01 16:18:02 %s - -333333-01-01 16:18:02 %s = **P+666666Y0M0DT0H%s**
+test_massive_negative: DIFF: -333333-01-01 16:18:02 %s - 333333-01-01 16:18:02 %s = **P-666666Y0M0DT0H%s**
diff --git a/ext/date/tests/DateTime_sub-massive.phpt b/ext/date/tests/DateTime_sub-massive.phpt
index a0520ecdd9..e143056658 100644
--- a/ext/date/tests/DateTime_sub-massive.phpt
+++ b/ext/date/tests/DateTime_sub-massive.phpt
@@ -10,6 +10,6 @@ define('PHPT_DATETIME_SHOW', PHPT_DATETIME_SHOW_SUB);
require 'DateTime_data-massive.inc';
?>
---EXPECT--
-test_massive_positive: SUB: 333333-01-01 16:18:02 EST - P+666666Y0M0DT0H0M0S = **-333333-01-01 16:18:02 EST**
-test_massive_negative: SUB: -333333-01-01 16:18:02 EST - P-666666Y0M0DT0H0M0S = **333333-01-01 16:18:02 EST**
+--EXPECTF--
+test_massive_positive: SUB: 333333-01-01 16:18:02 %s - P+666666Y0M0DT0H0M0S = **-333333-01-01 16:18:02 %s**
+test_massive_negative: SUB: -333333-01-01 16:18:02 %s - P-666666Y0M0DT0H0M0S = **333333-01-01 16:18:02 %s**
diff --git a/ext/date/tests/bug48058.phpt b/ext/date/tests/bug48058.phpt
index 46a1918b49..87d2190933 100644
--- a/ext/date/tests/bug48058.phpt
+++ b/ext/date/tests/bug48058.phpt
@@ -20,10 +20,10 @@ array(5) {
["time"]=>
string(%d) "%s"
["offset"]=>
- int(3600)
+ int(%s)
["isdst"]=>
- bool(true)
+ bool(%s)
["abbr"]=>
- string(3) "BST"
+ string(%d) "%s"
}
10000002008-02-28T12:00:00+0000
diff --git a/ext/date/tests/mktime-3-64bit.phpt b/ext/date/tests/mktime-3-64bit.phpt
index a3649cd148..cbb441f13c 100644
--- a/ext/date/tests/mktime-3-64bit.phpt
+++ b/ext/date/tests/mktime-3-64bit.phpt
@@ -24,7 +24,7 @@ foreach ($tzs as $tz) {
echo "\n";
}
?>
---EXPECT--
+--EXPECTF--
America/Toronto
Y: 0 - January 2000-01-01T01:01:01-0500
Y: 69 - January 2069-01-01T01:01:01-0500
@@ -32,11 +32,11 @@ Y: 70 - January 1970-01-01T01:01:01-0500
Y: 71 - January 1971-01-01T01:01:01-0500
Y: 99 - January 1999-01-01T01:01:01-0500
Y: 100 - January 2000-01-01T01:01:01-0500
-Y: 101 - January 0101-01-01T01:01:01-0500
-Y: 105 - January 0105-01-01T01:01:01-0500
-Y: 110 - January 0110-01-01T01:01:01-0500
-Y: 1900 - January 1900-01-01T01:01:01-0500
-Y: 1901 - January 1901-01-01T01:01:01-0500
+Y: 101 - January 0101-01-01T01:01:01-0%d
+Y: 105 - January 0105-01-01T01:01:01-0%d
+Y: 110 - January 0110-01-01T01:01:01-0%d
+Y: 1900 - January 1900-01-01T01:01:01-0%d
+Y: 1901 - January 1901-01-01T01:01:01-0%d
Y: 1902 - January 1902-01-01T01:01:01-0500
Y: 1999 - January 1999-01-01T01:01:01-0500
Y: 2000 - January 2000-01-01T01:01:01-0500
@@ -49,11 +49,11 @@ Y: 70 - January 1970-01-01T01:01:01+0100
Y: 71 - January 1971-01-01T01:01:01+0100
Y: 99 - January 1999-01-01T01:01:01+0100
Y: 100 - January 2000-01-01T01:01:01+0100
-Y: 101 - January 0101-01-01T01:01:01+0100
-Y: 105 - January 0105-01-01T01:01:01+0100
-Y: 110 - January 0110-01-01T01:01:01+0100
-Y: 1900 - January 1900-01-01T01:01:01+0100
-Y: 1901 - January 1901-01-01T01:01:01+0100
+Y: 101 - January 0101-01-01T01:01:01+0%d
+Y: 105 - January 0105-01-01T01:01:01+0%d
+Y: 110 - January 0110-01-01T01:01:01+0%d
+Y: 1900 - January 1900-01-01T01:01:01+0%d
+Y: 1901 - January 1901-01-01T01:01:01+0%d
Y: 1902 - January 1902-01-01T01:01:01+0100
Y: 1999 - January 1999-01-01T01:01:01+0100
Y: 2000 - January 2000-01-01T01:01:01+0100
diff --git a/ext/date/tests/timezone_transitions_get_basic1.phpt b/ext/date/tests/timezone_transitions_get_basic1.phpt
index eb6cf99342..97c5f0ccc1 100644
--- a/ext/date/tests/timezone_transitions_get_basic1.phpt
+++ b/ext/date/tests/timezone_transitions_get_basic1.phpt
@@ -18,24 +18,24 @@ $tz = timezone_open("Europe/London");
$tran = timezone_transitions_get($tz);
-echo "\n-- Get all transitions --\n";
-$tran = timezone_transitions_get($tz);
+echo "\n-- Get all 60s transitions --\n";
+$tran = timezone_transitions_get($tz, -306972000, -37241999);
var_dump( gettype($tran) );
echo "\n-- Total number of transitions: " . count($tran). " --\n";
echo "\n-- Format a sample entry pfor Spring 1963 --\n";
-var_dump( $tran[97] );
+var_dump( $tran[6] );
?>
===DONE===
--EXPECT--
*** Testing timezone_transitions_get() : basic functionality ***
--- Get all transitions --
+-- Get all 60s transitions --
string(5) "array"
--- Total number of transitions: 243 --
+-- Total number of transitions: 18 --
-- Format a sample entry pfor Spring 1963 --
array(5) {
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 92d5fb5d33..d435b1c281 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -1379,7 +1379,11 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, size_t so
xmlInitParser();
if (mode == DOM_LOAD_FILE) {
- char *file_dest = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN );
+ char *file_dest;
+ if (CHECK_NULL_PATH(source, source_len)) {
+ return NULL;
+ }
+ file_dest = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN);
if (file_dest) {
ctxt = xmlCreateFileParserCtxt(file_dest);
}
@@ -1979,7 +1983,7 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
id = getThis();
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &source, &source_len, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|l", &source, &source_len, &options) == FAILURE) {
return;
}
diff --git a/ext/dom/tests/DOMDocument_loadHTMLfile_error2.phpt b/ext/dom/tests/DOMDocument_loadHTMLfile_error2.phpt
index e59ff56c5a..75004e2a74 100644
--- a/ext/dom/tests/DOMDocument_loadHTMLfile_error2.phpt
+++ b/ext/dom/tests/DOMDocument_loadHTMLfile_error2.phpt
@@ -13,6 +13,11 @@ assert.bail=true
$doc = new DOMDocument();
$result = $doc->loadHTMLFile("");
assert('$result === false');
+$doc = new DOMDocument();
+$result = $doc->loadHTMLFile("text.html\0something");
+assert('$result === null');
?>
--EXPECTF--
%r(PHP ){0,1}%rWarning: DOMDocument::loadHTMLFile(): Empty string supplied as input %s
+
+%r(PHP ){0,1}%rWarning: DOMDocument::loadHTMLFile() expects parameter 1 to be a valid path, string given %s
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c
index c4745f92fe..40df99df47 100644
--- a/ext/fileinfo/fileinfo.c
+++ b/ext/fileinfo/fileinfo.c
@@ -531,6 +531,11 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
RETVAL_FALSE;
goto clean;
}
+ if (CHECK_NULL_PATH(buffer, buffer_len)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid path");
+ RETVAL_FALSE;
+ goto clean;
+ }
wrap = php_stream_locate_url_wrapper(buffer, &tmp2, 0);
diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c
index 24fa0ec436..3fd30ff42c 100644
--- a/ext/fileinfo/libmagic/softmagic.c
+++ b/ext/fileinfo/libmagic/softmagic.c
@@ -624,7 +624,6 @@ mprint(struct magic_set *ms, struct magic *m)
t = ms->offset + sizeof(double);
break;
- case FILE_SEARCH:
case FILE_REGEX: {
char *cp;
int rval;
@@ -648,6 +647,15 @@ mprint(struct magic_set *ms, struct magic *m)
break;
}
+ case FILE_SEARCH:
+ if (file_printf(ms, F(ms, m, "%s"), m->value.s) == -1)
+ return -1;
+ if ((m->str_flags & REGEX_OFFSET_START))
+ t = ms->search.offset;
+ else
+ t = ms->search.offset + m->vallen;
+ break;
+
case FILE_DEFAULT:
case FILE_CLEAR:
if (file_printf(ms, "%s", m->desc) == -1)
@@ -1101,7 +1109,14 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
if (bytecnt > nbytes) {
bytecnt = nbytes;
}
-
+ if (offset > bytecnt) {
+ offset = bytecnt;
+ }
+ if (s == NULL) {
+ ms->search.s_len = 0;
+ ms->search.s = NULL;
+ return 0;
+ }
buf = RCAST(const char *, s) + offset;
end = last = RCAST(const char *, s) + bytecnt;
/* mget() guarantees buf <= last */
diff --git a/ext/fileinfo/tests/bug68819_001.phpt b/ext/fileinfo/tests/bug68819_001.phpt
new file mode 100644
index 0000000000..ce39ee61db
--- /dev/null
+++ b/ext/fileinfo/tests/bug68819_001.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #68819 Fileinfo on specific file causes spurious OOM and/or segfault, var 1
+--SKIPIF--
+<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
+--FILE--
+<?php
+
+$string = <<<HERE
+----a-----'''---------a---------------a--------a-----a-----a---------a-----as-------a----a--a-------------a--as-----s---------------a---------a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s------------a-----a----------------a----s-----------------\r\n-------------------a-------a-a-------a-----a----a----s----s--------a-----------------------a----a----s-------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a----s----s--------a----------a----------------------a----a----s-------------a----------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n------a-------a-a-------a-----a----a---a-----a-----------------------a----a---a-----a------------------s-------a----a---a-----a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s------\r\n-------------------a-------a-a-------a-----a----a---a-------a------------------------a----a---a-----''--a-------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a-------s-----a---a-------------------------a----a-------------a---a-------------------s-------a----a-------------a---a-----as-a--------------a-----a--s----s---------y------------a-----a-s---a-------''----a---s--a-''------''----s------------a-y----------------s------a-----y--a-s--a-s------s--a-s----------''----------------------------a---s--a----a---------a-s---a-s--------s--------a---------s--a-y-------------as----a----a-------------a------a---s--a-s------a--------a----s----y--as--a----a-s---------------a-----a--------------------------------------\r\n-------------------a-------a-a-------a-----a----a-----------s--------a-----------------------a----a--------------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a-----------s--------a----------a----------------------a----a--------------------a------------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a---a-----------------------a----a---a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a---a----------a----------------------a----a---a------------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-----a-a-----------a-------a-a-------a-----a----a----a---s-----a-----------------------a----a----a---------a-----------------s-------a----a----a---------a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a--------a----a-----------------------a----a----------a----a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-----a-------------a-------a-a-------a-----a----a--------s-----a---a-------------------------a----a--------------a---a-------------------s-------------a---------------a----a---a---a-----as-a--------------a-----a--s----s---------y------------a-----a-s---a-------''----a---s--a-''------''----s------------a-y----------------s------a-----y--a-s--a-s------s--a-s----------''----------------------------a---s--a----a---------a-s---a-s--------s--------a---------s--a-y-------------as----a----a-------------a------a---s--a-s------a--------a----s----y--as--a----a-s---------------a-----a--------------------------------------\r\n-------------------a-------a-a-------a-----a----a----------------a-----------------------a----a----------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a----------------a----------a----------------------a----a----------------a-----------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n---a---------------a-------a-a-------a-----as------------------------a--a--s------------------a-s------------------------a-----s--a-----'''----------a-s---------------------------------------------a-----s--a-----------------a---------a---a--s-a-----a-----------asy---------a-----a-----------a----s----------------------a----s--a-------------a-------a--------a----s------------a-----a----------------a----s------------------\r\n-a-----------------a-------a-a-------a--y---------a------------------y---------a-----'''-------y------a-y--a-------------------------a---------a---a----------as-a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n-a-----------------a-------a-a-------a--y-------------a------------------y-------------a-----'''-------y----------a-y--a-------------------------a---------a---a----------as-a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n-------------------a-------a-a-------a--a----a-----a------------------a----a-----a-----'''----------a----s----a----a-------s---a------------------a-----------a--s-a-----a---------------------a------a----s-a-----a-------s-s-------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n------aa-----------a-------a-a------------s-a--s---------a---a------------------------a------------a---a------------------s--------a------------a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a------------------------s-----s--a----a-----------------------------------------s--a----a------------------s---------------------------------s--a----a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a--------------s-a---a--------------------------a---a------------------s----------a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s---------------a-----a----------a----------s--a----------s-----------------\r\nsay-------a------------s-----''------a----s--------a-------------a-\r\n
+HERE;
+
+$finfo = new finfo();
+$type = $finfo->buffer($string);
+
+var_dump($type);
+?>
+--EXPECT--
+string(60) "ASCII text, with very long lines, with CRLF line terminators"
diff --git a/ext/fileinfo/tests/bug68819_002.phpt b/ext/fileinfo/tests/bug68819_002.phpt
new file mode 100644
index 0000000000..cec238d63e
--- /dev/null
+++ b/ext/fileinfo/tests/bug68819_002.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #68819 Fileinfo on specific file causes spurious OOM and/or segfault, var 2
+--SKIPIF--
+<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
+--FILE--
+<?php
+
+$string = '';
+
+// These two in any order
+$string .= "\r\n";
+$string .= "''''";
+
+// Total string length > 8192
+$string .= str_repeat(chr(rand(32, 127)), 8184);
+
+// Ending in this string
+$string .= "say";
+
+$finfo = new finfo();
+$type = $finfo->buffer($string);
+var_dump($type);
+
+?>
+--EXPECT--
+string(60) "ASCII text, with very long lines, with CRLF line terminators"
diff --git a/ext/fileinfo/tests/finfo_file_basic.phpt b/ext/fileinfo/tests/finfo_file_basic.phpt
index 20223fd88e..84cf80d6d5 100644
--- a/ext/fileinfo/tests/finfo_file_basic.phpt
+++ b/ext/fileinfo/tests/finfo_file_basic.phpt
@@ -19,6 +19,7 @@ echo "*** Testing finfo_file() : basic functionality ***\n";
var_dump( finfo_file( $finfo, __FILE__) );
var_dump( finfo_file( $finfo, __FILE__, FILEINFO_CONTINUE ) );
var_dump( finfo_file( $finfo, $magicFile ) );
+var_dump( finfo_file( $finfo, $magicFile.chr(0).$magicFile) );
?>
===DONE===
@@ -27,4 +28,7 @@ var_dump( finfo_file( $finfo, $magicFile ) );
string(28) "text/x-php; charset=us-ascii"
string(22) "PHP script, ASCII text"
string(25) "text/plain; charset=utf-8"
+
+Warning: finfo_file(): Invalid path in %s%efinfo_file_basic.php on line %d
+bool(false)
===DONE===
diff --git a/ext/filter/filter.c b/ext/filter/filter.c
index 67f190eda5..a2e22e7ed7 100644
--- a/ext/filter/filter.c
+++ b/ext/filter/filter.c
@@ -388,6 +388,7 @@ static void php_zval_filter(zval *value, zend_long filter, zend_long flags, zval
ce = Z_OBJCE_P(value);
if (!ce->__tostring) {
+ zval_ptr_dtor(value);
ZVAL_FALSE(value);
return;
}
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index fec29d7519..9105fe6609 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -2405,7 +2405,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
#endif
if (image_type == PHP_GDIMG_TYPE_GD2PART) {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sllll", &file, &file_len, &srcx, &srcy, &width, &height) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "pllll", &file, &file_len, &srcx, &srcy, &width, &height) == FAILURE) {
return;
}
if (width < 1 || height < 1) {
@@ -2413,7 +2413,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
RETURN_FALSE;
}
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &file, &file_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &file, &file_len) == FAILURE) {
return;
}
}
@@ -4155,7 +4155,7 @@ PHP_FUNCTION(imagepsencodefont)
size_t enc_len;
int *f_ind;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &fnt, &enc, &enc_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &fnt, &enc, &enc_len) == FAILURE) {
return;
}
diff --git a/ext/gd/tests/imageloadfont_error1.phpt b/ext/gd/tests/imageloadfont_error1.phpt
index 0e1386fcaf..418bbf3ced 100644
--- a/ext/gd/tests/imageloadfont_error1.phpt
+++ b/ext/gd/tests/imageloadfont_error1.phpt
@@ -3,7 +3,7 @@ Testing that imageloadfont() breaks on non-string first parameter
--CREDITS--
Neveo Harrison <neveoo [at] gmail [dot] com> #testfest #tek11
--SKIPIF--
-<?php
+<?php
if (!extension_loaded("gd")) die("skip GD not present");
?>
--FILE--
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 9583934679..1994052686 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -245,6 +245,9 @@ typedef struct _gmp_temp {
#define GMP_MAX_BASE 62
+#define GMP_51_OR_NEWER \
+ ((__GNU_MP_VERSION >= 6) || (__GNU_MP_VERSION >= 5 && __GNU_MP_VERSION_MINOR >= 1))
+
#define IS_GMP(zval) \
(Z_TYPE_P(zval) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zval), gmp_ce))
@@ -1388,11 +1391,12 @@ ZEND_FUNCTION(gmp_pow)
RETURN_FALSE;
}
- INIT_GMP_RETVAL(gmpnum_result);
if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) {
+ INIT_GMP_RETVAL(gmpnum_result);
mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
} else {
FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
+ INIT_GMP_RETVAL(gmpnum_result);
mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
FREE_GMP_TEMP(temp_base);
}
@@ -1574,7 +1578,15 @@ ZEND_FUNCTION(gmp_rootrem)
add_next_index_zval(return_value, &result1);
add_next_index_zval(return_value, &result2);
+#if GMP_51_OR_NEWER
+ /* mpz_rootrem() is supported since GMP 4.2, but buggy wrt odd roots
+ * of negative numbers */
mpz_rootrem(gmpnum_result1, gmpnum_result2, gmpnum_a, (gmp_ulong) nth);
+#else
+ mpz_root(gmpnum_result1, gmpnum_a, (gmp_ulong) nth);
+ mpz_pow_ui(gmpnum_result2, gmpnum_result1, (gmp_ulong) nth);
+ mpz_sub(gmpnum_result2, gmpnum_a, gmpnum_result2);
+#endif
FREE_GMP_TEMP(temp_a);
}
diff --git a/ext/gmp/tests/gmp_random_bits.phpt b/ext/gmp/tests/gmp_random_bits.phpt
index 21d493cdb6..b4aa5d7b73 100644
--- a/ext/gmp/tests/gmp_random_bits.phpt
+++ b/ext/gmp/tests/gmp_random_bits.phpt
@@ -13,7 +13,7 @@ var_dump(gmp_random_bits(-1));
gmp_random_bits(1);
gmp_random_bits(1024);
-// 2 seconds to make sure the numbers stay in range
+// 0.5 seconds to make sure the numbers stay in range
$start = microtime(true);
$limit = (2 ** 30) - 1;
while (1) {
@@ -26,7 +26,7 @@ while (1) {
}
}
- if (microtime(true) - $start > 2) {
+ if (microtime(true) - $start > 0.5) {
break;
}
}
diff --git a/ext/gmp/tests/gmp_random_range.phpt b/ext/gmp/tests/gmp_random_range.phpt
index a8e7c4a9c1..db2ece61c5 100644
--- a/ext/gmp/tests/gmp_random_range.phpt
+++ b/ext/gmp/tests/gmp_random_range.phpt
@@ -30,7 +30,7 @@ gmp_random_range(-1, $plusTen);
gmp_random_range($zero, $plusTen);
gmp_random_range($minusTen, $plusTen);
-// 2 seconds to make sure the numbers stay in range
+// 0.5 seconds to make sure the numbers stay in range
$start = microtime(true);
while (1) {
for ($i = 0; $i < 5000; $i++) {
@@ -56,7 +56,7 @@ while (1) {
}
}
- if (microtime(true) - $start > 2) {
+ if (microtime(true) - $start > 0.5) {
break;
}
}
diff --git a/ext/gmp/tests/gmp_remroot.phpt b/ext/gmp/tests/gmp_remroot.phpt
index 4a3539d87c..331f447aa2 100644
--- a/ext/gmp/tests/gmp_remroot.phpt
+++ b/ext/gmp/tests/gmp_remroot.phpt
@@ -56,7 +56,7 @@ array(2) {
[1]=>
object(GMP)#%d (1) {
["num"]=>
- string(2) "36"
+ string(3) "-36"
}
}
array(2) {
diff --git a/ext/hash/hash.c b/ext/hash/hash.c
index 3a15fc6fcc..0510d3749c 100644
--- a/ext/hash/hash.c
+++ b/ext/hash/hash.c
@@ -137,6 +137,7 @@ static void php_hash_do_hash(INTERNAL_FUNCTION_PARAMETERS, int isfilename, zend_
}
if (isfilename) {
if (CHECK_NULL_PATH(data, data_len)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid path");
RETURN_FALSE;
}
stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, DEFAULT_CONTEXT);
@@ -254,6 +255,10 @@ static void php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAMETERS, int isfilename,
RETURN_FALSE;
}
if (isfilename) {
+ if (CHECK_NULL_PATH(data, data_len)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid path");
+ RETURN_FALSE;
+ }
stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, DEFAULT_CONTEXT);
if (!stream) {
/* Stream will report errors opening file */
@@ -464,7 +469,7 @@ PHP_FUNCTION(hash_update_file)
char *filename, buf[1024];
size_t filename_len, n;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|r", &zhash, &filename, &filename_len, &zcontext) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp|r", &zhash, &filename, &filename_len, &zcontext) == FAILURE) {
return;
}
diff --git a/ext/hash/tests/hash_hmac_file_error.phpt b/ext/hash/tests/hash_hmac_file_error.phpt
index 42ab122285..26ba8aacbe 100644
--- a/ext/hash/tests/hash_hmac_file_error.phpt
+++ b/ext/hash/tests/hash_hmac_file_error.phpt
@@ -28,6 +28,9 @@ hash_hmac_file('crc32', $file, $key, TRUE, $extra_arg);
echo "\n-- Testing hash_hmac_file() function with invalid hash algorithm --\n";
hash_hmac_file('foo', $file, $key, TRUE);
+echo "\n-- Testing hash_hmac_file() function with bad path --\n";
+hash_hmac_file('crc32', $file.chr(0).$file, $key, TRUE);
+
?>
===Done===
--EXPECTF--
@@ -51,4 +54,8 @@ Warning: hash_hmac_file() expects at most 4 parameters, 5 given in %s on line %d
-- Testing hash_hmac_file() function with invalid hash algorithm --
Warning: hash_hmac_file(): Unknown hashing algorithm: foo in %s on line %d
+
+-- Testing hash_hmac_file() function with bad path --
+
+Warning: hash_hmac_file(): Invalid path in %s on line %d
===Done=== \ No newline at end of file
diff --git a/ext/intl/breakiterator/breakiterator_methods.cpp b/ext/intl/breakiterator/breakiterator_methods.cpp
index baab5a682d..ce855ebacd 100644
--- a/ext/intl/breakiterator/breakiterator_methods.cpp
+++ b/ext/intl/breakiterator/breakiterator_methods.cpp
@@ -162,11 +162,11 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text)
BREAKITER_METHOD_FETCH_OBJECT;
ut = utext_openUTF8(ut, text->val, text->len, BREAKITER_ERROR_CODE_P(bio));
- INTL_CTOR_CHECK_STATUS(bio, "breakiter_set_text: error opening UText");
+ INTL_METHOD_CHECK_STATUS_OR_NULL(bio, "breakiter_set_text: error opening UText");
bio->biter->setText(ut, BREAKITER_ERROR_CODE(bio));
utext_close(ut); /* ICU shallow clones the UText */
- INTL_CTOR_CHECK_STATUS(bio, "breakiter_set_text: error calling "
+ INTL_METHOD_CHECK_STATUS_OR_NULL(bio, "breakiter_set_text: error calling "
"BreakIterator::setText()");
/* When ICU clones the UText, it does not copy the buffer, so we have to
diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp
index c8acf5fe54..ac5b33a89c 100644
--- a/ext/intl/calendar/calendar_methods.cpp
+++ b/ext/intl/calendar/calendar_methods.cpp
@@ -1161,11 +1161,11 @@ U_CFUNC PHP_FUNCTION(intlcal_from_date_time)
Z_OBJCE_P(zv_arg), php_date_get_date_ce()))) {
object_init_ex(&zv_tmp, php_date_get_date_ce());
zend_call_method_with_1_params(&zv_tmp, NULL, NULL, "__construct", NULL, zv_arg);
+ zv_datetime = &zv_tmp;
if (EG(exception)) {
zend_object_store_ctor_failed(Z_OBJ(zv_tmp));
goto error;
}
- zv_datetime = &zv_tmp;
} else {
zv_datetime = zv_arg;
}
diff --git a/ext/intl/collator/collator_create.c b/ext/intl/collator/collator_create.c
index b6ad4502db..d32a4c637f 100644
--- a/ext/intl/collator/collator_create.c
+++ b/ext/intl/collator/collator_create.c
@@ -25,7 +25,7 @@
#include "intl_data.h"
/* {{{ */
-static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+static int collator_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
const char* locale;
size_t locale_len = 0;
@@ -41,11 +41,10 @@ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor
{
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
"collator_create: unable to parse input params", 0 );
- zval_dtor(return_value);
- RETURN_NULL();
+ return FAILURE;
}
- INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value);
+ INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
COLLATOR_METHOD_FETCH_OBJECT;
if(locale_len == 0) {
@@ -55,6 +54,7 @@ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor
/* Open ICU collator. */
co->ucoll = ucol_open( locale, COLLATOR_ERROR_CODE_P( co ) );
INTL_CTOR_CHECK_STATUS(co, "collator_create: unable to open ICU collator");
+ return SUCCESS;
}
/* }}} */
@@ -64,7 +64,10 @@ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor
PHP_FUNCTION( collator_create )
{
object_init_ex( return_value, Collator_ce_ptr );
- collator_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+ if (collator_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) == FAILURE) {
+ zval_ptr_dtor(return_value);
+ RETURN_NULL();
+ }
}
/* }}} */
@@ -77,8 +80,7 @@ PHP_METHOD( Collator, __construct )
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
return_value = getThis();
- collator_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (collator_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
if (!EG(exception)) {
zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0);
}
diff --git a/ext/intl/dateformat/dateformat_attrcpp.cpp b/ext/intl/dateformat/dateformat_attrcpp.cpp
index 8320904b63..49c4094a40 100644
--- a/ext/intl/dateformat/dateformat_attrcpp.cpp
+++ b/ext/intl/dateformat/dateformat_attrcpp.cpp
@@ -94,7 +94,6 @@ U_CFUNC PHP_FUNCTION(datefmt_get_timezone)
RETURN_FALSE;
}
- object_init_ex(return_value, TimeZone_ce_ptr);
timezone_object_construct(tz_clone, return_value, 1);
}
diff --git a/ext/intl/dateformat/dateformat_create.cpp b/ext/intl/dateformat/dateformat_create.cpp
index afc182131d..1999b6a8c1 100644
--- a/ext/intl/dateformat/dateformat_create.cpp
+++ b/ext/intl/dateformat/dateformat_create.cpp
@@ -37,7 +37,7 @@ extern "C" {
#include "zend_exceptions.h"
/* {{{ */
-static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
zval *object;
@@ -58,7 +58,7 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
UChar* svalue = NULL; /* UTF-16 pattern_str */
int32_t slength = 0;
IntlDateFormatter_object* dfo;
- int zpp_flags = is_constructor ? ZEND_PARSE_PARAMS_THROW : 0;
+ int zpp_flags = is_constructor ? ZEND_PARSE_PARAMS_THROW : 0;
intl_error_reset(NULL);
object = return_value;
@@ -68,11 +68,10 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
&calendar_zv, &pattern_str, &pattern_str_len) == FAILURE) {
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: "
"unable to parse input parameters", 0);
- Z_OBJ_P(return_value) = NULL;
- return;
+ return FAILURE;
}
- INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value);
+ INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
if (locale_len == 0) {
locale_str = intl_locale_get_default();
}
@@ -83,7 +82,7 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
if (DATE_FORMAT_OBJECT(dfo) != NULL) {
intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR,
"datefmt_create: cannot call constructor twice", 0);
- return;
+ return FAILURE;
}
/* process calendar */
@@ -162,10 +161,8 @@ error:
if (calendar != NULL && calendar_owned) {
delete calendar;
}
- if (U_FAILURE(intl_error_get_code(NULL))) {
- /* free_object handles partially constructed instances fine */
- Z_OBJ_P(return_value) = NULL;
- }
+
+ return U_FAILURE(intl_error_get_code(NULL)) ? FAILURE : SUCCESS;
}
/* }}} */
@@ -177,8 +174,8 @@ error:
U_CFUNC PHP_FUNCTION( datefmt_create )
{
object_init_ex( return_value, IntlDateFormatter_ce_ptr );
- datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) == FAILURE) {
+ zval_ptr_dtor(return_value);
RETURN_NULL();
}
}
@@ -195,8 +192,7 @@ U_CFUNC PHP_METHOD( IntlDateFormatter, __construct )
/* return_value param is being changed, therefore we will always return
* NULL here */
return_value = getThis();
- datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
if (!EG(exception)) {
zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0);
}
diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c
index 5b7e634053..bf0d2a80b7 100644
--- a/ext/intl/formatter/formatter_main.c
+++ b/ext/intl/formatter/formatter_main.c
@@ -25,7 +25,7 @@
#include "intl_convert.h"
/* {{{ */
-static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
const char* locale;
char* pattern = NULL;
@@ -42,11 +42,10 @@ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
"numfmt_create: unable to parse input parameters", 0 );
- Z_OBJ_P(return_value) = NULL;
- return;
+ return FAILURE;
}
- INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value);
+ INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
object = return_value;
FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK;
@@ -68,6 +67,7 @@ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
}
INTL_CTOR_CHECK_STATUS(nfo, "numfmt_create: number formatter creation failed");
+ return SUCCESS;
}
/* }}} */
@@ -79,8 +79,8 @@ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
PHP_FUNCTION( numfmt_create )
{
object_init_ex( return_value, NumberFormatter_ce_ptr );
- numfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (numfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) == FAILURE) {
+ zval_ptr_dtor(return_value);
RETURN_NULL();
}
}
@@ -95,8 +95,7 @@ PHP_METHOD( NumberFormatter, __construct )
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
return_value = getThis();
- numfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (numfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
if (!EG(exception)) {
zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0);
}
diff --git a/ext/intl/intl_data.h b/ext/intl/intl_data.h
index 6001aa1285..8a11639047 100644
--- a/ext/intl/intl_data.h
+++ b/ext/intl/intl_data.h
@@ -54,7 +54,7 @@ typedef struct _intl_data {
RETURN_FALSE; \
}
-/* Check status in object, if error - exit */
+/* Check status in object, if error return false */
#define INTL_METHOD_CHECK_STATUS(obj, msg) \
intl_error_set_code( NULL, INTL_DATA_ERROR_CODE((obj)) ); \
if( U_FAILURE( INTL_DATA_ERROR_CODE((obj)) ) ) \
@@ -63,19 +63,23 @@ typedef struct _intl_data {
RETURN_FALSE; \
}
-/* Check status, if error - destroy value and exit */
+/* Check status in object, if error return null */
+#define INTL_METHOD_CHECK_STATUS_OR_NULL(obj, msg) \
+ intl_error_set_code( NULL, INTL_DATA_ERROR_CODE((obj)) ); \
+ if( U_FAILURE( INTL_DATA_ERROR_CODE((obj)) ) ) \
+ { \
+ intl_errors_set_custom_msg( INTL_DATA_ERROR_P((obj)), msg, 0 ); \
+ zval_ptr_dtor(return_value); \
+ RETURN_NULL(); \
+ }
+
+/* Check status in object, if error return FAILURE */
#define INTL_CTOR_CHECK_STATUS(obj, msg) \
- intl_error_set_code( NULL, INTL_DATA_ERROR_CODE((obj)) ); \
+ intl_error_set_code( NULL, INTL_DATA_ERROR_CODE((obj)) ); \
if( U_FAILURE( INTL_DATA_ERROR_CODE((obj)) ) ) \
{ \
- intl_errors_set_custom_msg( INTL_DATA_ERROR_P((obj)), msg, 0 ); \
- /* yes, this is ugly, but it alreay is */ \
- if (return_value != getThis()) { \
- zval_dtor(return_value); \
- RETURN_NULL(); \
- } \
- Z_OBJ_P(return_value) = NULL; \
- return; \
+ intl_errors_set_custom_msg( INTL_DATA_ERROR_P((obj)), msg, 0 ); \
+ return FAILURE; \
}
#define INTL_METHOD_RETVAL_UTF8(obj, ustring, ulen, free_it) \
@@ -100,14 +104,11 @@ typedef struct _intl_data {
RETURN_NULL(); \
}
-#define INTL_CHECK_LOCALE_LEN_OBJ(locale_len, object) \
+#define INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len) \
if((locale_len) > INTL_MAX_LOCALE_LEN) { \
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, \
"Locale string too long, should be no longer than 80 characters", 0 ); \
- zval_dtor(object); \
- ZVAL_NULL(object); \
- RETURN_NULL(); \
+ return FAILURE; \
}
-
#endif // INTL_DATA_H
diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c
index 2675aca5b8..e0919ec42b 100644
--- a/ext/intl/msgformat/msgformat.c
+++ b/ext/intl/msgformat/msgformat.c
@@ -26,7 +26,7 @@
#include "intl_convert.h"
/* {{{ */
-static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+static int msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
const char* locale;
char* pattern;
@@ -45,11 +45,10 @@ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
"msgfmt_create: unable to parse input parameters", 0 );
- Z_OBJ_P(return_value) = NULL;
- return;
+ return FAILURE;
}
- INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value);
+ INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
/* Convert pattern (if specified) to UTF-16. */
@@ -86,6 +85,7 @@ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
}
INTL_CTOR_CHECK_STATUS(mfo, "msgfmt_create: message formatter creation failed");
+ return SUCCESS;
}
/* }}} */
@@ -97,8 +97,8 @@ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
PHP_FUNCTION( msgfmt_create )
{
object_init_ex( return_value, MessageFormatter_ce_ptr );
- msgfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (msgfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) == FAILURE) {
+ zval_ptr_dtor(return_value);
RETURN_NULL();
}
}
@@ -113,8 +113,7 @@ PHP_METHOD( MessageFormatter, __construct )
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
return_value = getThis();
- msgfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (msgfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
if (!EG(exception)) {
zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0);
}
diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c
index a42556f746..d6b071a249 100644
--- a/ext/intl/resourcebundle/resourcebundle_class.c
+++ b/ext/intl/resourcebundle/resourcebundle_class.c
@@ -75,7 +75,7 @@ static zend_object *ResourceBundle_object_create( zend_class_entry *ce )
/* }}} */
/* {{{ ResourceBundle_ctor */
-static void resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+static int resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
{
const char *bundlename;
size_t bundlename_len = 0;
@@ -94,11 +94,10 @@ static void resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_const
{
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
"resourcebundle_ctor: unable to parse input parameters", 0 );
- Z_OBJ_P(return_value) = NULL;
- return;
+ return FAILURE;
}
- INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value);
+ INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
if (locale == NULL) {
locale = intl_locale_get_default();
@@ -123,8 +122,10 @@ static void resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_const
rb->me, ULOC_ACTUAL_LOCALE, &INTL_DATA_ERROR_CODE(rb)));
intl_errors_set_custom_msg(INTL_DATA_ERROR_P(rb), pbuf, 1);
efree(pbuf);
- Z_OBJ_P(return_value) = NULL;
+ return FAILURE;
}
+
+ return SUCCESS;
}
/* }}} */
@@ -145,8 +146,7 @@ PHP_METHOD( ResourceBundle, __construct )
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, &error_handling);
return_value = getThis();
- resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
if (!EG(exception)) {
zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0);
}
@@ -161,8 +161,8 @@ proto ResourceBundle resourcebundle_create( string $locale [, string $bundlename
PHP_FUNCTION( resourcebundle_create )
{
object_init_ex( return_value, ResourceBundle_ce_ptr );
- resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
+ if (resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) == FAILURE) {
+ zval_ptr_dtor(return_value);
RETURN_NULL();
}
}
diff --git a/ext/intl/spoofchecker/spoofchecker_create.c b/ext/intl/spoofchecker/spoofchecker_create.c
index 865f600dfc..fbe7cbae1d 100644
--- a/ext/intl/spoofchecker/spoofchecker_create.c
+++ b/ext/intl/spoofchecker/spoofchecker_create.c
@@ -41,7 +41,7 @@ PHP_METHOD(Spoofchecker, __construct)
SPOOFCHECKER_METHOD_FETCH_OBJECT_NO_CHECK;
co->uspoof = uspoof_open(SPOOFCHECKER_ERROR_CODE_P(co));
- INTL_CTOR_CHECK_STATUS(co, "spoofchecker: unable to open ICU Spoof Checker");
+ INTL_METHOD_CHECK_STATUS(co, "spoofchecker: unable to open ICU Spoof Checker");
/* Single-script enforcement is on by default. This fails for languages
like Japanese that legally use multiple scripts within a single word,
diff --git a/ext/intl/transliterator/transliterator_methods.c b/ext/intl/transliterator/transliterator_methods.c
index d8b030a6d1..ced84a0c60 100644
--- a/ext/intl/transliterator/transliterator_methods.c
+++ b/ext/intl/transliterator/transliterator_methods.c
@@ -169,7 +169,7 @@ PHP_FUNCTION( transliterator_create_from_rules )
str_rules, str_rules_len, TRANSLITERATOR_ERROR_CODE_P( to ) );
/* (I'm not a big fan of non-obvious flow control macros ).
* This one checks the error value, destroys object and returns false */
- INTL_CTOR_CHECK_STATUS( to, "String conversion of rules to UTF-16 failed" );
+ INTL_METHOD_CHECK_STATUS_OR_NULL( to, "String conversion of rules to UTF-16 failed" );
/* Open ICU Transliterator. */
utrans = utrans_openU( id, ( sizeof( id ) - 1 ) / ( sizeof( *id ) ), (UTransDirection ) direction,
@@ -197,7 +197,7 @@ PHP_FUNCTION( transliterator_create_from_rules )
}
transliterator_object_construct( object, utrans, TRANSLITERATOR_ERROR_CODE_P( to ) );
/* no need to close the transliterator manually on construction error */
- INTL_CTOR_CHECK_STATUS( to, "transliterator_create_from_rules: internal constructor call failed" );
+ INTL_METHOD_CHECK_STATUS_OR_NULL( to, "transliterator_create_from_rules: internal constructor call failed" );
}
/* }}} */
@@ -227,11 +227,11 @@ PHP_FUNCTION( transliterator_create_inverse )
TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK; /* change "to" into new object (from "object" ) */
utrans = utrans_openInverse( to_orig->utrans, TRANSLITERATOR_ERROR_CODE_P( to ) );
- INTL_CTOR_CHECK_STATUS( to, "transliterator_create_inverse: could not create "
+ INTL_METHOD_CHECK_STATUS_OR_NULL( to, "transliterator_create_inverse: could not create "
"inverse ICU transliterator" );
transliterator_object_construct( object, utrans, TRANSLITERATOR_ERROR_CODE_P( to ) );
/* no need to close the transliterator manually on construction error */
- INTL_CTOR_CHECK_STATUS( to, "transliterator_create: internal constructor call failed" );
+ INTL_METHOD_CHECK_STATUS_OR_NULL( to, "transliterator_create: internal constructor call failed" );
}
/* }}} */
@@ -350,6 +350,7 @@ PHP_FUNCTION( transliterator_transliterate )
php_error_docref0( NULL, E_WARNING, "Could not create "
"transliterator with ID \"%s\" (%s)", Z_STRVAL_P( arg1 ), message->val );
zend_string_free( message );
+ ZVAL_UNDEF(&tmp_object);
/* don't set U_ILLEGAL_ARGUMENT_ERROR to allow fetching of inner error */
goto cleanup;
}
@@ -463,7 +464,7 @@ cleanup:
RETVAL_FALSE;
}
- /* zval_ptr_dtor( &tmp_object ); */
+ zval_ptr_dtor( &tmp_object );
}
/* }}} */
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 857ad7097e..8ade984ffb 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -1716,11 +1716,13 @@ PHP_MINFO_FUNCTION(mbstring)
snprintf(tmp, sizeof(tmp), "%d.%d.%d", MBFL_VERSION_MAJOR, MBFL_VERSION_MINOR, MBFL_VERSION_TEENY);
php_info_print_table_row(2, "libmbfl version", tmp);
}
+#if HAVE_ONIG
{
char tmp[256];
snprintf(tmp, sizeof(tmp), "%d.%d.%d", ONIGURUMA_VERSION_MAJOR, ONIGURUMA_VERSION_MINOR, ONIGURUMA_VERSION_TEENY);
php_info_print_table_row(2, "oniguruma version", tmp);
}
+#endif
php_info_print_table_end();
php_info_print_table_start();
diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c
index 322ec95777..b37ba94d0d 100644
--- a/ext/odbc/php_odbc.c
+++ b/ext/odbc/php_odbc.c
@@ -954,7 +954,7 @@ int odbc_bindcols(odbc_result *result)
charextraalloc = 0;
colfieldid = SQL_COLUMN_DISPLAY_SIZE;
- rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), PHP_ODBC_DESC_BASE_COLUMN_NAME,
+ rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), PHP_ODBC_SQL_DESC_NAME,
result->values[i].name, sizeof(result->values[i].name), &colnamelen, 0);
rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_TYPE,
NULL, 0, NULL, &result->values[i].coltype);
@@ -1172,7 +1172,7 @@ PHP_FUNCTION(odbc_prepare)
result->numparams = 0;
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -1609,7 +1609,7 @@ PHP_FUNCTION(odbc_exec)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
efree(result);
@@ -3141,7 +3141,7 @@ PHP_FUNCTION(odbc_tables)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3210,7 +3210,7 @@ PHP_FUNCTION(odbc_columns)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3282,7 +3282,7 @@ PHP_FUNCTION(odbc_columnprivileges)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3360,7 +3360,7 @@ PHP_FUNCTION(odbc_foreignkeys)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3428,7 +3428,7 @@ PHP_FUNCTION(odbc_gettypeinfo)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3487,7 +3487,7 @@ PHP_FUNCTION(odbc_primarykeys)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3555,7 +3555,7 @@ PHP_FUNCTION(odbc_procedurecolumns)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3624,7 +3624,7 @@ PHP_FUNCTION(odbc_procedures)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3694,7 +3694,7 @@ PHP_FUNCTION(odbc_specialcolumns)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3765,7 +3765,7 @@ PHP_FUNCTION(odbc_statistics)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
@@ -3830,7 +3830,7 @@ PHP_FUNCTION(odbc_tableprivileges)
result = (odbc_result *)ecalloc(1, sizeof(odbc_result));
- rc = SQLAllocStmt(conn->hdbc, &(result->stmt));
+ rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) {
efree(result);
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h
index f9853a6c15..832c65da3e 100644
--- a/ext/odbc/php_odbc_includes.h
+++ b/ext/odbc/php_odbc_includes.h
@@ -283,14 +283,16 @@ void odbc_sql_error(ODBC_SQL_ERROR_PARAMS);
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WLONGVARCHAR)
#define PHP_ODBC_SQLCOLATTRIBUTE SQLColAttribute
+#define PHP_ODBC_SQLALLOCSTMT(hdbc, phstmt) SQLAllocHandle(SQL_HANDLE_STMT, hdbc, phstmt)
-#define PHP_ODBC_DESC_BASE_COLUMN_NAME SQL_DESC_BASE_COLUMN_NAME
+#define PHP_ODBC_SQL_DESC_NAME SQL_DESC_NAME
#else
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR)
#define PHP_ODBC_SQLCOLATTRIBUTE SQLColAttributes
+#define PHP_ODBC_SQLALLOCSTMT SQLAllocStmt
-#define PHP_ODBC_DESC_BASE_COLUMN_NAME SQL_COLUMN_NAME
+#define PHP_ODBC_SQL_DESC_NAME SQL_COLUMN_NAME
#endif
#define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == SQL_LONGVARBINARY)
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index 85af8330dd..aa38562687 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -27,7 +27,7 @@
#endif
#define ACCELERATOR_PRODUCT_NAME "Zend OPcache"
-#define PHP_ZENDOPCACHE_VERSION "7.0.4-dev"
+#define PHP_ZENDOPCACHE_VERSION "7.0.6-dev"
#define ACCELERATOR_VERSION PHP_ZENDOPCACHE_VERSION
/* 2 - added Profiler support, on 20010712 */
/* 3 - added support for Optimizer's encoded-only-files mode */
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 0c20fa1e15..1697d80bb9 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -1250,7 +1250,9 @@ PHP_MINIT_FUNCTION(openssl)
}
php_stream_xport_register("ssl", php_openssl_ssl_socket_factory);
+#ifndef OPENSSL_NO_SSL3
php_stream_xport_register("sslv3", php_openssl_ssl_socket_factory);
+#endif
#ifndef OPENSSL_NO_SSL2
php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory);
#endif
@@ -1299,7 +1301,9 @@ PHP_MSHUTDOWN_FUNCTION(openssl)
#ifndef OPENSSL_NO_SSL2
php_stream_xport_unregister("sslv2");
#endif
+#ifndef OPENSSL_NO_SSL3
php_stream_xport_unregister("sslv3");
+#endif
php_stream_xport_unregister("tls");
php_stream_xport_unregister("tlsv1.0");
#if OPENSSL_VERSION_NUMBER >= 0x10001001L
diff --git a/ext/openssl/tests/bug68912.phpt b/ext/openssl/tests/bug68912.phpt
index 7d763db8e9..c18291a6ec 100644
--- a/ext/openssl/tests/bug68912.phpt
+++ b/ext/openssl/tests/bug68912.phpt
@@ -3,6 +3,7 @@ Bug #68912 (Segmentation fault at openssl_spki_new)
--SKIPIF--
<?php
if (!extension_loaded("openssl")) die("skip");
+if (!extension_loaded("xml")) die("skip xml extension not loaded");
if (!@openssl_pkey_new()) die("skip cannot create private key");
?>
--FILE--
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index f7f6219ffb..2fbc615dd2 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -2032,10 +2032,15 @@ static size_t php_openssl_sockop_io(int read, php_stream *stream, char *buf, siz
stream->eof = (retry == 0 && errno != EAGAIN && !SSL_pending(sslsock->ssl_handle));
}
+ /* Don't loop indefinitely in non-blocking mode if no data is available */
+ if (began_blocked == 0) {
+ break;
+ }
+
/* Now, if we have to wait some time, and we're supposed to be blocking, wait for the socket to become
* available. Now, php_pollfd_for uses select to wait up to our time_left value only...
*/
- if (retry && began_blocked) {
+ if (retry) {
if (read) {
php_pollfd_for(sslsock->s.socket, (err == SSL_ERROR_WANT_WRITE) ?
(POLLOUT|POLLPRI) : (POLLIN|POLLPRI), has_timeout ? &left_time : NULL);
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 117d288bb7..4c29905d2f 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -262,7 +262,13 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
if (pce->locale == BG(locale_string) ||
(pce->locale && BG(locale_string) &&
pce->locale->len == BG(locale_string)->len &&
- !memcmp(pce->locale->val, BG(locale_string)->val, pce->locale->len))) {
+ !memcmp(pce->locale->val, BG(locale_string)->val, pce->locale->len)) ||
+ (!pce->locale &&
+ BG(locale_string)->len == 1 &&
+ BG(locale_string)->val[0] == 'C') ||
+ (!BG(locale_string) &&
+ pce->locale->len == 1 &&
+ pce->locale->val[0] == 'C')) {
return pce;
}
#else
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index a847ae5103..9029e4a8ea 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1114,6 +1114,8 @@ static PHP_METHOD(PDO, query)
/* something broke */
dbh->query_stmt = stmt;
ZVAL_COPY_VALUE(&dbh->query_stmt_zval, return_value);
+ Z_DELREF(stmt->database_object_handle);
+ ZVAL_UNDEF(&stmt->database_object_handle);
PDO_HANDLE_STMT_ERR();
} else {
PDO_HANDLE_DBH_ERR();
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index 346aba7eb0..3c09609fc6 100644
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -262,7 +262,8 @@ static void get_lazy_object(pdo_stmt_t *stmt, zval *return_value) /* {{{ */
zend_object_std_init(&row->std, pdo_row_ce);
ZVAL_OBJ(&stmt->lazy_object_ref, &row->std);
row->std.handlers = &pdo_row_object_handlers;
- stmt->std.gc.refcount++;
+ GC_REFCOUNT(&stmt->std)++;
+ GC_REFCOUNT(&row->std)--;
}
ZVAL_COPY(return_value, &stmt->lazy_object_ref);
}
@@ -802,7 +803,7 @@ static int do_fetch_func_prepare(pdo_stmt_t *stmt) /* {{{ */
}
/* }}} */
-static int do_fetch_opt_finish(pdo_stmt_t *stmt, int free_ctor_agrs) /* {{{ */
+static void do_fetch_opt_finish(pdo_stmt_t *stmt, int free_ctor_agrs) /* {{{ */
{
/* fci.size is used to check if it is valid */
if (stmt->fetch.cls.fci.size && stmt->fetch.cls.fci.params) {
@@ -825,7 +826,6 @@ static int do_fetch_opt_finish(pdo_stmt_t *stmt, int free_ctor_agrs) /* {{{ */
efree(stmt->fetch.func.values);
stmt->fetch.func.values = NULL;
}
- return 1;
}
/* }}} */
@@ -2338,6 +2338,7 @@ static void free_statement(pdo_stmt_t *stmt)
}
if (!Z_ISUNDEF(stmt->fetch.into) && stmt->default_fetch_type == PDO_FETCH_INTO) {
+ zval_ptr_dtor(&stmt->fetch.into);
ZVAL_UNDEF(&stmt->fetch.into);
}
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index 20cd706b5a..1c760dc94b 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -155,7 +155,11 @@ static int pgsql_lob_seek(php_stream *stream, zend_off_t offset, int whence,
zend_off_t *newoffset)
{
struct pdo_pgsql_lob_self *self = (struct pdo_pgsql_lob_self*)stream->abstract;
- int pos = lo_lseek(self->conn, self->lfd, offset, whence);
+#if ZEND_ENABLE_ZVAL_LONG64
+ zend_off_t pos = lo_lseek64(self->conn, self->lfd, offset, whence);
+#else
+ zend_off_t pos = lo_lseek(self->conn, self->lfd, offset, whence);
+#endif
*newoffset = pos;
return pos >= 0 ? 0 : -1;
}
@@ -1060,6 +1064,11 @@ static PHP_METHOD(PDO, pgsqlGetNotify)
if (ms_timeout < 0) {
php_error_docref(NULL, E_WARNING, "Invalid timeout");
RETURN_FALSE;
+#if ZEND_ENABLE_ZVAL_LONG64
+ } else if (ms_timeout > INT_MAX) {
+ php_error_docref(NULL, E_WARNING, "timeout was shrinked to %d", INT_MAX);
+ ms_timeout = INT_MAX;
+#endif
}
H = (pdo_pgsql_db_handle *)dbh->driver_data;
@@ -1068,7 +1077,7 @@ static PHP_METHOD(PDO, pgsqlGetNotify)
pgsql_notify = PQnotifies(H->server);
if (ms_timeout && !pgsql_notify) {
- php_pollfd_for_ms(PQsocket(H->server), PHP_POLLREADABLE, ms_timeout);
+ php_pollfd_for_ms(PQsocket(H->server), PHP_POLLREADABLE, (int)ms_timeout);
PQconsumeInput(H->server);
pgsql_notify = PQnotifies(H->server);
@@ -1145,16 +1154,16 @@ static int pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
switch (attr) {
case PDO_ATTR_EMULATE_PREPARES:
convert_to_long(val);
- H->emulate_prepares = Z_LVAL_P(val);
+ H->emulate_prepares = 0 != Z_LVAL_P(val);
return 1;
case PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT:
convert_to_long(val);
php_error_docref(NULL, E_DEPRECATED, "PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT is deprecated, use PDO::ATTR_EMULATE_PREPARES instead");
- H->disable_native_prepares = Z_LVAL_P(val);
+ H->disable_native_prepares = 0 != Z_LVAL_P(val);
return 1;
case PDO_PGSQL_ATTR_DISABLE_PREPARES:
convert_to_long(val);
- H->disable_prepares = Z_LVAL_P(val);
+ H->disable_prepares = 0 != Z_LVAL_P(val);
return 1;
default:
return 0;
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index 6cad2a4702..d25cbff979 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -43,25 +43,24 @@ typedef struct {
unsigned _reserved:31;
pdo_pgsql_error_info einfo;
Oid pgoid;
+ unsigned int stmt_counter;
/* The following two variables have the same purpose. Unfortunately we need
to keep track of two different attributes having the same effect. */
- int emulate_prepares;
- int disable_native_prepares; /* deprecated since 5.6 */
- int disable_prepares;
- unsigned int stmt_counter;
+ zend_bool emulate_prepares;
+ zend_bool disable_native_prepares; /* deprecated since 5.6 */
+ zend_bool disable_prepares;
} pdo_pgsql_db_handle;
typedef struct {
char *def;
+ zend_long intval;
Oid pgsql_type;
- zend_long intval;
zend_bool boolval;
} pdo_pgsql_column;
typedef struct {
pdo_pgsql_db_handle *H;
PGresult *result;
- int current_row;
pdo_pgsql_column *cols;
char *cursor_name;
char *stmt_name;
@@ -70,6 +69,7 @@ typedef struct {
int *param_lengths;
int *param_formats;
Oid *param_types;
+ int current_row;
zend_bool is_prepared;
} pdo_pgsql_stmt;
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index 536c94157a..6a86b8941b 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -3126,7 +3126,7 @@ PHP_FUNCTION(pg_trace)
php_stream *stream;
zend_resource *link;
- if (zend_parse_parameters(argc, "s|sr", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link) == FAILURE) {
+ if (zend_parse_parameters(argc, "p|sr", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link) == FAILURE) {
return;
}
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 8c2b596c3d..32f641624a 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -604,48 +604,38 @@ int phar_open_parsed_phar(char *fname, int fname_len, char *alias, int alias_len
*
* data is the serialized zval
*/
-int phar_parse_metadata(char **buffer, zval *metadata, int zip_metadata_len) /* {{{ */
+int phar_parse_metadata(char **buffer, zval *metadata, php_uint32 zip_metadata_len) /* {{{ */
{
- const unsigned char *p;
- php_uint32 buf_len;
php_unserialize_data_t var_hash;
- if (!zip_metadata_len) {
- PHAR_GET_32(*buffer, buf_len);
- } else {
- buf_len = zip_metadata_len;
- }
-
- if (buf_len) {
+ if (zip_metadata_len) {
+ const unsigned char *p;
+ unsigned char *p_buff = (unsigned char *)estrndup(*buffer, zip_metadata_len);
+ p = p_buff;
ZVAL_NULL(metadata);
- p = (const unsigned char*) *buffer;
PHP_VAR_UNSERIALIZE_INIT(var_hash);
- if (!php_var_unserialize(metadata, &p, p + buf_len, &var_hash)) {
+ if (!php_var_unserialize(metadata, &p, p + zip_metadata_len, &var_hash)) {
+ efree(p_buff);
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
zval_ptr_dtor(metadata);
ZVAL_UNDEF(metadata);
return FAILURE;
}
-
+ efree(p_buff);
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
if (PHAR_G(persist)) {
/* lazy init metadata */
zval_ptr_dtor(metadata);
- Z_PTR_P(metadata) = pemalloc(buf_len, 1);
- memcpy(Z_PTR_P(metadata), *buffer, buf_len);
- *buffer += buf_len;
+ Z_PTR_P(metadata) = pemalloc(zip_metadata_len, 1);
+ memcpy(Z_PTR_P(metadata), *buffer, zip_metadata_len);
return SUCCESS;
}
} else {
ZVAL_UNDEF(metadata);
}
- if (!zip_metadata_len) {
- *buffer += buf_len;
- }
-
return SUCCESS;
}
/* }}}*/
@@ -666,6 +656,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char
phar_entry_info entry;
php_uint32 manifest_len, manifest_count, manifest_flags, manifest_index, tmp_len, sig_flags;
php_uint16 manifest_ver;
+ php_uint32 len;
zend_long offset;
int sig_len, register_alias = 0, temp_alias = 0;
char *signature = NULL;
@@ -1031,16 +1022,21 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char
mydata->is_persistent = PHAR_G(persist);
/* check whether we have meta data, zero check works regardless of byte order */
+ PHAR_GET_32(buffer, len);
if (mydata->is_persistent) {
- PHAR_GET_32(buffer, mydata->metadata_len);
- if (phar_parse_metadata(&buffer, &mydata->metadata, mydata->metadata_len) == FAILURE) {
- MAPPHAR_FAIL("unable to read phar metadata in .phar file \"%s\"");
- }
- } else {
- if (phar_parse_metadata(&buffer, &mydata->metadata, 0) == FAILURE) {
- MAPPHAR_FAIL("unable to read phar metadata in .phar file \"%s\"");
+ mydata->metadata_len = len;
+ if(!len) {
+ /* FIXME: not sure why this is needed but removing it breaks tests */
+ PHAR_GET_32(buffer, len);
}
}
+ if(len > endbuffer - buffer) {
+ MAPPHAR_FAIL("internal corruption of phar \"%s\" (trying to read past buffer end)");
+ }
+ if (phar_parse_metadata(&buffer, &mydata->metadata, len) == FAILURE) {
+ MAPPHAR_FAIL("unable to read phar metadata in .phar file \"%s\"");
+ }
+ buffer += len;
/* set up our manifest */
zend_hash_init(&mydata->manifest, manifest_count,
@@ -1075,7 +1071,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char
entry.manifest_pos = manifest_index;
}
- if (buffer + entry.filename_len + 20 > endbuffer) {
+ if (entry.filename_len + 20 > endbuffer - buffer) {
MAPPHAR_FAIL("internal corruption of phar \"%s\" (truncated manifest entry)");
}
@@ -1111,19 +1107,21 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char
entry.flags |= PHAR_ENT_PERM_DEF_DIR;
}
+ PHAR_GET_32(buffer, len);
if (entry.is_persistent) {
- PHAR_GET_32(buffer, entry.metadata_len);
- if (!entry.metadata_len) buffer -= 4;
- if (phar_parse_metadata(&buffer, &entry.metadata, entry.metadata_len) == FAILURE) {
- pefree(entry.filename, entry.is_persistent);
- MAPPHAR_FAIL("unable to read file metadata in .phar file \"%s\"");
- }
+ entry.metadata_len = len;
} else {
- if (phar_parse_metadata(&buffer, &entry.metadata, 0) == FAILURE) {
- pefree(entry.filename, entry.is_persistent);
- MAPPHAR_FAIL("unable to read file metadata in .phar file \"%s\"");
- }
+ entry.metadata_len = 0;
+ }
+ if (len > endbuffer - buffer) {
+ pefree(entry.filename, entry.is_persistent);
+ MAPPHAR_FAIL("internal corruption of phar \"%s\" (truncated manifest entry)");
+ }
+ if (phar_parse_metadata(&buffer, &entry.metadata, len) == FAILURE) {
+ pefree(entry.filename, entry.is_persistent);
+ MAPPHAR_FAIL("unable to read file metadata in .phar file \"%s\"");
}
+ buffer += len;
entry.offset = entry.offset_abs = offset;
offset += entry.compressed_filesize;
diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h
index a2afd4d53b..ef752817aa 100644
--- a/ext/phar/phar_internal.h
+++ b/ext/phar/phar_internal.h
@@ -529,10 +529,13 @@ static inline void phar_set_inode(phar_entry_info *entry) /* {{{ */
{
char tmp[MAXPATHLEN];
int tmp_len;
+ size_t len;
- tmp_len = entry->filename_len + entry->phar->fname_len;
- memcpy(tmp, entry->phar->fname, entry->phar->fname_len);
- memcpy(tmp + entry->phar->fname_len, entry->filename, entry->filename_len);
+ tmp_len = MIN(MAXPATHLEN, entry->filename_len + entry->phar->fname_len);
+ len = MIN(entry->phar->fname_len, tmp_len);
+ memcpy(tmp, entry->phar->fname, len);
+ len = MIN(tmp_len - len, entry->filename_len);
+ memcpy(tmp + entry->phar->fname_len, entry->filename, len);
entry->inode = (unsigned short)zend_hash_func(tmp, tmp_len);
}
/* }}} */
@@ -565,7 +568,7 @@ int phar_mount_entry(phar_archive_data *phar, char *filename, int filename_len,
zend_string *phar_find_in_include_path(char *file, int file_len, phar_archive_data **pphar);
char *phar_fix_filepath(char *path, int *new_len, int use_cwd);
phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, char **error);
-int phar_parse_metadata(char **buffer, zval *metadata, int zip_metadata_len);
+int phar_parse_metadata(char **buffer, zval *metadata, php_uint32 zip_metadata_len);
void destroy_phar_manifest_entry(zval *zv);
int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_off_t position, int follow_links);
php_stream *phar_get_efp(phar_entry_info *entry, int follow_links);
diff --git a/ext/phar/tests/bug69324.phar b/ext/phar/tests/bug69324.phar
new file mode 100644
index 0000000000..0882d88c22
--- /dev/null
+++ b/ext/phar/tests/bug69324.phar
Binary files differ
diff --git a/ext/phar/tests/bug69324.phpt b/ext/phar/tests/bug69324.phpt
new file mode 100644
index 0000000000..70e3f972e7
--- /dev/null
+++ b/ext/phar/tests/bug69324.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug #69324: Buffer Over-read in unserialize when parsing Phar
+--SKIPIF--
+<?php
+if (!extension_loaded("phar")) die("skip");
+?>
+--FILE--
+<?php
+try {
+$p = new Phar(dirname(__FILE__).'/bug69324.phar', 0);
+$meta=$p->getMetadata();
+var_dump($meta);
+} catch(Exception $e) {
+ echo $e->getMessage();
+}
+--EXPECTF--
+internal corruption of phar "%s" (truncated manifest entry) \ No newline at end of file
diff --git a/ext/phar/tests/bug69441.phar b/ext/phar/tests/bug69441.phar
new file mode 100644
index 0000000000..80956dce7c
--- /dev/null
+++ b/ext/phar/tests/bug69441.phar
Binary files differ
diff --git a/ext/phar/tests/bug69441.phpt b/ext/phar/tests/bug69441.phpt
new file mode 100644
index 0000000000..fafb7855c6
--- /dev/null
+++ b/ext/phar/tests/bug69441.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Phar: bug #69441: Buffer Overflow when parsing tar/zip/phar in phar_set_inode
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--FILE--
+<?php
+$fname = dirname(__FILE__) . '/bug69441.phar';
+try {
+$r = new Phar($fname, 0);
+} catch(UnexpectedValueException $e) {
+ echo $e;
+}
+?>
+
+==DONE==
+--EXPECTF--
+exception 'UnexpectedValueException' with message 'phar error: corrupted central directory entry, no magic signature in zip-based phar "%s/bug69441.phar"' in %s/bug69441.php:%d
+Stack trace:
+#0 %s%ebug69441.php(%d): Phar->__construct('%s', 0)
+#1 {main}
+==DONE==
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 47cf107b19..bec69b2bbd 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -4315,6 +4315,7 @@ ZEND_METHOD(reflection_class, newInstanceWithoutConstructor)
if (ce->create_object != NULL && ce->ce_flags & ZEND_ACC_FINAL) {
zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s is an internal class marked as final that cannot be instantiated without invoking its constructor", ce->name->val);
+ return;
}
object_init_ex(return_value, ce);
diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c
index 1fe049c533..9531d1985e 100644
--- a/ext/skeleton/skeleton.c
+++ b/ext/skeleton/skeleton.c
@@ -37,7 +37,7 @@ PHP_FUNCTION(confirm_extname_compiled)
{
char *arg = NULL;
size_t arg_len, len;
- char *strg;
+ zend_string *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) {
return;
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 4d6a8ff2fb..883e0ac541 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -2808,6 +2808,7 @@ static void do_soap_call(zend_execute_data *execute_data,
ZVAL_COPY(return_value, fault);
} else {
add_soap_fault_ex(return_value, this_ptr, "Client", "Unknown Error", NULL, NULL);
+ Z_ADDREF_P(return_value);
}
} else {
zval* fault;
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 8071a71e55..0cc53cfeb7 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -64,18 +64,15 @@ PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator;
typedef struct _spl_array_object {
zval array;
- zval retval;
uint32_t ht_iter;
int ar_flags;
- int is_self;
+ unsigned char nApplyCount;
zend_function *fptr_offset_get;
zend_function *fptr_offset_set;
zend_function *fptr_offset_has;
zend_function *fptr_offset_del;
zend_function *fptr_count;
zend_class_entry* ce_get_iterator;
- HashTable *debug_info;
- unsigned char nApplyCount;
zend_object std;
} spl_array_object;
@@ -132,12 +129,6 @@ static void spl_array_object_free_storage(zend_object *object)
zend_object_std_dtor(&intern->std);
zval_ptr_dtor(&intern->array);
- zval_ptr_dtor(&intern->retval);
-
- if (intern->debug_info != NULL) {
- zend_hash_destroy(intern->debug_info);
- efree(intern->debug_info);
- }
}
/* }}} */
@@ -156,7 +147,6 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zval *
object_properties_init(&intern->std, class_type);
intern->ar_flags = 0;
- intern->debug_info = NULL;
intern->ce_get_iterator = spl_ce_ArrayIterator;
if (orig) {
spl_array_object *other = Z_SPLARRAY_P(orig);
@@ -368,26 +358,25 @@ num_index:
}
} /* }}} */
-static zval *spl_array_read_dimension_ex(int check_inherited, zval *object, zval *offset, int type, zval *zv) /* {{{ */
+static zval *spl_array_read_dimension_ex(int check_inherited, zval *object, zval *offset, int type, zval *rv) /* {{{ */
{
zval *ret;
if (check_inherited) {
spl_array_object *intern = Z_SPLARRAY_P(object);
if (intern->fptr_offset_get) {
- zval rv, tmp;
+ zval tmp;
if (!offset) {
ZVAL_UNDEF(&tmp);
offset = &tmp;
} else {
SEPARATE_ARG_IF_REF(offset);
}
- zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_get, "offsetGet", &rv, offset);
+ zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_get, "offsetGet", rv, offset);
zval_ptr_dtor(offset);
- if (!Z_ISUNDEF(rv)) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- return &intern->retval;
+
+ if (!Z_ISUNDEF_P(rv)) {
+ return rv;
}
return &EG(uninitialized_zval);
}
@@ -663,7 +652,13 @@ num_index:
}
}
- return check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL;
+ {
+ zend_bool result = check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL;
+ if (value == &rv) {
+ zval_ptr_dtor(&rv);
+ }
+ return result;
+ }
} /* }}} */
static int spl_array_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */
@@ -803,34 +798,31 @@ static HashTable* spl_array_get_debug_info(zval *obj, int *is_temp) /* {{{ */
zend_class_entry *base;
spl_array_object *intern = Z_SPLARRAY_P(obj);
- *is_temp = 0;
-
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
if (HASH_OF(&intern->array) == intern->std.properties) {
+ *is_temp = 0;
return intern->std.properties;
} else {
- if (intern->debug_info == NULL) {
- ALLOC_HASHTABLE(intern->debug_info);
- ZEND_INIT_SYMTABLE_EX(intern->debug_info, zend_hash_num_elements(intern->std.properties) + 1, 0);
- }
+ HashTable *debug_info;
+ *is_temp = 1;
- if (intern->debug_info->u.v.nApplyCount == 0) {
- zend_hash_clean(intern->debug_info);
- zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
+ ALLOC_HASHTABLE(debug_info);
+ ZEND_INIT_SYMTABLE_EX(debug_info, zend_hash_num_elements(intern->std.properties) + 1, 0);
+ zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
- storage = &intern->array;
- Z_TRY_ADDREF_P(storage);
+ storage = &intern->array;
+ Z_TRY_ADDREF_P(storage);
- base = (Z_OBJ_HT_P(obj) == &spl_handler_ArrayIterator) ? spl_ce_ArrayIterator : spl_ce_ArrayObject;
- zname = spl_gen_private_prop_name(base, "storage", sizeof("storage")-1);
- zend_symtable_update(intern->debug_info, zname, storage);
- zend_string_release(zname);
- }
+ base = Z_OBJ_HT_P(obj) == &spl_handler_ArrayIterator
+ ? spl_ce_ArrayIterator : spl_ce_ArrayObject;
+ zname = spl_gen_private_prop_name(base, "storage", sizeof("storage")-1);
+ zend_symtable_update(debug_info, zname, storage);
+ zend_string_release(zname);
- return intern->debug_info;
+ return debug_info;
}
}
/* }}} */
@@ -1253,11 +1245,11 @@ SPL_METHOD(Array, exchangeArray)
zval *object = getThis(), *array;
spl_array_object *intern = Z_SPLARRAY_P(object);
- RETVAL_ARR(zend_array_dup(spl_array_get_hash_table(intern, 0)));
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &array) == FAILURE) {
return;
}
+ RETVAL_ARR(zend_array_dup(spl_array_get_hash_table(intern, 0)));
spl_array_set_array(object, intern, array, 0L, 1);
}
/* }}} */
@@ -1371,10 +1363,8 @@ int spl_array_object_count_elements(zval *object, zend_long *count) /* {{{ */
zval rv;
zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv);
if (Z_TYPE(rv) != IS_UNDEF) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- convert_to_long(&intern->retval);
- *count = (zend_long)Z_LVAL(intern->retval);
+ *count = zval_get_long(&rv);
+ zval_ptr_dtor(&rv);
return SUCCESS;
}
*count = 0;
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index 68c46486e1..6dc2e23b3d 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -93,7 +93,8 @@ struct _spl_dllist_object {
zend_function *fptr_offset_del;
zend_function *fptr_count;
zend_class_entry *ce_get_iterator;
- HashTable *debug_info;
+ zval *gc_data;
+ int gc_data_count;
zend_object std;
};
@@ -355,13 +356,12 @@ static void spl_dllist_object_free_storage(zend_object *object) /* {{{ */
zval_ptr_dtor(&tmp);
}
+ if (intern->gc_data != NULL) {
+ efree(intern->gc_data);
+ };
+
spl_ptr_llist_destroy(intern->llist);
SPL_LLIST_CHECK_DELREF(intern->traverse_pointer);
-
- if (intern->debug_info != NULL) {
- zend_hash_destroy(intern->debug_info);
- efree(intern->debug_info);
- }
}
/* }}} */
@@ -380,7 +380,6 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zval
intern->flags = 0;
intern->traverse_position = 0;
- intern->debug_info = NULL;
if (orig) {
spl_dllist_object *other = Z_SPLDLLIST_P(orig);
@@ -500,48 +499,65 @@ static HashTable* spl_dllist_object_get_debug_info(zval *obj, int *is_temp) /* {
zval tmp, dllist_array;
zend_string *pnstr;
int i = 0;
+ HashTable *debug_info;
+ *is_temp = 1;
- *is_temp = 0;
-
- if (intern->debug_info == NULL) {
- ALLOC_HASHTABLE(intern->debug_info);
- zend_hash_init(intern->debug_info, 1, NULL, ZVAL_PTR_DTOR, 0);
+ if (!intern->std.properties) {
+ rebuild_object_properties(&intern->std);
}
- if (intern->debug_info->u.v.nApplyCount == 0) {
+ ALLOC_HASHTABLE(debug_info);
+ zend_hash_init(debug_info, 1, NULL, ZVAL_PTR_DTOR, 0);
+ zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
+
+ pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "flags", sizeof("flags")-1);
+ ZVAL_LONG(&tmp, intern->flags);
+ zend_hash_add(debug_info, pnstr, &tmp);
+ zend_string_release(pnstr);
- if (!intern->std.properties) {
- rebuild_object_properties(&intern->std);
+ array_init(&dllist_array);
+
+ while (current) {
+ next = current->next;
+
+ add_index_zval(&dllist_array, i, &current->data);
+ if (Z_REFCOUNTED(current->data)) {
+ Z_ADDREF(current->data);
}
- zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
+ i++;
- pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "flags", sizeof("flags")-1);
- ZVAL_LONG(&tmp, intern->flags);
- zend_hash_add(intern->debug_info, pnstr, &tmp);
- zend_string_release(pnstr);
+ current = next;
+ }
- array_init(&dllist_array);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "dllist", sizeof("dllist")-1);
+ zend_hash_add(debug_info, pnstr, &dllist_array);
+ zend_string_release(pnstr);
- while (current) {
- next = current->next;
+ return debug_info;
+}
+/* }}}} */
- add_index_zval(&dllist_array, i, &current->data);
- if (Z_REFCOUNTED(current->data)) {
- Z_ADDREF(current->data);
- }
- i++;
+static HashTable *spl_dllist_object_get_gc(zval *obj, zval **gc_data, int *gc_data_count) /* {{{ */
+{
+ spl_dllist_object *intern = Z_SPLDLLIST_P(obj);
+ spl_ptr_llist_element *current = intern->llist->head;
+ int i = 0;
- current = next;
- }
+ if (intern->gc_data_count < intern->llist->count) {
+ intern->gc_data_count = intern->llist->count;
+ intern->gc_data = safe_erealloc(intern->gc_data, intern->gc_data_count, sizeof(zval), 0);
+ }
- pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "dllist", sizeof("dllist")-1);
- zend_hash_add(intern->debug_info, pnstr, &dllist_array);
- zend_string_release(pnstr);
+ while (current) {
+ ZVAL_COPY_VALUE(&intern->gc_data[i++], &current->data);
+ current = current->next;
}
- return intern->debug_info;
+ *gc_data = intern->gc_data;
+ *gc_data_count = i;
+ return zend_std_get_properties(obj);
}
-/* }}}} */
+/* }}} */
/* {{{ proto bool SplDoublyLinkedList::push(mixed $value)
Push $value on the SplDoublyLinkedList */
@@ -1378,6 +1394,7 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */
spl_handler_SplDoublyLinkedList.clone_obj = spl_dllist_object_clone;
spl_handler_SplDoublyLinkedList.count_elements = spl_dllist_object_count_elements;
spl_handler_SplDoublyLinkedList.get_debug_info = spl_dllist_object_get_debug_info;
+ spl_handler_SplDoublyLinkedList.get_gc = spl_dllist_object_get_gc;
spl_handler_SplDoublyLinkedList.dtor_obj = zend_objects_destroy_object;
spl_handler_SplDoublyLinkedList.free_obj = spl_dllist_object_free_storage;
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index 48e9d2f85f..faac492b2a 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -50,7 +50,6 @@ typedef struct _spl_fixedarray { /* {{{ */
typedef struct _spl_fixedarray_object { /* {{{ */
spl_fixedarray *array;
- zval retval;
zend_function *fptr_offset_get;
zend_function *fptr_offset_set;
zend_function *fptr_offset_has;
@@ -208,7 +207,6 @@ static void spl_fixedarray_object_free_storage(zend_object *object) /* {{{ */
}
zend_object_std_dtor(&intern->std);
- zval_ptr_dtor(&intern->retval);
}
/* }}} */
@@ -361,19 +359,17 @@ static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, in
intern = Z_SPLFIXEDARRAY_P(object);
if (intern->fptr_offset_get) {
- zval tmp, rv;
+ zval tmp;
if (!offset) {
ZVAL_UNDEF(&tmp);
offset = &tmp;
} else {
SEPARATE_ARG_IF_REF(offset);
}
- zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_get, "offsetGet", &rv, offset);
+ zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_get, "offsetGet", rv, offset);
zval_ptr_dtor(offset);
- if (!Z_ISUNDEF(rv)) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- return &intern->retval;
+ if (!Z_ISUNDEF_P(rv)) {
+ return rv;
}
return &EG(uninitialized_zval);
}
@@ -517,9 +513,9 @@ static int spl_fixedarray_object_has_dimension(zval *object, zval *offset, int c
zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetExists", &rv, offset);
zval_ptr_dtor(offset);
if (!Z_ISUNDEF(rv)) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- return zend_is_true(&intern->retval);
+ zend_bool result = zend_is_true(&rv);
+ zval_ptr_dtor(&rv);
+ return result;
}
return 0;
}
@@ -537,10 +533,8 @@ static int spl_fixedarray_object_count_elements(zval *object, zend_long *count)
zval rv;
zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv);
if (!Z_ISUNDEF(rv)) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- convert_to_long(&intern->retval);
- *count = (zend_long) Z_LVAL(intern->retval);
+ *count = zval_get_long(&rv);
+ zval_ptr_dtor(&rv);
return SUCCESS;
}
} else if (intern->array) {
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index 8e9f3ad66f..a92707bd93 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -69,12 +69,10 @@ typedef struct _spl_heap_it spl_heap_it;
struct _spl_heap_object {
spl_ptr_heap *heap;
- zval retval;
int flags;
zend_class_entry *ce_get_iterator;
zend_function *fptr_cmp;
zend_function *fptr_count;
- HashTable *debug_info;
zend_object std;
};
@@ -250,8 +248,6 @@ static void spl_ptr_heap_insert(spl_ptr_heap *heap, zval *elem, void *cmp_userda
heap->max_size *= 2;
}
- heap->ctor(elem);
-
/* sifting up */
for (i = heap->count++; i > 0 && heap->cmp(&heap->elements[(i-1)/2], elem, cmp_userdata) < 0; i = (i-1)/2) {
heap->elements[i] = heap->elements[(i-1)/2];
@@ -309,7 +305,6 @@ static void spl_ptr_heap_delete_top(spl_ptr_heap *heap, zval *elem, void *cmp_us
}
ZVAL_COPY_VALUE(&heap->elements[i], bottom);
- heap->dtor(elem);
}
/* }}} */
@@ -352,31 +347,16 @@ static int spl_ptr_heap_count(spl_ptr_heap *heap) { /* {{{ */
return heap->count;
}
/* }}} */
-/* }}} */
zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object, int by_ref);
static void spl_heap_object_free_storage(zend_object *object) /* {{{ */
{
- int i;
spl_heap_object *intern = spl_heap_from_obj(object);
zend_object_std_dtor(&intern->std);
- for (i = 0; i < intern->heap->count; ++i) {
- if (!Z_ISUNDEF(intern->heap->elements[i])) {
- zval_ptr_dtor(&intern->heap->elements[i]);
- }
- }
-
spl_ptr_heap_destroy(intern->heap);
-
- zval_ptr_dtor(&intern->retval);
-
- if (intern->debug_info != NULL) {
- zend_hash_destroy(intern->debug_info);
- efree(intern->debug_info);
- }
}
/* }}} */
@@ -393,7 +373,6 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zval *o
intern->flags = 0;
intern->fptr_cmp = NULL;
- intern->debug_info = NULL;
if (orig) {
spl_heap_object *other = Z_SPLHEAP_P(orig);
@@ -491,10 +470,8 @@ static int spl_heap_object_count_elements(zval *object, zend_long *count) /* {{{
zval rv;
zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv);
if (!Z_ISUNDEF(rv)) {
- zval_ptr_dtor(&intern->retval);
- ZVAL_ZVAL(&intern->retval, &rv, 0, 0);
- convert_to_long(&intern->retval);
- *count = (zend_long) Z_LVAL(intern->retval);
+ *count = zval_get_long(&rv);
+ zval_ptr_dtor(&rv);
return SUCCESS;
}
*count = 0;
@@ -508,51 +485,56 @@ static int spl_heap_object_count_elements(zval *object, zend_long *count) /* {{{
/* }}} */
static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zval *obj, int *is_temp) { /* {{{ */
- spl_heap_object *intern = Z_SPLHEAP_P(obj);
+ spl_heap_object *intern = Z_SPLHEAP_P(obj);
zval tmp, heap_array;
zend_string *pnstr;
+ HashTable *debug_info;
int i;
- *is_temp = 0;
+ *is_temp = 1;
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
- if (intern->debug_info == NULL) {
- ALLOC_HASHTABLE(intern->debug_info);
- ZEND_INIT_SYMTABLE_EX(intern->debug_info, zend_hash_num_elements(intern->std.properties) + 1, 0);
- }
+ ALLOC_HASHTABLE(debug_info);
+ ZEND_INIT_SYMTABLE_EX(debug_info, zend_hash_num_elements(intern->std.properties) + 1, 0);
+ zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
- if (intern->debug_info->u.v.nApplyCount == 0) {
+ pnstr = spl_gen_private_prop_name(ce, "flags", sizeof("flags")-1);
+ ZVAL_LONG(&tmp, intern->flags);
+ zend_hash_update(debug_info, pnstr, &tmp);
+ zend_string_release(pnstr);
- zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
+ pnstr = spl_gen_private_prop_name(ce, "isCorrupted", sizeof("isCorrupted")-1);
+ ZVAL_BOOL(&tmp, intern->heap->flags&SPL_HEAP_CORRUPTED);
+ zend_hash_update(debug_info, pnstr, &tmp);
+ zend_string_release(pnstr);
- pnstr = spl_gen_private_prop_name(ce, "flags", sizeof("flags")-1);
- ZVAL_LONG(&tmp, intern->flags);
- zend_hash_update(intern->debug_info, pnstr, &tmp);
- zend_string_release(pnstr);
+ array_init(&heap_array);
- pnstr = spl_gen_private_prop_name(ce, "isCorrupted", sizeof("isCorrupted")-1);
- ZVAL_BOOL(&tmp, intern->heap->flags&SPL_HEAP_CORRUPTED);
- zend_hash_update(intern->debug_info, pnstr, &tmp);
- zend_string_release(pnstr);
+ for (i = 0; i < intern->heap->count; ++i) {
+ add_index_zval(&heap_array, i, &intern->heap->elements[i]);
+ if (Z_REFCOUNTED(intern->heap->elements[i])) {
+ Z_ADDREF(intern->heap->elements[i]);
+ }
+ }
- array_init(&heap_array);
+ pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1);
+ zend_hash_update(debug_info, pnstr, &heap_array);
+ zend_string_release(pnstr);
- for (i = 0; i < intern->heap->count; ++i) {
- add_index_zval(&heap_array, i, &intern->heap->elements[i]);
- if (Z_REFCOUNTED(intern->heap->elements[i])) {
- Z_ADDREF(intern->heap->elements[i]);
- }
- }
+ return debug_info;
+}
+/* }}} */
- pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1);
- zend_hash_update(intern->debug_info, pnstr, &heap_array);
- zend_string_release(pnstr);
- }
+static HashTable *spl_heap_object_get_gc(zval *obj, zval **gc_data, int *gc_data_count) /* {{{ */
+{
+ spl_heap_object *intern = Z_SPLHEAP_P(obj);
+ *gc_data = intern->heap->elements;
+ *gc_data_count = intern->heap->count;
- return intern->debug_info;
+ return std_object_handlers.get_properties(obj);
}
/* }}} */
@@ -627,7 +609,6 @@ SPL_METHOD(SplHeap, insert)
extract the element out of the top of the heap */
SPL_METHOD(SplHeap, extract)
{
- zval value;
spl_heap_object *intern;
if (zend_parse_parameters_none() == FAILURE) {
@@ -641,14 +622,12 @@ SPL_METHOD(SplHeap, extract)
return;
}
- spl_ptr_heap_delete_top(intern->heap, &value, getThis());
+ spl_ptr_heap_delete_top(intern->heap, return_value, getThis());
- if (Z_ISUNDEF(value)) {
+ if (Z_ISUNDEF_P(return_value)) {
zend_throw_exception(spl_ce_RuntimeException, "Can't extract from an empty heap", 0);
return;
}
-
- RETURN_ZVAL(&value, 1, 1);
}
/* }}} */
@@ -1233,6 +1212,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
spl_handler_SplHeap.clone_obj = spl_heap_object_clone;
spl_handler_SplHeap.count_elements = spl_heap_object_count_elements;
spl_handler_SplHeap.get_debug_info = spl_heap_object_get_debug_info;
+ spl_handler_SplHeap.get_gc = spl_heap_object_get_gc;
spl_handler_SplHeap.dtor_obj = zend_objects_destroy_object;
spl_handler_SplHeap.free_obj = spl_heap_object_free_storage;
@@ -1254,6 +1234,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
spl_handler_SplPriorityQueue.clone_obj = spl_heap_object_clone;
spl_handler_SplPriorityQueue.count_elements = spl_heap_object_count_elements;
spl_handler_SplPriorityQueue.get_debug_info = spl_pqueue_object_get_debug_info;
+ spl_handler_SplPriorityQueue.get_gc = spl_heap_object_get_gc;
spl_handler_SplPriorityQueue.dtor_obj = zend_objects_destroy_object;
spl_handler_SplPriorityQueue.free_obj = spl_heap_object_free_storage;
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index e2267cfdcd..37f97866c7 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -474,24 +474,23 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
zval *iterator;
zend_class_entry *ce_iterator;
zend_long mode, flags;
- int inc_refcount = 1;
zend_error_handling error_handling;
- zval caching_it;
+ zval caching_it, aggregate_retval;
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling);
switch (rit_type) {
case RIT_RecursiveTreeIterator: {
-
zval caching_it_flags, *user_caching_it_flags = NULL;
mode = RIT_SELF_FIRST;
flags = RTIT_BYPASS_KEY;
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "o|lzl", &iterator, &flags, &user_caching_it_flags, &mode) == SUCCESS) {
if (instanceof_function(Z_OBJCE_P(iterator), zend_ce_aggregate)) {
- zval *aggregate = iterator;
- zend_call_method_with_0_params(aggregate, Z_OBJCE_P(aggregate), &Z_OBJCE_P(aggregate)->iterator_funcs.zf_new_iterator, "getiterator", iterator);
-//??? inc_refcount = 0;
+ zend_call_method_with_0_params(iterator, Z_OBJCE_P(iterator), &Z_OBJCE_P(iterator)->iterator_funcs.zf_new_iterator, "getiterator", &aggregate_retval);
+ iterator = &aggregate_retval;
+ } else {
+ Z_ADDREF_P(iterator);
}
if (user_caching_it_flags) {
@@ -501,11 +500,9 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
}
spl_instantiate_arg_ex2(spl_ce_RecursiveCachingIterator, &caching_it, iterator, &caching_it_flags);
zval_ptr_dtor(&caching_it_flags);
- if (inc_refcount == 0 && iterator) {
- zval_ptr_dtor(iterator);
- }
+
+ zval_ptr_dtor(iterator);
iterator = &caching_it;
-//??? inc_refcount = 0;
} else {
iterator = NULL;
}
@@ -518,9 +515,10 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "o|ll", &iterator, &mode, &flags) == SUCCESS) {
if (instanceof_function(Z_OBJCE_P(iterator), zend_ce_aggregate)) {
- zval *aggregate = iterator;
- zend_call_method_with_0_params(aggregate, Z_OBJCE_P(aggregate), &Z_OBJCE_P(aggregate)->iterator_funcs.zf_new_iterator, "getiterator", iterator);
-//??? inc_refcount = 0;
+ zend_call_method_with_0_params(iterator, Z_OBJCE_P(iterator), &Z_OBJCE_P(iterator)->iterator_funcs.zf_new_iterator, "getiterator", &aggregate_retval);
+ iterator = &aggregate_retval;
+ } else {
+ Z_ADDREF_P(iterator);
}
} else {
iterator = NULL;
@@ -529,7 +527,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
}
}
if (!iterator || !instanceof_function(Z_OBJCE_P(iterator), spl_ce_RecursiveIterator)) {
- if (iterator && !inc_refcount) {
+ if (iterator) {
zval_ptr_dtor(iterator);
}
zend_throw_exception(spl_ce_InvalidArgumentException, "An instance of RecursiveIterator or IteratorAggregate creating it is required", 0);
@@ -577,11 +575,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
ce_iterator = Z_OBJCE_P(iterator); /* respect inheritance, don't use spl_ce_RecursiveIterator */
intern->iterators[0].iterator = ce_iterator->get_iterator(ce_iterator, iterator, 0);
-//??? if (inc_refcount) {
- ZVAL_COPY(&intern->iterators[0].zobject, iterator);
-//??? } else {
-//??? ZVAL_COPY_VALUE(&intern->iterators[0].zobject, iterator);
-//??? }
+ ZVAL_COPY_VALUE(&intern->iterators[0].zobject, iterator);
intern->iterators[0].ce = ce_iterator;
intern->iterators[0].state = RS_START;
@@ -2255,6 +2249,7 @@ SPL_METHOD(RecursiveRegexIterator, getChildren)
spl_instantiate_arg_n(Z_OBJCE_P(getThis()), return_value, 5, args);
+ zval_ptr_dtor(&args[0]);
zval_ptr_dtor(&args[1]);
}
zval_ptr_dtor(&retval);
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 76933a8228..b508565c83 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -85,7 +85,6 @@ typedef struct _spl_SplObjectStorage { /* {{{ */
HashPosition pos;
zend_long flags;
zend_function *fptr_get_hash;
- HashTable *debug_info;
zval *gcdata;
size_t gcdata_num;
zend_object std;
@@ -112,11 +111,6 @@ void spl_SplObjectStorage_free_storage(zend_object *object) /* {{{ */
zend_hash_destroy(&intern->storage);
- if (intern->debug_info != NULL) {
- zend_hash_destroy(intern->debug_info);
- efree(intern->debug_info);
- }
-
if (intern->gcdata != NULL) {
efree(intern->gcdata);
}
@@ -320,39 +314,35 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp) /* {{{
zval tmp, storage;
zend_string *md5str;
zend_string *zname;
+ HashTable *debug_info;
- *is_temp = 0;
+ *is_temp = 1;
props = Z_OBJPROP_P(obj);
- if (intern->debug_info == NULL) {
- ALLOC_HASHTABLE(intern->debug_info);
- ZEND_INIT_SYMTABLE_EX(intern->debug_info, zend_hash_num_elements(props) + 1, 0);
- }
-
- if (intern->debug_info->u.v.nApplyCount == 0) {
- zend_hash_copy(intern->debug_info, props, (copy_ctor_func_t)zval_add_ref);
+ ALLOC_HASHTABLE(debug_info);
+ ZEND_INIT_SYMTABLE_EX(debug_info, zend_hash_num_elements(props) + 1, 0);
+ zend_hash_copy(debug_info, props, (copy_ctor_func_t)zval_add_ref);
- array_init(&storage);
+ array_init(&storage);
- ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
- md5str = php_spl_object_hash(&element->obj);
- array_init(&tmp);
- /* Incrementing the refcount of obj and inf would confuse the garbage collector.
- * Prefer to null the destructor */
- Z_ARRVAL_P(&tmp)->pDestructor = NULL;
- add_assoc_zval_ex(&tmp, "obj", sizeof("obj") - 1, &element->obj);
- add_assoc_zval_ex(&tmp, "inf", sizeof("inf") - 1, &element->inf);
- zend_hash_update(Z_ARRVAL(storage), md5str, &tmp);
- zend_string_release(md5str);
- } ZEND_HASH_FOREACH_END();
+ ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
+ md5str = php_spl_object_hash(&element->obj);
+ array_init(&tmp);
+ /* Incrementing the refcount of obj and inf would confuse the garbage collector.
+ * Prefer to null the destructor */
+ Z_ARRVAL_P(&tmp)->pDestructor = NULL;
+ add_assoc_zval_ex(&tmp, "obj", sizeof("obj") - 1, &element->obj);
+ add_assoc_zval_ex(&tmp, "inf", sizeof("inf") - 1, &element->inf);
+ zend_hash_update(Z_ARRVAL(storage), md5str, &tmp);
+ zend_string_release(md5str);
+ } ZEND_HASH_FOREACH_END();
- zname = spl_gen_private_prop_name(spl_ce_SplObjectStorage, "storage", sizeof("storage")-1);
- zend_symtable_update(intern->debug_info, zname, &storage);
- zend_string_release(zname);
- }
+ zname = spl_gen_private_prop_name(spl_ce_SplObjectStorage, "storage", sizeof("storage")-1);
+ zend_symtable_update(debug_info, zname, &storage);
+ zend_string_release(zname);
- return intern->debug_info;
+ return debug_info;
}
/* }}} */
diff --git a/ext/spl/tests/arrayObject_exchangeArray_basic3.phpt b/ext/spl/tests/arrayObject_exchangeArray_basic3.phpt
index 4045b7a946..ed2b8e89e1 100644
--- a/ext/spl/tests/arrayObject_exchangeArray_basic3.phpt
+++ b/ext/spl/tests/arrayObject_exchangeArray_basic3.phpt
@@ -98,9 +98,7 @@ object(C)#3 (2) {
["addedToOriginal"]=>
string(17) "added To Original"
}
-array(2) {
- ["pub1"]=>
- string(7) "public1"
+array(1) {
["addedToCopy"]=>
string(13) "added To Copy"
}
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 457e806440..0343e403e7 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -124,7 +124,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
size_t scratch_len = 0;
int body = 0;
char location[HTTP_HEADER_BLOCK_SIZE];
- zval *response_header = NULL;
+ zval response_header;
int reqok = 0;
char *http_header_line = NULL;
char tmp_line[128];
@@ -146,6 +146,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
int response_code;
zend_array *symbol_table;
+ ZVAL_UNDEF(&response_header);
tmp_line[0] = '\0';
if (redirect_max < 1) {
@@ -669,7 +670,15 @@ finish:
zend_set_local_var_str("http_response_header", sizeof("http_response_header")-1, &ztmp, 0);
}
- response_header = zend_hash_str_find_ind(symbol_table, "http_response_header", sizeof("http_response_header")-1);
+ {
+ zval *response_header_ptr = zend_hash_str_find_ind(symbol_table, "http_response_header", sizeof("http_response_header")-1);
+ if (!response_header_ptr || Z_TYPE_P(response_header_ptr) != IS_ARRAY) {
+ ZVAL_UNDEF(&response_header);
+ goto out;
+ } else {
+ ZVAL_COPY(&response_header, response_header_ptr);
+ }
+ }
if (!php_stream_eof(stream)) {
size_t tmp_line_len;
@@ -717,7 +726,7 @@ finish:
}
}
ZVAL_STRINGL(&http_response, tmp_line, tmp_line_len);
- zend_hash_next_index_insert(Z_ARRVAL_P(response_header), &http_response);
+ zend_hash_next_index_insert(Z_ARRVAL(response_header), &http_response);
}
} else {
php_stream_wrapper_log_error(wrapper, options, "HTTP request failed, unexpected end of socket!");
@@ -790,7 +799,7 @@ finish:
ZVAL_STRINGL(&http_header, http_header_line, http_header_line_length);
- zend_hash_next_index_insert(Z_ARRVAL_P(response_header), &http_header);
+ zend_hash_next_index_insert(Z_ARRVAL(response_header), &http_header);
}
} else {
break;
@@ -904,7 +913,7 @@ out:
if (stream) {
if (header_init) {
- ZVAL_COPY(&stream->wrapperdata, response_header);
+ ZVAL_COPY(&stream->wrapperdata, &response_header);
}
php_stream_notify_progress_init(context, 0, file_size);
@@ -925,10 +934,14 @@ out:
if (transfer_encoding) {
php_stream_filter_append(&stream->readfilters, transfer_encoding);
}
- } else if (transfer_encoding) {
- php_stream_filter_free(transfer_encoding);
+ } else {
+ if (transfer_encoding) {
+ php_stream_filter_free(transfer_encoding);
+ }
}
+ zval_ptr_dtor(&response_header);
+
return stream;
}
/* }}} */
diff --git a/ext/standard/link.c b/ext/standard/link.c
index b7fe1ae495..7001dd8807 100644
--- a/ext/standard/link.c
+++ b/ext/standard/link.c
@@ -59,7 +59,7 @@ PHP_FUNCTION(readlink)
char buff[MAXPATHLEN];
int ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &link, &link_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &link, &link_len) == FAILURE) {
return;
}
diff --git a/ext/standard/math.c b/ext/standard/math.c
index cff798c9fb..a3685c00b9 100644
--- a/ext/standard/math.c
+++ b/ext/standard/math.c
@@ -1458,7 +1458,8 @@ PHP_FUNCTION(intdiv)
} else if (divisor == -1 && numerator == ZEND_LONG_MIN) {
/* Prevent overflow error/crash
We don't return a float here as that violates function contract */
- RETURN_LONG(0);
+ zend_throw_exception_ex(NULL, 0, "Division of PHP_INT_MIN by -1 is not an integer");
+ return;
}
RETURN_LONG(numerator/divisor);
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c
index a86aae25f0..fa9758b06c 100644
--- a/ext/standard/streamsfuncs.c
+++ b/ext/standard/streamsfuncs.c
@@ -1493,7 +1493,7 @@ PHP_FUNCTION(stream_resolve_include_path)
size_t filename_len;
zend_string *resolved_path;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &filename, &filename_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &filename, &filename_len) == FAILURE) {
return;
}
diff --git a/ext/standard/tests/file/readlink_variation1.phpt b/ext/standard/tests/file/readlink_variation1.phpt
index 1dae17cbd4..d4f1a5ff02 100644
--- a/ext/standard/tests/file/readlink_variation1.phpt
+++ b/ext/standard/tests/file/readlink_variation1.phpt
@@ -65,7 +65,7 @@ bool(false)
Warning: readlink(): %s in %s on line %d
bool(false)
-Warning: readlink() expects parameter 1 to be string, resource given in %s on line %d
+Warning: readlink() expects parameter 1 to be a valid path, resource given in %s on line %d
NULL
Warning: readlink(): %s in %s on line %d
diff --git a/ext/standard/tests/http/bug69337.phpt b/ext/standard/tests/http/bug69337.phpt
new file mode 100644
index 0000000000..1451d4bf01
--- /dev/null
+++ b/ext/standard/tests/http/bug69337.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Bug #69337 (Stream context leaks when http request fails)
+--SKIPIF--
+<?php require 'server.inc'; http_server_skipif('tcp://127.0.0.1:22345'); ?>
+--INI--
+allow_url_fopen=1
+allow_url_include=1
+--FILE--
+<?php
+require 'server.inc';
+
+function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max)
+{
+ if($notification_code == STREAM_NOTIFY_REDIRECTED) {
+ // $http_response_header is now a string, but will be used as an array
+ // by php_stream_url_wrap_http_ex() later on
+ $GLOBALS['http_response_header'] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\0\0\0\0";
+ }
+}
+
+$ctx = stream_context_create();
+stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));
+
+$responses = array(
+ "data://text/plain,HTTP/1.0 302 Found\r\nLocation: http://127.0.0.1:22345/try-again\r\n\r\n",
+ "data://text/plain,HTTP/1.0 404 Not Found\r\n\r\n",
+);
+
+$pid = http_server("tcp://127.0.0.1:22345", $responses, $output);
+
+$f = file_get_contents('http://127.0.0.1:22345/', 0, $ctx);
+
+http_server_kill($pid);
+var_dump($f);
+?>
+==DONE==
+--EXPECTF--
+string(26) "HTTP/1.0 404 Not Found
+
+"
+==DONE== \ No newline at end of file
diff --git a/ext/standard/tests/math/intdiv.phpt b/ext/standard/tests/math/intdiv.phpt
index cff8469445..9362be638f 100644
--- a/ext/standard/tests/math/intdiv.phpt
+++ b/ext/standard/tests/math/intdiv.phpt
@@ -7,22 +7,25 @@ var_dump(intdiv(-3, 2));
var_dump(intdiv(3, -2));
var_dump(intdiv(-3, -2));
var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX));
-var_dump(intdiv(-PHP_INT_MAX - 1, -PHP_INT_MAX - 1));
-var_dump(intdiv(-PHP_INT_MAX - 1, -1));
+var_dump(intdiv(PHP_INT_MIN, PHP_INT_MIN));
+try {
+ var_dump(intdiv(PHP_INT_MIN, -1));
+} catch (Exception $e) {
+ echo "Exception: " . $e->getMessage() . "\n";
+}
try {
var_dump(intdiv(1, 0));
} catch (Exception $e) {
- echo "\nException: " . $e->getMessage() . "\n";
+ echo "Exception: " . $e->getMessage() . "\n";
}
?>
---EXPECTF--
+--EXPECT--
int(1)
int(-1)
int(-1)
int(1)
int(1)
int(1)
-int(0)
-
+Exception: Division of PHP_INT_MIN by -1 is not an integer
Exception: Division by zero
diff --git a/ext/standard/tests/serialize/bug69152.phpt b/ext/standard/tests/serialize/bug69152.phpt
new file mode 100644
index 0000000000..eb3f34e21e
--- /dev/null
+++ b/ext/standard/tests/serialize/bug69152.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #69152: Type Confusion Infoleak Vulnerability in unserialize()
+--FILE--
+<?php
+$x = unserialize('O:9:"exception":1:{s:20:"'."\0".'BaseException'."\0".'trace";s:4:"ryat";}');
+echo $x;
+$x = unserialize('O:4:"test":1:{s:27:"__PHP_Incomplete_Class_Name";R:1;}');
+$x->test();
+
+?>
+--EXPECTF--
+exception 'Exception' in %s:%d
+Stack trace:
+#0 {main}
+
+Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "unknown" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line %d
diff --git a/ext/standard/tests/serialize/unserialize_mem_leak.phpt b/ext/standard/tests/serialize/unserialize_mem_leak.phpt
index d27ca2b422..97c59f9ad1 100644
--- a/ext/standard/tests/serialize/unserialize_mem_leak.phpt
+++ b/ext/standard/tests/serialize/unserialize_mem_leak.phpt
@@ -1,7 +1,5 @@
--TEST--
Memleaks if unserialize return a self-referenced array/object
---XFAIL--
-To fix this, we need change zval_ptr_dtor_nogc to zval_ptr_dtor in free_args, but it will introduce slowdown. mark this XFAIL now. we may find better fix later.
--INI--
report_memleaks=1
--FILE--
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 64926d174b..fc6be9234a 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -62,7 +62,7 @@ static void php_array_element_dump(zval *zv, zend_ulong index, zend_string *key,
php_printf("%*c[\"", level + 1, ' ');
PHPWRITE(key->val, key->len);
php_printf("\"]=>\n");
- }
+ }
php_var_dump(zv, level + 2);
}
/* }}} */
@@ -156,13 +156,13 @@ again:
PUTS("}\n");
break;
case IS_OBJECT:
- myht = Z_OBJDEBUG_P(struc, is_temp);
- if (myht && ++myht->u.v.nApplyCount > 1) {
+ if (Z_OBJ_APPLY_COUNT_P(struc) > 0) {
PUTS("*RECURSION*\n");
- --myht->u.v.nApplyCount;
return;
}
+ Z_OBJ_INC_APPLY_COUNT_P(struc);
+ myht = Z_OBJDEBUG_P(struc, is_temp);
class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc));
php_printf("%sobject(%s)#%d (%d) {\n", COMMON, class_name->val, Z_OBJ_HANDLE_P(struc), myht ? zend_obj_num_elements(myht) : 0);
zend_string_release(class_name);
@@ -175,7 +175,6 @@ again:
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) {
php_object_property_dump(val, num, key, level);
} ZEND_HASH_FOREACH_END();
- --myht->u.v.nApplyCount;
if (is_temp) {
zend_hash_destroy(myht);
efree(myht);
@@ -185,6 +184,7 @@ again:
php_printf("%*c", level-1, ' ');
}
PUTS("}\n");
+ Z_OBJ_DEC_APPLY_COUNT_P(struc);
break;
case IS_RESOURCE: {
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c
index 24a234d62c..6769202a3b 100644
--- a/ext/tokenizer/tokenizer_data.c
+++ b/ext/tokenizer/tokenizer_data.c
@@ -40,6 +40,7 @@ void tokenizer_register_constants(INIT_FUNC_ARGS) {
REGISTER_LONG_CONSTANT("T_PRINT", T_PRINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_YIELD", T_YIELD, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_ARROW", T_DOUBLE_ARROW, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("T_YIELD_FROM", T_YIELD_FROM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_POW_EQUAL", T_POW_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SR_EQUAL", T_SR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SL_EQUAL", T_SL_EQUAL, CONST_CS | CONST_PERSISTENT);
@@ -179,6 +180,7 @@ char *get_token_type_name(int token_type)
case T_PRINT: return "T_PRINT";
case T_YIELD: return "T_YIELD";
case T_DOUBLE_ARROW: return "T_DOUBLE_ARROW";
+ case T_YIELD_FROM: return "T_YIELD_FROM";
case T_POW_EQUAL: return "T_POW_EQUAL";
case T_SR_EQUAL: return "T_SR_EQUAL";
case T_SL_EQUAL: return "T_SL_EQUAL";
diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c
index 3cab7a1458..a7da0e7902 100644
--- a/ext/xmlwriter/php_xmlwriter.c
+++ b/ext/xmlwriter/php_xmlwriter.c
@@ -1672,7 +1672,7 @@ static PHP_FUNCTION(xmlwriter_write_dtd_entity)
/* }}} */
#endif
-/* {{{ proto resource xmlwriter_open_uri(resource xmlwriter, string source)
+/* {{{ proto resource xmlwriter_open_uri(string source)
Create new xmlwriter using source uri for output */
static PHP_FUNCTION(xmlwriter_open_uri)
{
@@ -1685,7 +1685,7 @@ static PHP_FUNCTION(xmlwriter_open_uri)
zval *self = getThis();
ze_xmlwriter_object *ze_obj = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &source, &source_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &source, &source_len) == FAILURE) {
return;
}
diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h
index 31099053ef..e68c9fcec9 100644
--- a/ext/zip/php_zip.h
+++ b/ext/zip/php_zip.h
@@ -38,7 +38,7 @@ extern zend_module_entry zip_module_entry;
#define ZIP_OVERWRITE ZIP_TRUNCATE
#endif
-#define PHP_ZIP_VERSION "1.12.4"
+#define PHP_ZIP_VERSION "1.12.5"
#ifndef Z_SET_REFCOUNT_P
# if PHP_MAJOR_VERSION < 6 && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3)
diff --git a/ext/zlib/tests/gzopen_variation1.phpt b/ext/zlib/tests/gzopen_variation1.phpt
index c5a47f4d08..bca48f39c9 100644
--- a/ext/zlib/tests/gzopen_variation1.phpt
+++ b/ext/zlib/tests/gzopen_variation1.phpt
@@ -1,17 +1,17 @@
--TEST--
-Test gzopen() function : usage variation
+Test gzopen() function : usage variation
--SKIPIF--
-<?php
+<?php
if (!extension_loaded("zlib")) {
- print "skip - zlib extension not loaded";
-}
+ print "skip - zlib extension not loaded";
+}
?>
--FILE--
<?php
/* Prototype : resource gzopen(string filename, string mode [, int use_include_path])
- * Description: Open a .gz-file and return a .gz-file pointer
+ * Description: Open a .gz-file and return a .gz-file pointer
* Source code: ext/zlib/zlib.c
- * Alias to functions:
+ * Alias to functions:
*/
echo "*** Testing gzopen() : usage variation ***\n";
@@ -102,9 +102,9 @@ $inputs = array(
// unset data
'unset var' => @$unset_var,
-
+
// resource variable
- 'resource' => $fp
+ 'resource' => $fp
);
// loop through each element of the array for filename
@@ -158,19 +158,19 @@ Error: 2 - gzopen(0.5): failed to open stream: No such file or directory, %s(%d)
bool(false)
--empty array--
-Error: 2 - gzopen() expects parameter 1 to be string, array given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, array given, %s(%d)
NULL
--int indexed array--
-Error: 2 - gzopen() expects parameter 1 to be string, array given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, array given, %s(%d)
NULL
--associative array--
-Error: 2 - gzopen() expects parameter 1 to be string, array given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, array given, %s(%d)
NULL
--nested arrays--
-Error: 2 - gzopen() expects parameter 1 to be string, array given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, array given, %s(%d)
NULL
--uppercase NULL--
@@ -210,7 +210,7 @@ Error: 2 - gzopen(Class A object): failed to open stream: No such file or direct
bool(false)
--instance of classWithoutToString--
-Error: 2 - gzopen() expects parameter 1 to be string, object given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, object given, %s(%d)
NULL
--undefined var--
@@ -222,7 +222,7 @@ Error: 2 - gzopen(): Filename cannot be empty, %s(%d)
bool(false)
--resource--
-Error: 2 - gzopen() expects parameter 1 to be string, resource given, %s(%d)
+Error: 2 - gzopen() expects parameter 1 to be a valid path, resource given, %s(%d)
NULL
===DONE===
diff --git a/ext/zlib/tests/readgzfile_variation1.phpt b/ext/zlib/tests/readgzfile_variation1.phpt
index 5a5ec4f6e7..5d9b639d29 100644
--- a/ext/zlib/tests/readgzfile_variation1.phpt
+++ b/ext/zlib/tests/readgzfile_variation1.phpt
@@ -29,15 +29,15 @@ foreach ( $variation as $var ) {
===DONE===
--EXPECTF--
-Warning: readgzfile() expects parameter 1 to be string, array given in %s on line %d
+Warning: readgzfile() expects parameter 1 to be a valid path, array given in %s on line %d
NULL
-Warning: readgzfile() expects parameter 1 to be string, array given in %s on line %d
+Warning: readgzfile() expects parameter 1 to be a valid path, array given in %s on line %d
NULL
-Warning: readgzfile() expects parameter 1 to be string, array given in %s on line %d
+Warning: readgzfile() expects parameter 1 to be a valid path, array given in %s on line %d
NULL
-Warning: readgzfile() expects parameter 1 to be string, array given in %s on line %d
+Warning: readgzfile() expects parameter 1 to be a valid path, array given in %s on line %d
NULL
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/ext/zlib/tests/readgzfile_variation6.phpt b/ext/zlib/tests/readgzfile_variation6.phpt
index 702f91850e..9fcea02939 100644
--- a/ext/zlib/tests/readgzfile_variation6.phpt
+++ b/ext/zlib/tests/readgzfile_variation6.phpt
@@ -45,5 +45,5 @@ foreach ( $variation as $var ) {
--EXPECTF--
Error: 2 - readgzfile(Class A object): failed to open stream: No such file or directory, %s(%d)
bool(false)
-Error: 2 - readgzfile() expects parameter 1 to be string, object given, %s(%d)
-NULL \ No newline at end of file
+Error: 2 - readgzfile() expects parameter 1 to be a valid path, object given, %s(%d)
+NULL
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 0cb94fe6e4..f44f92b86d 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -588,7 +588,7 @@ static PHP_FUNCTION(gzopen)
php_stream *stream;
zend_long use_include_path = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|l", &filename, &filename_len, &mode, &mode_len, &use_include_path) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ps|l", &filename, &filename_len, &mode, &mode_len, &use_include_path) == FAILURE) {
return;
}
@@ -616,7 +616,7 @@ static PHP_FUNCTION(readgzfile)
size_t size;
zend_long use_include_path = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &filename, &filename_len, &use_include_path) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|l", &filename, &filename_len, &use_include_path) == FAILURE) {
return;
}
diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c
index 4eedba8b3a..42861bcf04 100644
--- a/sapi/apache2handler/sapi_apache2.c
+++ b/sapi/apache2handler/sapi_apache2.c
@@ -694,6 +694,7 @@ zend_first_try {
} zend_end_try();
}
apr_brigade_cleanup(brigade);
+ apr_pool_cleanup_run(r->pool, (void *)&SG(server_context), php_server_context_cleanup);
} else {
ctx->r = parent_req;
}
diff --git a/sapi/fpm/fpm/events/epoll.c b/sapi/fpm/fpm/events/epoll.c
index 8b7e476ff4..8a3c5306dc 100644
--- a/sapi/fpm/fpm/events/epoll.c
+++ b/sapi/fpm/fpm/events/epoll.c
@@ -164,6 +164,10 @@ static int fpm_event_epoll_add(struct fpm_event_s *ev) /* {{{ */
struct epoll_event e;
/* fill epoll struct */
+#if SIZEOF_SIZE_T == 4
+ /* Completely initialize event data to prevent valgrind reports */
+ e.data.u64 = 0;
+#endif
e.events = EPOLLIN;
e.data.fd = ev->fd;
e.data.ptr = (void *)ev;
diff --git a/win32/build/config.w32 b/win32/build/config.w32
index d5ce9bfc70..3c2ff7a0a9 100644
--- a/win32/build/config.w32
+++ b/win32/build/config.w32
@@ -139,7 +139,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \
zend_object_handlers.c zend_objects_API.c \
zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c \
zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \
- zend_inheritance.c");
+ zend_inheritance.c zend_smart_str.c");
ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");