From e219ec144ef6682b71e135fd18654ee1bb4676b4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:28:51 +0100 Subject: [PATCH] Implement typed properties RFC: https://wiki.php.net/rfc/typed_properties_v2 This is a squash of PR #3734, which is a squash of PR #3313. Co-authored-by: Bob Weinand Co-authored-by: Joe Watkins Co-authored-by: Dmitry Stogov --- UPGRADING | 14 +- UPGRADING.INTERNALS | 13 + .../typed_properties_001.phpt | 44 + .../typed_properties_002.phpt | 15 + .../typed_properties_003.phpt | 15 + .../typed_properties_004.phpt | 18 + .../typed_properties_005.phpt | 20 + .../typed_properties_006.phpt | 14 + .../typed_properties_007.phpt | 17 + .../typed_properties_008.phpt | 14 + .../typed_properties_009.phpt | 23 + .../typed_properties_010.phpt | 17 + .../typed_properties_011.phpt | 18 + .../typed_properties_012.phpt | 19 + .../typed_properties_013.phpt | 10 + .../typed_properties_014.phpt | 10 + .../typed_properties_015.phpt | 10 + .../typed_properties_016.phpt | 16 + .../typed_properties_017.phpt | 12 + .../typed_properties_018.phpt | 17 + .../typed_properties_019.phpt | 22 + .../typed_properties_020.phpt | 26 + .../typed_properties_021.phpt | 15 + .../typed_properties_022.phpt | 15 + .../typed_properties_023.phpt | 52 + .../typed_properties_024.phpt | 16 + .../typed_properties_025.phpt | 11 + .../typed_properties_026.phpt | 23 + .../typed_properties_027.phpt | 16 + .../typed_properties_028.phpt | 15 + .../typed_properties_029.phpt | 18 + .../typed_properties_030.phpt | 25 + .../typed_properties_031.phpt | 22 + .../typed_properties_032.phpt | 15 + .../typed_properties_033.phpt | 38 + .../typed_properties_034.phpt | 51 + .../typed_properties_035.phpt | 13 + .../typed_properties_036.phpt | 15 + .../typed_properties_037.phpt | 16 + .../typed_properties_038.phpt | 61 + .../typed_properties_039.phpt | 31 + .../typed_properties_040.phpt | 25 + .../typed_properties_041.phpt | 16 + .../typed_properties_042.phpt | 21 + .../typed_properties_043.phpt | 53 + .../typed_properties_044.phpt | 58 + .../typed_properties_045.phpt | 51 + .../typed_properties_046.phpt | 29 + .../typed_properties_047.phpt | 40 + .../typed_properties_048.phpt | 17 + .../typed_properties_049.phpt | 10 + .../typed_properties_050.phpt | 19 + .../typed_properties_051.phpt | 27 + .../typed_properties_052.phpt | 34 + .../typed_properties_053.phpt | 12 + .../typed_properties_054.phpt | 12 + .../typed_properties_055.phpt | 29 + .../typed_properties_056.phpt | 23 + .../typed_properties_057.phpt | 31 + .../typed_properties_058.phpt | 32 + .../typed_properties_059.phpt | 29 + .../typed_properties_060.phpt | 22 + .../typed_properties_061.phpt | 58 + .../typed_properties_062.phpt | 81 + .../typed_properties_063.phpt | 80 + .../typed_properties_064.phpt | 80 + .../typed_properties_065.phpt | 71 + .../typed_properties_066.phpt | 21 + .../typed_properties_067.phpt | 36 + .../typed_properties_068.phpt | 87 + .../typed_properties_069.phpt | 27 + .../typed_properties_070.phpt | 49 + .../typed_properties_071.phpt | 36 + .../typed_properties_072.phpt | 24 + .../typed_properties_073.phpt | 44 + .../typed_properties_074.phpt | 41 + .../typed_properties_075.phpt | 53 + .../typed_properties_076.phpt | 71 + .../typed_properties_077.phpt | 18 + .../typed_properties_078.phpt | 59 + .../typed_properties_079.phpt | 33 + .../typed_properties_080.phpt | 36 + .../typed_properties_081.phpt | 22 + .../typed_properties_082.phpt | 30 + .../typed_properties_083.phpt | 80 + .../typed_properties_084.phpt | 25 + .../typed_properties_085.phpt | 17 + .../typed_properties_086.phpt | 27 + .../typed_properties_087.phpt | 15 + .../typed_properties_088.phpt | 30 + .../typed_properties_089.phpt | 38 + .../typed_properties_090.phpt | 25 + .../typed_properties_091.phpt | 199 + .../typed_properties_092.phpt | 41 + .../typed_properties_093.phpt | 31 + .../typed_properties_094.phpt | 36 + .../typed_properties_095.phpt | 84 + .../typed_properties_096.phpt | 46 + .../typed_properties_097.phpt | 90 + .../typed_properties_098.phpt | 17 + .../typed_properties_099.phpt | 20 + .../typed_properties_100.phpt | 19 + .../typed_properties_101.phpt | 37 + .../typed_properties_102.phpt | 22 + .../tests/type_declarations/types_in_ast.phpt | 23 + Zend/zend.c | 24 + Zend/zend.h | 2 + Zend/zend_API.c | 79 +- Zend/zend_API.h | 131 + Zend/zend_ast.c | 18 +- Zend/zend_ast.h | 1 + Zend/zend_closures.c | 7 +- Zend/zend_compile.c | 278 +- Zend/zend_compile.h | 17 +- Zend/zend_execute.c | 916 +- Zend/zend_execute.h | 79 +- Zend/zend_inheritance.c | 121 +- Zend/zend_inheritance.h | 1 + Zend/zend_language_parser.y | 5 +- Zend/zend_object_handlers.c | 118 +- Zend/zend_object_handlers.h | 8 +- Zend/zend_objects.c | 18 +- Zend/zend_objects_API.h | 18 + Zend/zend_opcode.c | 24 + Zend/zend_types.h | 52 +- Zend/zend_variables.c | 1 + Zend/zend_vm_def.h | 884 +- Zend/zend_vm_execute.h | 15459 +++++++++++++--- Zend/zend_vm_gen.php | 67 +- Zend/zend_vm_handlers.h | 3950 ++-- Zend/zend_vm_opcodes.c | 50 +- Zend/zend_vm_opcodes.h | 11 +- ext/com_dotnet/com_handlers.c | 3 +- ext/com_dotnet/com_saproxy.c | 2 +- ext/curl/multi.c | 11 +- ext/date/php_date.c | 19 +- .../DateInterval_write_property_return.phpt | 14 + ext/dom/php_dom.c | 6 +- ext/enchant/enchant.c | 8 +- ext/exif/exif.c | 15 +- ext/ftp/php_ftp.c | 6 +- ext/intl/formatter/formatter_parse.c | 24 +- ext/intl/idn/idn.c | 8 +- .../transliterator/transliterator_class.c | 7 +- ext/ldap/ldap.c | 93 +- ext/mbstring/mbstring.c | 9 +- ext/mbstring/php_mbregex.c | 8 +- ext/mysqli/mysqli.c | 6 +- ext/mysqli/mysqli_api.c | 28 +- ext/mysqlnd/mysqlnd_ps.c | 43 +- ext/mysqlnd/mysqlnd_structs.h | 1 - ext/oci8/oci8_interface.c | 19 +- ext/odbc/php_odbc.c | 9 +- ext/opcache/Optimizer/compact_literals.c | 112 +- ext/opcache/Optimizer/dce.c | 3 + ext/opcache/Optimizer/escape_analysis.c | 6 +- ext/opcache/Optimizer/sccp.c | 11 +- ext/opcache/Optimizer/zend_dfg.c | 9 +- ext/opcache/Optimizer/zend_dump.c | 14 +- ext/opcache/Optimizer/zend_inference.c | 266 +- ext/opcache/Optimizer/zend_optimizer.c | 68 +- ext/opcache/Optimizer/zend_ssa.c | 16 + ext/opcache/tests/opt/prop_types.phpt | 115 + ext/opcache/zend_accelerator_util_funcs.c | 18 + ext/opcache/zend_file_cache.c | 44 + ext/opcache/zend_persist.c | 34 + ext/opcache/zend_persist_calc.c | 20 + ext/openssl/openssl.c | 113 +- ext/pcntl/pcntl.c | 50 +- ext/pcre/php_pcre.c | 23 +- ext/pdo/pdo_stmt.c | 8 +- ext/reflection/php_reflection.c | 125 +- ...ctionClass_setStaticPropertyValue_002.phpt | 2 +- ...ctionClass_setStaticPropertyValue_003.phpt | 39 + .../ReflectionProperty_isInitialized.phpt | 113 + .../ReflectionProperty_typed_static.phpt | 51 + ext/reflection/tests/ReflectionType_001.phpt | 37 + ext/simplexml/simplexml.c | 29 +- ext/snmp/snmp.c | 6 +- ext/soap/soap.c | 14 +- ext/sockets/sockets.c | 85 +- ext/spl/spl_array.c | 6 +- ext/spl/tests/iterator_035.phpt | 2 +- ext/standard/array.c | 48 +- ext/standard/basic_functions.c | 7 +- ext/standard/dns.c | 32 +- ext/standard/dns_win32.c | 29 +- ext/standard/exec.c | 22 +- ext/standard/file.c | 7 +- ext/standard/fsock.c | 36 +- ext/standard/head.c | 12 +- ext/standard/image.c | 8 +- ext/standard/incomplete_class.c | 3 +- ext/standard/proc_open.c | 10 +- ext/standard/scanf.c | 32 +- ext/standard/streamsfuncs.c | 55 +- ext/standard/string.c | 25 +- .../tests/array/extract_typed_ref.phpt | 23 + .../settype_typed_property.phpt | 28 + .../tests/serialize/typed_property_refs.phpt | 73 + ext/standard/type.c | 35 +- ext/standard/var.c | 59 +- ext/standard/var_unserializer.re | 68 +- ext/sysvmsg/sysvmsg.c | 37 +- ext/xml/xml.c | 14 +- ext/xmlreader/php_xmlreader.c | 6 +- ext/xmlrpc/xmlrpc-epi-php.c | 16 +- ext/zend_test/test.c | 31 + ext/zip/php_zip.c | 16 +- tests/classes/array_access_012.phpt | 2 +- 210 files changed, 22678 insertions(+), 5594 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_001.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_002.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_003.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_004.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_005.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_006.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_007.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_008.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_009.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_010.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_011.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_012.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_013.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_014.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_015.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_016.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_017.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_018.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_019.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_020.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_021.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_022.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_023.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_024.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_025.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_026.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_027.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_028.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_029.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_030.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_031.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_032.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_033.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_034.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_035.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_036.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_037.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_038.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_039.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_040.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_041.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_042.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_044.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_045.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_046.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_047.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_049.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_050.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_051.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_052.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_053.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_054.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_055.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_056.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_057.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_058.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_059.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_060.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_061.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_062.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_063.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_064.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_065.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_066.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_067.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_068.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_069.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_070.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_071.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_072.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_073.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_074.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_075.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_076.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_077.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_078.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_079.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_080.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_081.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_082.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_083.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_084.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_085.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_086.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_087.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_088.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_089.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_090.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_091.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_092.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_093.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_094.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_095.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_096.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_097.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_098.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_099.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_100.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_101.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_102.phpt create mode 100644 Zend/tests/type_declarations/types_in_ast.phpt create mode 100644 ext/date/tests/DateInterval_write_property_return.phpt create mode 100644 ext/opcache/tests/opt/prop_types.phpt create mode 100644 ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt create mode 100644 ext/reflection/tests/ReflectionProperty_isInitialized.phpt create mode 100644 ext/reflection/tests/ReflectionProperty_typed_static.phpt create mode 100644 ext/standard/tests/array/extract_typed_ref.phpt create mode 100644 ext/standard/tests/general_functions/settype_typed_property.phpt create mode 100644 ext/standard/tests/serialize/typed_property_refs.phpt diff --git a/UPGRADING b/UPGRADING index 835335bb07e..be5d6ea0e67 100644 --- a/UPGRADING +++ b/UPGRADING @@ -78,8 +78,20 @@ PHP 7.4 UPGRADE NOTES 2. New Features ======================================== +- Core: + . Added support for typed properties. For example: + + class User { + public int $id; + public string $name; + } + + This will enforce that $user->id can only be assigned integer and + $user->name can only be assigned strings. For more information see the + RFC: https://wiki.php.net/rfc/typed_properties_v2 + - PDO_OCI: - . PDOStatement::getColumnMeta is now available + . PDOStatement::getColumnMeta() is now available - PDO_SQLite: . PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) allows to diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 2335e766357..e4147f249cb 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -13,6 +13,8 @@ PHP 7.4 INTERNALS UPGRADE NOTES j. Removed add_get_assoc_*() and add_get_index_*() k. Class declaration opcodes l. HASH_FLAG_INITIALIZED + m. write_property return value + n. Assignments to references 2. Build system changes a. Abstract @@ -158,6 +160,17 @@ PHP 7.4 INTERNALS UPGRADE NOTES Special HT_IS_INITIALIZED() and HT_INVALIDATE() macro were introduced to hide implementation details. + m. The write_property() object handler now returns the assigned value (after + possible type coercions) rather than void. For extensions, it should + usually be sufficient to return whatever was passed as the argument. + + n. Assignments to references now need to ensure that they respect property + types that affect the reference. This means that references should no + longer be directly assigned to, and instead a set of specialized macros + of the form ZEND_TRY_ASSIGN* needs to be used. You can find detailed + porting instructions as well as a compatibility shim in the wiki: + https://wiki.php.net/rfc/typed_properties_v2#assignments_to_references + ======================== 2. Build system changes ======================== diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt new file mode 100644 index 00000000000..6e34cb478f0 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_001.phpt @@ -0,0 +1,44 @@ +--TEST-- +Test typed properties basic operation +--FILE-- +int = $int; + $this->float = $float; + $this->bool = $bool; + $this->array = $array; + $this->std = $std; + $this->it = $array; + } +}); +?> +--EXPECTF-- +object(class@anonymous)#%d (6) { + ["int"]=> + int(1) + ["float"]=> + float(2.2) + ["bool"]=> + bool(true) + ["array"]=> + array(1) { + [0]=> + string(4) "four" + } + ["std"]=> + object(stdClass)#%d (0) { + } + ["it"]=> + array(1) { + [0]=> + string(4) "four" + } +} diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt new file mode 100644 index 00000000000..3aec7a34ba6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_002.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties error condition (read uninitialized) +--FILE-- +int); +?> +--EXPECTF-- +Fatal error: Uncaught Error: Typed property class@anonymous::$int must not be accessed before initialization in %s:6 +Stack trace: +#0 {main} + thrown in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt new file mode 100644 index 00000000000..59c289a5665 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties error condition (fetch uninitialized by reference) +--FILE-- +int; +?> +--EXPECTF-- +Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property class@anonymous::$int by reference in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt new file mode 100644 index 00000000000..03d9e41aac4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed properties error condition (type mismatch) +--FILE-- +int = $string; + } +}; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be int, string used in %s:6 +Stack trace: +#0 %s(2): class@anonymous->__construct('PHP 7 is better...') +#1 {main} + thrown in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt new file mode 100644 index 00000000000..b521963000d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_005.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties error condition (type mismatch object) +--FILE-- +std = $dummy; + } +}; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property class@anonymous::$std must be an instance of stdClass, Dummy used in %s:8 +Stack trace: +#0 %s(4): class@anonymous->__construct(Object(Dummy)) +#1 {main} + thrown in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt new file mode 100644 index 00000000000..c3a8faefd4a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_006.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test typed properties inheritance (scalar) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_007.phpt b/Zend/tests/type_declarations/typed_properties_007.phpt new file mode 100644 index 00000000000..19e8022a24f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_007.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties inheritance +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be Whatever (as in class Foo) in %s on line 11 diff --git a/Zend/tests/type_declarations/typed_properties_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt new file mode 100644 index 00000000000..70b42826261 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_008.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test typed properties inheritance (missing info) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt new file mode 100644 index 00000000000..24013b41180 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test typed properties unset leaves properties in an uninitialized state +--FILE-- +bar); + +var_dump($foo->bar); +?> +--EXPECT-- +string(3) "bar" +int(0) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt new file mode 100644 index 00000000000..fd7d367fea3 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties allow fetch reference +--FILE-- +bar); +?> +--EXPECT-- +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt new file mode 100644 index 00000000000..706a3327505 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed properties allow fetch reference for init array +--FILE-- +bar]; +var_dump($array); +?> +--EXPECT-- +array(1) { + [0]=> + &int(1) +} diff --git a/Zend/tests/type_declarations/typed_properties_012.phpt b/Zend/tests/type_declarations/typed_properties_012.phpt new file mode 100644 index 00000000000..79a77cfa40d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_012.phpt @@ -0,0 +1,19 @@ +--TEST-- +Test typed properties allow fetch reference for foreach +--FILE-- + +--EXPECT-- +object(Foo)#1 (1) { + ["bar"]=> + &int(2) +} diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt new file mode 100644 index 00000000000..01c2f4b6a0d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -0,0 +1,10 @@ +--TEST-- +Test typed properties disallow incorrect type initial value (scalar) +--FILE-- + +--EXPECTF-- +Fatal error: Default value for property of type int can only be int in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_014.phpt b/Zend/tests/type_declarations/typed_properties_014.phpt new file mode 100644 index 00000000000..2a02f0381ed --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -0,0 +1,10 @@ +--TEST-- +Test typed properties disallow incorrect type initial value (array) +--FILE-- + +--EXPECTF-- +Fatal error: Default value for property of type array can only be an array in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_015.phpt b/Zend/tests/type_declarations/typed_properties_015.phpt new file mode 100644 index 00000000000..ac11c0fe3ef --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -0,0 +1,10 @@ +--TEST-- +Test typed properties disallow incorrect type initial value (object) +--FILE-- + +--EXPECTF-- +Fatal error: Default value for property of type stdClass may not be null. Use the nullable type ?stdClass to allow null default value in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_016.phpt b/Zend/tests/type_declarations/typed_properties_016.phpt new file mode 100644 index 00000000000..e2b98a096db --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties initial values +--FILE-- + +--EXPECT-- +ok diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt new file mode 100644 index 00000000000..3e501d3688b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test typed properties disallow void +--FILE-- + +--EXPECTF-- +Fatal error: Property Foo::$int cannot have type void in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt new file mode 100644 index 00000000000..097b39b232b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties type applies to all props in group +--FILE-- +getProperty("qux"); + +var_dump((string) $prop->getType()); +?> +--EXPECT-- +string(3) "int" diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt new file mode 100644 index 00000000000..d804b9c799d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_019.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test typed properties int must not be allowed to overflow +--FILE-- +bar; + } +} + +$foo = new Foo(); + +try { + $foo->inc(); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +?> +--EXPECT-- +Cannot increment property Foo::$bar of type int past its maximal value diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt new file mode 100644 index 00000000000..d32d17b1c8d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -0,0 +1,26 @@ +--TEST-- +Test typed properties binary assign op helper test +--FILE-- +bar += 2; + try { + $this->bar += 1.5; + } catch (TypeError $e) { + echo $e->getMessage(), "\n"; + } + } +} + +$foo = new Foo(); + +var_dump($foo->bar); +?> +--EXPECT-- +Typed property Foo::$bar must be int, float used +int(2) diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt new file mode 100644 index 00000000000..a9f82528d92 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties delay type check on constant +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_022.phpt b/Zend/tests/type_declarations/typed_properties_022.phpt new file mode 100644 index 00000000000..7e947825c95 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_022.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties delay type check on ast +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt new file mode 100644 index 00000000000..1531b23b959 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -0,0 +1,52 @@ +--TEST-- +Test typed static property +--FILE-- + +--EXPECT-- +int(1) +int(1) +int(1) +int(1) +string(1) "x" +string(1) "1" +string(1) "1" +int(2) +string(1) "3" +string(1) "3" +int(4) +int(4) +int(5) +int(5) +string(1) "5" +string(1) "5" +int(5) diff --git a/Zend/tests/type_declarations/typed_properties_024.phpt b/Zend/tests/type_declarations/typed_properties_024.phpt new file mode 100644 index 00000000000..96f72166871 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_024.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties ignore private props during inheritance +--FILE-- + +--EXPECT-- +ok diff --git a/Zend/tests/type_declarations/typed_properties_025.phpt b/Zend/tests/type_declarations/typed_properties_025.phpt new file mode 100644 index 00000000000..65187c1e177 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_025.phpt @@ -0,0 +1,11 @@ +--TEST-- +Test typed properties type must preceed first declaration in group +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected 'int' (T_STRING), expecting variable (T_VARIABLE) in %s on line 4 diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt new file mode 100644 index 00000000000..a2c4e25e332 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_026.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test typed properties inherit traits with typed properties +--FILE-- +baz; + } +} + +var_dump((new Baz)->get()); +--EXPECTF-- +Fatal error: Uncaught Error: Typed property Baz::$baz must not be accessed before initialization in %s:10 +Stack trace: +#0 %s(14): Baz->get() +#1 {main} + thrown in %s on line 10 diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt new file mode 100644 index 00000000000..861769932cb --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties float widen at runtime +--FILE-- +bar = 10; + +var_dump($foo->bar); +?> +--EXPECT-- +float(10) diff --git a/Zend/tests/type_declarations/typed_properties_028.phpt b/Zend/tests/type_declarations/typed_properties_028.phpt new file mode 100644 index 00000000000..de1b3f66023 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_028.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties respect strict types (off) +--FILE-- +bar = "1"; + +var_dump($foo->bar); +?> +--EXPECT-- +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_029.phpt b/Zend/tests/type_declarations/typed_properties_029.phpt new file mode 100644 index 00000000000..a5418c91a85 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_029.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed properties respect strict types (on) +--FILE-- +bar = "1"; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:9 +Stack trace: +#0 {main} + thrown in %s on line 9 diff --git a/Zend/tests/type_declarations/typed_properties_030.phpt b/Zend/tests/type_declarations/typed_properties_030.phpt new file mode 100644 index 00000000000..a835ae5fae7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_030.phpt @@ -0,0 +1,25 @@ +--TEST-- +Test typed properties unset __get magical magic +--FILE-- +bar = "1"; # ok + +unset($foo->bar); # ok + +var_dump($foo->bar); # not okay, __get is nasty +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:16 +Stack trace: +#0 {main} + thrown in %s on line 16 diff --git a/Zend/tests/type_declarations/typed_properties_031.phpt b/Zend/tests/type_declarations/typed_properties_031.phpt new file mode 100644 index 00000000000..8022d2ef72b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_031.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test typed properties coerce int to float even in strict mode +--FILE-- +bar = $value; + } +} + +$bar = new Bar(); + +$bar->setBar(100); + +var_dump($bar->bar); +--EXPECT-- +float(100) diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt new file mode 100644 index 00000000000..f3ceeb5cd91 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties return by ref is allowed +--FILE-- +bar; + } +}; + +var_dump($foo->method()); +--EXPECT-- +int(15) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt new file mode 100644 index 00000000000..87e6aef26b6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -0,0 +1,38 @@ +--TEST-- +Test typed properties yield reference guard +--FILE-- +foo; + yield $this->bar; + yield $this->baz; + yield $this->qux; + } +}; + +try { + foreach ($foo->fetch() as &$prop) { + $prop += 1; + } +} catch (Error $e) { echo $e->getMessage(), "\n"; } + +var_dump($foo); +?> +--EXPECTF-- +Cannot assign float to reference held by property class@anonymous::$qux of type int +object(class@anonymous)#1 (4) { + ["foo"]=> + int(2) + ["bar"]=> + int(4) + ["baz"]=> + int(6) + ["qux"]=> + &int(%d) +} diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt new file mode 100644 index 00000000000..c3885af39f8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -0,0 +1,51 @@ +--TEST-- +Test typed properties passed to typed function +--FILE-- +bar] as &$item) { + yield $item; + } + } +}; + +function foo(?int &$a) { + var_dump($a); + $a = null; +} + +foo($foo->bar); + +try { + $foo->baz = &$foo->bar; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +$foo->bar = 10; + +foreach ($foo->getIterator() as &$item) { + $foo->baz = &$item; + var_dump($foo->baz); +} + +try { + foo($foo->bar); +} catch (Error $e) { echo $e->getMessage(), "\n"; } + +var_dump($foo); +?> +--EXPECT-- +int(42) +Typed property class@anonymous::$baz must be int, null used +int(1) +int(10) +int(10) +Cannot assign null to reference held by property class@anonymous::$baz of type int +object(class@anonymous)#1 (2) { + ["bar"]=> + &int(10) + ["baz"]=> + &int(10) +} diff --git a/Zend/tests/type_declarations/typed_properties_035.phpt b/Zend/tests/type_declarations/typed_properties_035.phpt new file mode 100644 index 00000000000..923f7a2a855 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_035.phpt @@ -0,0 +1,13 @@ +--TEST-- +Test typed properties inheritance must not change type +--FILE-- + $bar) { + var_dump($key, $bar); +} +?> +--EXPECT-- +string(3) "bar" +int(10) diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt new file mode 100644 index 00000000000..c5dde535728 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties var_dump uninitialized +--FILE-- + + int(10) + ["qux"]=> + uninitialized(int) +} diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt new file mode 100644 index 00000000000..44e5d04c7fd --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -0,0 +1,61 @@ +--TEST-- +Test typed properties overflowing +--FILE-- +bar++; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + $foo->bar += 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + ++$foo->bar; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + $foo->bar = $foo->bar + 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); +--EXPECTF-- +string(82) "Cannot increment property class@anonymous::$bar of type int past its maximal value" +object(class@anonymous)#1 (1) { + ["bar"]=> + int(%d) +} +string(60) "Typed property class@anonymous::$bar must be int, float used" +object(class@anonymous)#1 (1) { + ["bar"]=> + int(%d) +} +string(82) "Cannot increment property class@anonymous::$bar of type int past its maximal value" +object(class@anonymous)#1 (1) { + ["bar"]=> + int(%d) +} +string(60) "Typed property class@anonymous::$bar must be int, float used" +object(class@anonymous)#1 (1) { + ["bar"]=> + int(%d) +} diff --git a/Zend/tests/type_declarations/typed_properties_039.phpt b/Zend/tests/type_declarations/typed_properties_039.phpt new file mode 100644 index 00000000000..62413d804c1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_039.phpt @@ -0,0 +1,31 @@ +--TEST-- +Repeated assign of a variable to mismatched property type must not succeed +--FILE-- +foo = $v; + $v = new A; + $obj = new B; + $obj->foo = $v; +} + +var_dump($objs); + +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property A::$foo must be int, A used in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_040.phpt b/Zend/tests/type_declarations/typed_properties_040.phpt new file mode 100644 index 00000000000..db2b90903c7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_040.phpt @@ -0,0 +1,25 @@ +--TEST-- +Test __get on unset typed property must fail properly +--FILE-- +bar); +?> +--EXPECTF-- +string(3) "bar" + +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, null used in %s:14 +Stack trace: +#0 {main} + thrown in %s on line 14 diff --git a/Zend/tests/type_declarations/typed_properties_041.phpt b/Zend/tests/type_declarations/typed_properties_041.phpt new file mode 100644 index 00000000000..76dbfd8f5d9 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_041.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties weak conversion of strings +--FILE-- +bar = "10"; + +var_dump($foo->bar); +?> +--EXPECT-- +int(10) diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt new file mode 100644 index 00000000000..ecb3df3c11d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_042.phpt @@ -0,0 +1,21 @@ +--TEST-- +Proper source duplication on assignment to typed property +--FILE-- +bar = "5"; + var_dump($foo->bar); +} +?> +--EXPECT-- +int(5) +int(5) +int(5) +int(5) +int(5) diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt new file mode 100644 index 00000000000..eefe3587962 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,53 @@ +--TEST-- +Trying to assign to a static 'self' typed property on a trait must not fixate the type to the trait +--FILE-- +getMessage(), "\n"; +} +try { + Test::$selfNullProp = new stdClass; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + Test::$parentProp = new stdClass; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +Test::$selfNullProp = null; +var_dump(Test::$selfNullProp); + +class Foo {} +class Bar extends Foo { + use Test; +} + +Bar::$selfProp = new Bar; +Bar::$selfNullProp = new Bar; +Bar::$parentProp = new Foo; + +var_dump(Bar::$selfProp, Bar::$selfNullProp, Bar::$parentProp); + +?> +--EXPECT-- +Cannot write a value to a 'self' typed static property of a trait +Cannot write a non-null value to a 'self' typed static property of a trait +Cannot access parent:: when current class scope has no parent +NULL +object(Bar)#3 (0) { +} +object(Bar)#2 (0) { +} +object(Foo)#4 (0) { +} diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt new file mode 100644 index 00000000000..02a71a7b0b6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -0,0 +1,58 @@ +--TEST-- +Test increment functions on typed property references +--SKIPIF-- + +--FILE-- +bar; + +$bar *= 1; + +var_dump($bar--); +var_dump(--$bar); +var_dump(++$bar); +var_dump($bar++); + +$bar = PHP_INT_MAX; + +try { + var_dump($bar++); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +try { + var_dump(++$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +$bar = PHP_INT_MIN; + + +try { + var_dump($bar--); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +try { + var_dump(--$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +?> +--EXPECT-- +int(0) +int(-2) +int(-1) +int(-1) +Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value +Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value +Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value +Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt new file mode 100644 index 00000000000..7e4dc8e43fe --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -0,0 +1,51 @@ +--TEST-- +foreach() must return properly typed references +--FILE-- + &$val) { + if ($k == 'privateProp') { + var_dump($val); + $val = 20; + var_dump($val); + try { + $val = []; + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + } + } + } +} + +$foo = new Foo; +foreach ($foo as $k => &$val) { + var_dump($val); + + $val = 20; + var_dump($foo->$k); + + try { + $val = []; + var_dump($foo->$k); + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } +} +$foo->test(); +?> +--EXPECT-- +int(0) +int(20) +Cannot assign array to reference held by property Foo::$bar of type int +float(0.5) +float(20) +Cannot assign array to reference held by property Foo::$baz of type float +float(0.5) +float(20) +Cannot assign array to reference held by property Foo::$privateProp of type float diff --git a/Zend/tests/type_declarations/typed_properties_046.phpt b/Zend/tests/type_declarations/typed_properties_046.phpt new file mode 100644 index 00000000000..050e64a2a4e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_046.phpt @@ -0,0 +1,29 @@ +--TEST-- +Memory leaks on wrong assignment to typed property +--FILE-- +{bar()} = str_repeat("a", 3); + } catch (Throwable $e) { + echo $e->getMessage() . "\n"; + } +} +--EXPECT-- +Typed property Foo::$bbb must be int, string used +Typed property Foo::$bbb must be int, string used +Typed property Foo::$bbb must be int, string used +Typed property Foo::$bbb must be int, string used +Typed property Foo::$bbb must be int, string used diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt new file mode 100644 index 00000000000..7f1e573cd3a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -0,0 +1,40 @@ +--TEST-- +Nullable typed property +--FILE-- +foo); + +$x->foo = 5; +var_dump($x->foo); + +$x->foo = null; +var_dump($x->foo); + +unset($x->foo); +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = "ops"; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +?> +--EXPECTF-- +object(Foo)#1 (1) { + ["foo"]=> + NULL +} +NULL +int(5) +NULL +Typed property Foo::$foo must not be accessed before initialization +Typed property Foo::$foo must be int or null, string used diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt new file mode 100644 index 00000000000..8a06c55f236 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -0,0 +1,17 @@ +--TEST-- +Parent private property types must be ignored +--FILE-- +prop; })->call(new B)); + +?> +--EXPECT-- +int(2) diff --git a/Zend/tests/type_declarations/typed_properties_049.phpt b/Zend/tests/type_declarations/typed_properties_049.phpt new file mode 100644 index 00000000000..e7615905480 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_049.phpt @@ -0,0 +1,10 @@ +--TEST-- +Nullable typed property +--FILE-- + +--EXPECTF-- +Fatal error: Default value for property of type int may not be null. Use the nullable type ?int to allow null default value in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_050.phpt b/Zend/tests/type_declarations/typed_properties_050.phpt new file mode 100644 index 00000000000..3fa826083e1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_050.phpt @@ -0,0 +1,19 @@ +--TEST-- +Weak casts must not overwrite source variables +--FILE-- +a = $b; +var_dump($o, $a); + +?> +--EXPECT-- +object(A)#1 (1) { + ["a"]=> + int(1) +} +string(1) "1" diff --git a/Zend/tests/type_declarations/typed_properties_051.phpt b/Zend/tests/type_declarations/typed_properties_051.phpt new file mode 100644 index 00000000000..1c8673d0d3d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_051.phpt @@ -0,0 +1,27 @@ +--TEST-- +Weak casts must not leak +--FILE-- +a = new B; +var_dump($o->a); +try { + $o->a = new C; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +?> +--EXPECT-- +string(4) "okok" +Typed property A::$a must be string, C used diff --git a/Zend/tests/type_declarations/typed_properties_052.phpt b/Zend/tests/type_declarations/typed_properties_052.phpt new file mode 100644 index 00000000000..3a73d7359a0 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_052.phpt @@ -0,0 +1,34 @@ +--TEST-- +Class properties declared in eval() must not leak +--FILE-- + +--EXPECT-- +object(A)#1 (0) { + ["a1"]=> + uninitialized(A) + ["b1"]=> + uninitialized(B) + ["c1"]=> + uninitialized(Foo\C) + ["a2"]=> + uninitialized(?A) + ["b2"]=> + uninitialized(?B) + ["c2"]=> + uninitialized(?Foo\C) +} diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt new file mode 100644 index 00000000000..1da42bcbd97 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -0,0 +1,12 @@ +--TEST-- +Typed properties disallow callable +--FILE-- + +--EXPECTF-- +Fatal error: Property A::$a cannot have type callable in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_054.phpt b/Zend/tests/type_declarations/typed_properties_054.phpt new file mode 100644 index 00000000000..38de9815edf --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -0,0 +1,12 @@ +--TEST-- +Typed properties disallow callable (nullable variant) +--FILE-- + +--EXPECTF-- +Fatal error: Property A::$a cannot have type callable in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt new file mode 100644 index 00000000000..31d687254c4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test assign to typed property taken by reference +--FILE-- +a = new A; +$f($o->a->foo); +$f($o->a->bar); +?> +--EXPECTF-- +int(1) +int(2) + +Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A::$bar of type int in %s:%d +Stack trace: +#0 %s(%d): {closure}(2) +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt new file mode 100644 index 00000000000..54013f44f22 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_056.phpt @@ -0,0 +1,23 @@ +--TEST-- +Type change in assign_op (use-after-free) +--FILE-- +foo = "1" . str_repeat("0", 2); +try { + $o->foo += 5; +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +var_dump($o->foo); +unset($o); +?> +--EXPECT-- +Typed property A::$foo must be string, int used +string(3) "100" diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt new file mode 100644 index 00000000000..6b53a42600a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_057.phpt @@ -0,0 +1,31 @@ +--TEST-- +Type change in pre/post-increment (use-after-free) +--FILE-- +foo = "1" . str_repeat("0", 2); +try { + $x = ++$o->foo; +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +var_dump($o->foo); +try { + $x = $o->foo++; +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +var_dump($o->foo); +unset($o); +?> +--EXPECT-- +Typed property A::$foo must be string, int used +string(3) "100" +Typed property A::$foo must be string, int used +string(3) "100" diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt new file mode 100644 index 00000000000..d9283bdbef6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -0,0 +1,32 @@ +--TEST-- +Constants in default values of properties +--FILE-- +foo); + +for ($i = 0; $i < 2; $i++) { + try { + $o = new B(); + var_dump($o->foo); + } catch (Throwable $e) { + echo $e->getMessage() . "\n"; + } +} +?> +--EXPECT-- +int(5) +Typed property B::$foo must be string, int used +Typed property B::$foo must be string, int used diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt new file mode 100644 index 00000000000..caee8501f72 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -0,0 +1,29 @@ +--TEST-- +Nullable typed properties in traits +--FILE-- + +--EXPECT-- +object(A)#1 (0) { + ["a2"]=> + uninitialized(int) + ["b2"]=> + uninitialized(?int) + ["a1"]=> + uninitialized(int) + ["b1"]=> + uninitialized(?int) +} diff --git a/Zend/tests/type_declarations/typed_properties_060.phpt b/Zend/tests/type_declarations/typed_properties_060.phpt new file mode 100644 index 00000000000..559349b7a97 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_060.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test typed properties work fine with simple inheritance +--FILE-- +a); +$o->a = "a"; + +?> +--EXPECTF-- +int(1) + +Fatal error: Uncaught TypeError: Typed property A::$a must be int, string used in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt new file mode 100644 index 00000000000..647543c6d6d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -0,0 +1,58 @@ +--TEST-- +Typed property on overloaded by-ref property +--SKIPIF-- + +--FILE-- +foo; + } + + function __set($x, $y) { + echo "set($y)\n"; + } +}; + +$a->_ += 1; +var_dump($a->foo); + +$a->_ .= "1"; +var_dump($a->foo); + +$a->_ .= "e50"; +var_dump($a->foo); + +$a->_--; +var_dump($a->foo); + +--$a->_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +$a->_++; +var_dump($a->foo); + +++$a->_; +var_dump($a->foo); + +?> +--EXPECT-- +set(2) +int(1) +set(11) +int(1) +set(1e50) +int(1) +set(0) +int(1) +set(0) +int(1) +set(9.2233720368548E+18) +int(9223372036854775807) +set(9.2233720368548E+18) +int(9223372036854775807) diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt new file mode 100644 index 00000000000..45f4682806f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -0,0 +1,81 @@ +--TEST-- +Typed property on by-ref property +--FILE-- +_ = &$a->foo; + +$a->_ += 1; +var_dump($a->foo); + +$a->_ .= "1"; +var_dump($a->foo); + +try { + $a->_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_--; +var_dump($a->foo); + +--$a->_; +var_dump($a->foo); + +$a->foo = PHP_INT_MIN; + +try { + $a->_--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$a->foo = PHP_INT_MAX; + +try { + $a->_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + ++$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$a->_ = 0; +try { + $a->_ = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_ = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference held by property class@anonymous::$foo of type int +int(21) +int(20) +int(19) +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot assign array to reference held by property class@anonymous::$foo of type int +int(0) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt new file mode 100644 index 00000000000..bd4cccff22f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -0,0 +1,80 @@ +--TEST-- +Typed property on by-ref variable +--FILE-- +foo; + +$_ += 1; +var_dump($a->foo); + +$_ .= "1"; +var_dump($a->foo); + +try { + $_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_--; +var_dump($a->foo); + +--$_; +var_dump($a->foo); + +$a->foo = PHP_INT_MIN; + +try { + $_--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$a->foo = PHP_INT_MAX; + +try { + $_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + ++$_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$_ = 0; +try { + $_ = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_ = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference held by property class@anonymous::$foo of type int +int(21) +int(20) +int(19) +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot assign array to reference held by property class@anonymous::$foo of type int +int(0) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt new file mode 100644 index 00000000000..59e0552898a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -0,0 +1,80 @@ +--TEST-- +Typed property on by-ref array value +--FILE-- +foo]; + +$_[0] += 1; +var_dump($a->foo); + +$_[0] .= "1"; +var_dump($a->foo); + +try { + $_[0] .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_[0]--; +var_dump($a->foo); + +--$_[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MIN; + +try { + $_[0]--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$_[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$a->foo = PHP_INT_MAX; + +try { + $_[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + ++$_[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$_[0] = 0; +try { + $_[0] = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_[0] = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference held by property class@anonymous::$foo of type int +int(21) +int(20) +int(19) +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot assign array to reference held by property class@anonymous::$foo of type int +int(0) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt new file mode 100644 index 00000000000..da88cbf2cbd --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -0,0 +1,71 @@ +--TEST-- +Typed property on by-ref array dimension +--FILE-- +foo; } + function offsetSet($o, $v) { print "offsetSet($v)\n"; } + function offsetUnset($o) { print "offsetUnset() ?!?"; } +}; + +$a[0] += 1; +var_dump($a->foo); + +$a[0] .= "1"; +var_dump($a->foo); + +$a[0] .= "e50"; +var_dump($a->foo); + +$a[0]--; +var_dump($a->foo); + +--$a[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MIN; + +try { + $a[0]--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$a[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +$a->foo = PHP_INT_MAX; + +try { + $a[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + ++$a[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +?> +--EXPECT-- +offsetSet(2) +int(1) +offsetSet(11) +int(1) +offsetSet(1e50) +int(1) +int(0) +int(-1) +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer diff --git a/Zend/tests/type_declarations/typed_properties_066.phpt b/Zend/tests/type_declarations/typed_properties_066.phpt new file mode 100644 index 00000000000..a91a00df650 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_066.phpt @@ -0,0 +1,21 @@ +--TEST-- +Typed property assignment must not overwrite constants +--FILE-- +x; +$y = 4; +var_dump($x, 4); /* Optimizer will merge both "4" constants, making it immediately visible */ + +?> +--EXPECT-- +object(Foo)#1 (1) { + ["x"]=> + &float(4) +} +int(4) diff --git a/Zend/tests/type_declarations/typed_properties_067.phpt b/Zend/tests/type_declarations/typed_properties_067.phpt new file mode 100644 index 00000000000..da6865e5d49 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_067.phpt @@ -0,0 +1,36 @@ +--TEST-- +Iterable typed properties must be accepted to by-ref array arguments +--FILE-- +it); +var_dump($obj->it); +array_shift($obj->it); +var_dump($obj->it); +parse_str("foo=bar", $obj->it); +var_dump($obj->it); +$obj->it = []; +var_dump($obj->it); + +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +array(0) { +} +array(1) { + ["foo"]=> + string(3) "bar" +} +array(0) { +} diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt new file mode 100644 index 00000000000..7ed58d2a008 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -0,0 +1,87 @@ +--TEST-- +Test typed static property by ref +--FILE-- +getMessage()."\n"; } +var_dump($i, Foo::$i); + +try { + Foo::$i = null; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($i, Foo::$i); + +Foo::$s = &ref(5); +var_dump(Foo::$s, ref()); + +Foo::$i = &ref("0"); +var_dump(Foo::$i, ref()); + +try { + Foo::$i = &ref("x"); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, ref()); + +try { + Foo::$i = &Foo::$s; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, Foo::$s); + +try { + Foo::$s = &Foo::$i; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, Foo::$s); + +?> +--EXPECT-- +int(5) +int(2) +int(2) +int(3) +int(3) +int(4) +int(4) +Cannot assign null to reference held by property Foo::$i of type int +int(4) +int(4) +Typed property Foo::$i must be int, null used +int(4) +int(4) +string(1) "5" +string(1) "5" +int(0) +int(0) +Typed property Foo::$i must be int, string used +int(0) +string(1) "x" +Reference with value of type string held by property Foo::$s of type string is not compatible with property Foo::$i of type int +int(0) +string(1) "5" +Reference with value of type int held by property Foo::$i of type int is not compatible with property Foo::$s of type string +int(0) +string(1) "5" diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt new file mode 100644 index 00000000000..77cfc024878 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -0,0 +1,27 @@ +--TEST-- +Test assign of invalid string to typed static int property +--FILE-- +getMessage()."\n"; } +try { + var_dump(Foo::$i); +} catch (Error $e) { print $e->getMessage()."\n"; } +var_dump(nonNumericStringRef()); + +?> +--EXPECT-- +Typed property Foo::$i must be int, string used +Typed static property Foo::$i must not be accessed before initialization +string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_070.phpt b/Zend/tests/type_declarations/typed_properties_070.phpt new file mode 100644 index 00000000000..dd77c68355e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_070.phpt @@ -0,0 +1,49 @@ +--TEST-- +Test typed static property with assign op operators +--FILE-- +getMessage()."\n"; } +var_dump(Foo::$i); + +try { + Foo::$i .= PHP_INT_MAX; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i); + +?> +--EXPECT-- +string(2) "11" +string(2) "13" +string(2) "12" +int(1) +Typed property Foo::$i must be int, float used +int(1) +Typed property Foo::$i must be int, string used +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_071.phpt b/Zend/tests/type_declarations/typed_properties_071.phpt new file mode 100644 index 00000000000..4d0451cf73f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_071.phpt @@ -0,0 +1,36 @@ +--TEST-- +Test assignment to typed reference with weak type conversion +--FILE-- +x = &$y; +var_dump($y, $test); + +$z = 42; +$y = $z; +var_dump($y, $z, $test); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["x"]=> + string(1) "x" +} +string(1) "y" +object(Test)#1 (1) { + ["x"]=> + &string(1) "y" +} +string(2) "42" +int(42) +object(Test)#1 (1) { + ["x"]=> + &string(2) "42" +} diff --git a/Zend/tests/type_declarations/typed_properties_072.phpt b/Zend/tests/type_declarations/typed_properties_072.phpt new file mode 100644 index 00000000000..b56c5d632e8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_072.phpt @@ -0,0 +1,24 @@ +--TEST-- +Typed property must cast when used with __get() +--FILE-- +val); + +?> +--EXPECT-- +object(Test)#1 (0) { + ["val"]=> + uninitialized(int) +} +int(42) diff --git a/Zend/tests/type_declarations/typed_properties_073.phpt b/Zend/tests/type_declarations/typed_properties_073.phpt new file mode 100644 index 00000000000..7f9b4ff2de0 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_073.phpt @@ -0,0 +1,44 @@ +--TEST-- +Typed property must cast when used with &__get() +--FILE-- +prop; + } +} + +$test = new Test; +var_dump($test); +var_dump($val = &$test->val); +var_dump($test); + +$test->prop = "x"; +var_dump($test, $val); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + string(2) "42" + ["val"]=> + uninitialized(int) +} +int(42) +object(Test)#1 (1) { + ["prop"]=> + &int(42) + ["val"]=> + uninitialized(int) +} +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_074.phpt b/Zend/tests/type_declarations/typed_properties_074.phpt new file mode 100644 index 00000000000..8e6be312c6d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_074.phpt @@ -0,0 +1,41 @@ +--TEST-- +Typed property must be compatible when returned via &__get() +--FILE-- +prop; + } +} + +$test = new Test; +$dummyRef = &$test->prop; +var_dump($test); +try { + var_dump($test->val); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($test); + +$test->prop = "y"; +var_dump($test->prop); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +Typed property Test::$val must be int, string used +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "y" diff --git a/Zend/tests/type_declarations/typed_properties_075.phpt b/Zend/tests/type_declarations/typed_properties_075.phpt new file mode 100644 index 00000000000..5f3943cbee2 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_075.phpt @@ -0,0 +1,53 @@ +--TEST-- +Test typed properties overflowing +--SKIPIF-- + +--FILE-- +getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar += 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + ++Foo::$bar; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar = Foo::$bar + 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +?> +--EXPECT-- +string(70) "Cannot increment property Foo::$bar of type int past its maximal value" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(70) "Cannot increment property Foo::$bar of type int past its maximal value" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) diff --git a/Zend/tests/type_declarations/typed_properties_076.phpt b/Zend/tests/type_declarations/typed_properties_076.phpt new file mode 100644 index 00000000000..b0d0bfedf80 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_076.phpt @@ -0,0 +1,71 @@ +--TEST-- +Computation of intersection types for typed reference to typed property assignments +--FILE-- +$prop2 = $value; + $test->$prop1 =& $test->$prop2; + echo "Invalid assignment $prop1 =& $prop2 did not error\n"; + } catch (TypeError $e) {} + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + echo "Invalid assignment $prop2 =& $prop1 did not error\n"; + } catch (TypeError $e) {} +} + +function valid(Test $test, string $prop1, string $prop2, $value) { + try { + $test->$prop2 = $value; + $test->$prop1 =& $test->$prop2; + } catch (TypeError $e) { + echo "Valid assignment $prop1 =& $prop2 threw {$e->getMessage()}\n"; + } + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + } catch (TypeError $e) { + echo "Valid assignment $prop2 =& $prop1 threw {$e->getMessage()}\n"; + } +} + +$test = new Test; +invalid($test, 'int', 'float', 42.0); +valid($test, 'int', 'nint', 42); +invalid($test, 'int', 'nint', null); +valid($test, 'nint', 'nstring', null); +invalid($test, 'nint', 'nstring', '42'); +valid($test, 'A', 'A', new A); +valid($test, 'A', 'B', new B); +invalid($test, 'A', 'B', new A); +valid($test, 'iterable', 'array', [1, 2, 3]); +valid($test, 'A', 'object', new A); +invalid($test, 'A', 'object', new Test); +valid($test, 'iterable', 'Iterator', new ArrayIterator); +invalid($test, 'Iterator', 'iterable', [1, 2, 3]); +valid($test, 'object', 'iterable', new ArrayIterator); +invalid($test, 'iterable', 'object', new stdClass); + +echo "Done\n"; + +?> +--EXPECT-- +Done diff --git a/Zend/tests/type_declarations/typed_properties_077.phpt b/Zend/tests/type_declarations/typed_properties_077.phpt new file mode 100644 index 00000000000..4e2640338f4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_077.phpt @@ -0,0 +1,18 @@ +--TEST-- +Converted values shall be returned and not the original value upon property assignment +--FILE-- +i = "42"); +var_dump($test->s = 42); + +?> +--EXPECT-- +int(42) +string(2) "42" diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt new file mode 100644 index 00000000000..6645970dd41 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -0,0 +1,59 @@ +--TEST-- +Typed references must be kept track of and always be only the intersection of the types currently holding that reference +--FILE-- +it; +$a->a = &$ref; + +var_dump($ref); + +try { + $a->t = &$ref; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +$a->it = [1]; // type is still assignable +var_dump($ref); + +try { + $ref = new ArrayIterator(); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +unset($a->a); + +$ref = null; + +$a->t = &$ref; + +try { + $ref = []; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +$ref = new ArrayIterator(); +var_dump($ref instanceof ArrayIterator); + +?> +--EXPECT-- +array(0) { +} +string(89) "Typed property class@anonymous::$t must be an instance of Traversable or null, array used" +array(0) { +} +array(1) { + [0]=> + int(1) +} +string(92) "Cannot assign ArrayIterator to reference held by property class@anonymous::$a of type ?array" +bool(false) +string(90) "Cannot assign array to reference held by property class@anonymous::$t of type ?Traversable" +bool(false) +bool(true) diff --git a/Zend/tests/type_declarations/typed_properties_079.phpt b/Zend/tests/type_declarations/typed_properties_079.phpt new file mode 100644 index 00000000000..85ed6fc75d4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_079.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test static typed properties with references +--FILE-- +getMessage()); } +var_dump(A::$it); + +A::$a = &$a; + +A::$it = new ArrayIterator(); + +try { + $a = 1; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($a); + +?> +--EXPECT-- +string(78) "Cannot assign ArrayIterator to reference held by property A::$a of type ?array" +array(0) { +} +string(68) "Cannot assign int to reference held by property A::$a of type ?array" +NULL diff --git a/Zend/tests/type_declarations/typed_properties_080.phpt b/Zend/tests/type_declarations/typed_properties_080.phpt new file mode 100644 index 00000000000..58a17a1a965 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_080.phpt @@ -0,0 +1,36 @@ +--TEST-- +Access to typed static properties before initialization +--FILE-- +getMessage(), "\n"; + } + try { + self::$b; + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + try { + self::$c; + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + } +} + +Test::run(); + +?> +--EXPECT-- +Typed static property Test::$a must not be accessed before initialization +Typed static property Test::$b must not be accessed before initialization +Typed static property Test::$c must not be accessed before initialization diff --git a/Zend/tests/type_declarations/typed_properties_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt new file mode 100644 index 00000000000..4f49eae4e76 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -0,0 +1,22 @@ +--TEST-- +Clone must inherit typed references +--FILE-- +x; +$test2 = clone $test; +unset($test); +try { + $x = "foo"; +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } +var_dump($test2->x); + +?> +--EXPECT-- +Cannot assign string to reference held by property Test::$x of type int +int(42) diff --git a/Zend/tests/type_declarations/typed_properties_082.phpt b/Zend/tests/type_declarations/typed_properties_082.phpt new file mode 100644 index 00000000000..1e4e62e89b4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_082.phpt @@ -0,0 +1,30 @@ +--TEST-- +Test typed references to static properties +--FILE-- +getMessage(), "\n"; } +var_dump($x, Test::$x); + +Test::$x =& Test2::$y; // remove the typed ref from $x +$x = "foo"; +var_dump($x, Test::$x); + +?> +--EXPECT-- +Cannot assign string to reference held by property Test::$x of type int +int(0) +int(0) +string(3) "foo" +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt new file mode 100644 index 00000000000..f67eec302a4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -0,0 +1,80 @@ +--TEST-- +Test array promotion does not violate type restrictions +--FILE-- +i[] = 1; +var_dump($a->i); + +try { + $a->p[] = "test"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +try { // must be uninit + var_dump($a->p); // WRONG! +} catch (Error $e) { var_dump($e->getMessage()); } + +$a->p = null; +try { + $a->p[] = "test"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($a->p); + +Foo::$a["bar"] = 2; +var_dump(Foo::$a); + +try { + Foo::$s["baz"][] = "baz"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +try { // must be uninit + var_dump(Foo::$s); +} catch (Error $e) { var_dump($e->getMessage()); } + +Foo::$a = null; +$ref = &Foo::$a; +$ref[] = 3; +var_dump($ref); + +$ref = &$a->p; +try { + $ref[] = "bar"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +try { + $ref["baz"][] = "bar"; // indirect assign +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +string(71) "Cannot auto-initialize an array inside property Foo::$p of type ?string" +string(65) "Typed property Foo::$p must not be accessed before initialization" +string(71) "Cannot auto-initialize an array inside property Foo::$p of type ?string" +NULL +array(1) { + ["bar"]=> + int(2) +} +string(71) "Cannot auto-initialize an array inside property Foo::$s of type ?string" +string(72) "Typed static property Foo::$s must not be accessed before initialization" +array(1) { + [0]=> + int(3) +} +string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string" +NULL +string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string" +NULL diff --git a/Zend/tests/type_declarations/typed_properties_084.phpt b/Zend/tests/type_declarations/typed_properties_084.phpt new file mode 100644 index 00000000000..fb3c86115ee --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_084.phpt @@ -0,0 +1,25 @@ +--TEST-- +Typed properties and class aliases +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/typed_properties_085.phpt b/Zend/tests/type_declarations/typed_properties_085.phpt new file mode 100644 index 00000000000..ccac3768cb1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_085.phpt @@ -0,0 +1,17 @@ +--TEST-- +Important properties with different types from traits +--FILE-- + +--EXPECTF-- +Fatal error: T1 and T2 define the same property ($prop) in the composition of C. However, the definition differs and is considered incompatible. Class was composed in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_086.phpt b/Zend/tests/type_declarations/typed_properties_086.phpt new file mode 100644 index 00000000000..c58eb7898ef --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_086.phpt @@ -0,0 +1,27 @@ +--TEST-- +Test typed properties with integer keys +--FILE-- +$x = 2; +$t->$x--; + +var_dump($t); + +?> +--EXPECT-- +object(T)#1 (1) { + ["i"]=> + uninitialized(int) + ["1"]=> + int(1) +} diff --git a/Zend/tests/type_declarations/typed_properties_087.phpt b/Zend/tests/type_declarations/typed_properties_087.phpt new file mode 100644 index 00000000000..b981dfc166b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_087.phpt @@ -0,0 +1,15 @@ +--TEST-- +Ensure null-initialization of nullable typed static property taken by reference +--FILE-- + +--EXPECT-- +NULL diff --git a/Zend/tests/type_declarations/typed_properties_088.phpt b/Zend/tests/type_declarations/typed_properties_088.phpt new file mode 100644 index 00000000000..b2f626d3dab --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_088.phpt @@ -0,0 +1,30 @@ +--TEST-- +Check for correct invalidation of prop_info cache slots +--FILE-- +prop = "42"; + var_dump($obj); +} + +test(new A); +test(new B); + +?> +--EXPECT-- +object(A)#1 (1) { + ["prop"]=> + int(42) +} +object(B)#1 (1) { + ["prop"]=> + string(2) "42" +} diff --git a/Zend/tests/type_declarations/typed_properties_089.phpt b/Zend/tests/type_declarations/typed_properties_089.phpt new file mode 100644 index 00000000000..1d59b8d945a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_089.phpt @@ -0,0 +1,38 @@ +--TEST-- +Modification of typed property during assignment must not leak +--FILE-- +prop = "dont "; + $a->prop .= "leak "; + $a->prop .= "me!"; + return "test"; + } +} + +$a = new A; +$a->prop = new B; +var_dump($a); + +$a = new A; +$prop = &$a->prop; +$a->prop = new B; +var_dump($a); + +?> +--EXPECTF-- +object(A)#1 (1) { + ["prop"]=> + string(4) "test" +} +object(A)#%d (1) { + ["prop"]=> + &string(4) "test" +} diff --git a/Zend/tests/type_declarations/typed_properties_090.phpt b/Zend/tests/type_declarations/typed_properties_090.phpt new file mode 100644 index 00000000000..3b75aaa8433 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_090.phpt @@ -0,0 +1,25 @@ +--TEST-- +Unsetting typed properties containing a reference must respect shadowing +--FILE-- +prop; + unset($this->prop); + $x = "foo"; + var_dump($x); + } +} +class B extends A { + private $prop; +} + +$b = new B; +$b->test(); + +?> +--EXPECT-- +string(3) "foo" diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt new file mode 100644 index 00000000000..7d6b54ae595 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -0,0 +1,199 @@ +--TEST-- +Automatic promotion of falsy to object +--FILE-- +prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$test->stdProp->wat = 123; +$test->objectProp->wat = 123; +var_dump($test); + +// Object properties via reference +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat = 123; +$objectProp->wat = 123; +var_dump($test); + +// Object properties via reference rw +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat->wat = 123; +$objectProp->wat->wat = 123; +var_dump($test); + +// Static properties +try { + Test::$staticProp->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +Test::$staticStdProp->wat = 123; +Test::$staticObjectProp->wat = 123; +var_dump(Test::$staticProp, Test::$staticStdProp, Test::$staticObjectProp); + +// Non-string property name +$test = new Test; +$propName = new class { + public function __toString() { + return 'prop'; + } +}; +try { + $test->$propName->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +// Initially null +$test = new Test; +$test->prop = NULL; +$test->stdProp = NULL; +$test->objectProp = NULL; +try { + $test->prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$test->stdProp->wat = 123; +$test->objectProp->wat = 123; +var_dump($test); + +?> +--EXPECTF-- +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#1 (2) { + ["prop"]=> + uninitialized(?Test) + ["stdProp"]=> + object(stdClass)#3 (1) { + ["wat"]=> + int(123) + } + ["objectProp"]=> + object(stdClass)#4 (1) { + ["wat"]=> + int(123) + } +} +Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#5 (3) { + ["prop"]=> + &NULL + ["stdProp"]=> + &object(stdClass)#2 (1) { + ["wat"]=> + int(123) + } + ["objectProp"]=> + &object(stdClass)#4 (1) { + ["wat"]=> + int(123) + } +} +Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#3 (3) { + ["prop"]=> + &NULL + ["stdProp"]=> + &object(stdClass)#1 (1) { + ["wat"]=> + object(stdClass)#2 (1) { + ["wat"]=> + int(123) + } + } + ["objectProp"]=> + &object(stdClass)#5 (1) { + ["wat"]=> + object(stdClass)#6 (1) { + ["wat"]=> + int(123) + } + } +} +Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +NULL +object(stdClass)#4 (1) { + ["wat"]=> + int(123) +} +object(stdClass)#8 (1) { + ["wat"]=> + int(123) +} +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test +object(Test)#9 (0) { + ["prop"]=> + uninitialized(?Test) + ["stdProp"]=> + uninitialized(?stdClass) + ["objectProp"]=> + uninitialized(?object) +} +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#7 (3) { + ["prop"]=> + NULL + ["stdProp"]=> + object(stdClass)#10 (1) { + ["wat"]=> + int(123) + } + ["objectProp"]=> + object(stdClass)#11 (1) { + ["wat"]=> + int(123) + } +} diff --git a/Zend/tests/type_declarations/typed_properties_092.phpt b/Zend/tests/type_declarations/typed_properties_092.phpt new file mode 100644 index 00000000000..8509fa74464 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_092.phpt @@ -0,0 +1,41 @@ +--TEST-- +Refs on ASSIGN_OBJ fast-path +--FILE-- +prop = $array; + } + + public function bar() { + $str = "123"; + $this->prop2 = ref($str); + } +} + +$test = new Test; +$test->foo(); +$test->foo(); +$test->bar(); +$test->bar(); +var_dump($test); + +?> +--EXPECT-- +object(Test)#1 (2) { + ["prop"]=> + array(0) { + } + ["prop2"]=> + int(123) +} diff --git a/Zend/tests/type_declarations/typed_properties_093.phpt b/Zend/tests/type_declarations/typed_properties_093.phpt new file mode 100644 index 00000000000..f0c7ef51a90 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_093.phpt @@ -0,0 +1,31 @@ +--TEST-- +Typed property assignment by ref with variable name +--FILE-- +$name =& $ref; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +?> +--EXPECT-- +Typed property Test::$prop must be int, string used +object(Test)#2 (0) { + ["prop"]=> + uninitialized(int) +} diff --git a/Zend/tests/type_declarations/typed_properties_094.phpt b/Zend/tests/type_declarations/typed_properties_094.phpt new file mode 100644 index 00000000000..0fbcb7ef558 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_094.phpt @@ -0,0 +1,36 @@ +--TEST-- +Edge cases relating to reference source tracking +--FILE-- +prop; +unset($b); +$r = "foo"; // ok + +class A2 { + private int $prop = 42; + + public function &getRef() { + return $this->prop; + } +} +class B2 extends A2 { + public $prop; +} + +$b2 = new B2; +$r2 =& $b2->getRef(); +unset($b2); +$r2 = "foo"; // ok + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/typed_properties_095.phpt b/Zend/tests/type_declarations/typed_properties_095.phpt new file mode 100644 index 00000000000..edbef8dfc75 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_095.phpt @@ -0,0 +1,84 @@ +--TEST-- +Typed properties in internal classes +--SKIPIF-- + +--FILE-- +intProp); +try { + $obj->intProp = "foobar"; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$obj->intProp = 456; + +try { + $obj->classProp = $obj; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$obj->classProp = new stdClass; +var_dump($obj); + +// Inherit from internal class + +class Test extends _ZendTestClass { +} + +$obj = new Test; +var_dump($obj->intProp); +try { + $obj->intProp = "foobar"; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$obj->intProp = 456; + +try { + $obj->classProp = $obj; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$obj->classProp = new stdClass; +var_dump($obj); + +// Static internal typed properties + +var_dump(_ZendTestClass::$staticIntProp); +try { + _ZendTestClass::$staticIntProp = "foobar"; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +_ZendTestClass::$staticIntProp = 456; +var_dump(_ZendTestClass::$staticIntProp); + +?> +--EXPECT-- +int(123) +Typed property _ZendTestClass::$intProp must be int, string used +Typed property _ZendTestClass::$classProp must be an instance of stdClass or null, _ZendTestClass used +object(_ZendTestClass)#1 (2) { + ["intProp"]=> + int(456) + ["classProp"]=> + object(stdClass)#2 (0) { + } +} +int(123) +Typed property _ZendTestClass::$intProp must be int, string used +Typed property _ZendTestClass::$classProp must be an instance of stdClass or null, Test used +object(Test)#4 (2) { + ["intProp"]=> + int(456) + ["classProp"]=> + object(stdClass)#1 (0) { + } +} +int(123) +Typed property _ZendTestClass::$staticIntProp must be int, string used +int(456) diff --git a/Zend/tests/type_declarations/typed_properties_096.phpt b/Zend/tests/type_declarations/typed_properties_096.phpt new file mode 100644 index 00000000000..32191b241e9 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_096.phpt @@ -0,0 +1,46 @@ +--TEST-- +References to typed properties with undefined classes +--FILE-- +prop2 = 123; +$ref =& $test->prop2; +try { + $test->prop =& $ref; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +class Test2 { + public ?Foobar $prop; + public ?int $prop2; +} + +$test = new Test2; +$test->prop2 = null; +$ref =& $test->prop2; +$test->prop =& $ref; +var_dump($test); + +?> +--EXPECT-- +Typed property Test1::$prop must be an instance of Foobar, int used +object(Test1)#1 (1) { + ["prop"]=> + uninitialized(Foobar) + ["prop2"]=> + &int(123) +} +object(Test2)#3 (2) { + ["prop"]=> + &NULL + ["prop2"]=> + &NULL +} diff --git a/Zend/tests/type_declarations/typed_properties_097.phpt b/Zend/tests/type_declarations/typed_properties_097.phpt new file mode 100644 index 00000000000..b00f05980c5 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_097.phpt @@ -0,0 +1,90 @@ +--TEST-- +Incrementing/decrementing past max/min value (additional cases) +--SKIPIF-- + +--FILE-- +foo = PHP_INT_MIN; +try { + --$test->foo; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); +try { + $test->foo--; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); + +$test->foo = PHP_INT_MAX; +try { + ++$test->foo; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); +try { + $test->foo++; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); + +// Do the same things again, but with the property being a reference. +$ref =& $test->foo; + +$test->foo = PHP_INT_MIN; +try { + --$test->foo; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); +try { + $test->foo--; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); + +$test->foo = PHP_INT_MAX; +try { + ++$test->foo; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); +try { + $test->foo++; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->foo); + +?> +--EXPECT-- +Cannot decrement property Test::$foo of type int past its minimal value +int(-9223372036854775808) +Cannot decrement property Test::$foo of type int past its minimal value +int(-9223372036854775808) +Cannot increment property Test::$foo of type int past its maximal value +int(9223372036854775807) +Cannot increment property Test::$foo of type int past its maximal value +int(9223372036854775807) +Cannot decrement property Test::$foo of type int past its minimal value +int(-9223372036854775808) +Cannot decrement property Test::$foo of type int past its minimal value +int(-9223372036854775808) +Cannot increment property Test::$foo of type int past its maximal value +int(9223372036854775807) +Cannot increment property Test::$foo of type int past its maximal value +int(9223372036854775807) diff --git a/Zend/tests/type_declarations/typed_properties_098.phpt b/Zend/tests/type_declarations/typed_properties_098.phpt new file mode 100644 index 00000000000..48e443c4581 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_098.phpt @@ -0,0 +1,17 @@ +--TEST-- +Make sure uninitialized property is initialized to null when taken by reference +--FILE-- +prop); +$ref =& $test->prop; +var_dump($ref); + +?> +--EXPECT-- +NULL diff --git a/Zend/tests/type_declarations/typed_properties_099.phpt b/Zend/tests/type_declarations/typed_properties_099.phpt new file mode 100644 index 00000000000..1e450ce8185 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_099.phpt @@ -0,0 +1,20 @@ +--TEST-- +Check that iterating a typed property by reference adds a type source +--FILE-- +ary as &$value) {} +var_dump($test); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["ary"]=> + array(0) { + } +} diff --git a/Zend/tests/type_declarations/typed_properties_100.phpt b/Zend/tests/type_declarations/typed_properties_100.phpt new file mode 100644 index 00000000000..8ee3deb0f7e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_100.phpt @@ -0,0 +1,19 @@ +--TEST-- +Property type not enforced for __get if the property is not visible +--FILE-- +prop); + +?> +--EXPECT-- +string(6) "foobar" diff --git a/Zend/tests/type_declarations/typed_properties_101.phpt b/Zend/tests/type_declarations/typed_properties_101.phpt new file mode 100644 index 00000000000..3c5a15fe40e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_101.phpt @@ -0,0 +1,37 @@ +--TEST-- +Dumping of uninitialized typed properties (including private ones) +--FILE-- +dump(); + +?> +--EXPECTF-- +object(Test)#1 (0) { + ["public"]=> + uninitialized(bool) + ["protected":protected]=> + uninitialized(float) + ["private":"Test":private]=> + uninitialized(string) +} +object(Test)#1 (0) refcount(%d){ + ["public"]=> + uninitialized(bool) + ["protected":protected]=> + uninitialized(float) + ["private":"Test":private]=> + uninitialized(string) +} diff --git a/Zend/tests/type_declarations/typed_properties_102.phpt b/Zend/tests/type_declarations/typed_properties_102.phpt new file mode 100644 index 00000000000..83f3c26186f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_102.phpt @@ -0,0 +1,22 @@ +--TEST-- +Compound assignment operator on static property holding ref +--FILE-- +getMessage(), "\n"; +} +var_dump(Test::$prop, Test::$intProp); +?> +--EXPECT-- +Cannot assign string to reference held by property Test::$intProp of type int +int(123) +int(123) diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt new file mode 100644 index 00000000000..54619c23b71 --- /dev/null +++ b/Zend/tests/type_declarations/types_in_ast.phpt @@ -0,0 +1,23 @@ +--TEST-- +AST pretty-printer +--INI-- +zend.assertions=1 +assert.exception=0 +--FILE-- + +--EXPECTF-- +Warning: assert(): assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int { + $x = new class { + public $a; + public int $b; + public ?int $c; + }; +})) failed in %stypes_in_ast.php on line 2 diff --git a/Zend/zend.c b/Zend/zend.c index 3143217b8d0..3619a7808d2 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -950,6 +950,28 @@ void zend_register_standard_ini_entries(void) /* {{{ */ } /* }}} */ +static void zend_resolve_property_types(void) /* {{{ */ +{ + zend_class_entry *ce; + zend_property_info *prop_info; + + ZEND_HASH_FOREACH_PTR(CG(class_table), ce) { + if (UNEXPECTED(ce->type == ZEND_INTERNAL_CLASS && ZEND_CLASS_HAS_TYPE_HINTS(ce))) { + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { + if (ZEND_TYPE_IS_NAME(prop_info->type)) { + zend_string *type_name = zend_string_tolower(ZEND_TYPE_NAME(prop_info->type)); + zend_class_entry *prop_ce = zend_hash_find_ptr(CG(class_table), type_name); + + ZEND_ASSERT(prop_ce && prop_ce->type == ZEND_INTERNAL_CLASS); + prop_info->type = ZEND_TYPE_ENCODE_CE(prop_ce, ZEND_TYPE_ALLOW_NULL(prop_info->type)); + zend_string_release(type_name); + } + } ZEND_HASH_FOREACH_END(); + } + } ZEND_HASH_FOREACH_END(); +} +/* }}} */ + /* Unlink the global (r/o) copies of the class, function and constant tables, * and use a fresh r/w copy for the startup thread */ @@ -971,6 +993,8 @@ int zend_post_startup(void) /* {{{ */ } } + zend_resolve_property_types(); + #ifdef ZTS *GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table; *GLOBAL_CLASS_TABLE = *compiler_globals->class_table; diff --git a/Zend/zend.h b/Zend/zend.h index aadda0c3cc8..5918691c279 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -133,6 +133,8 @@ struct _zend_class_entry { HashTable properties_info; HashTable constants_table; + struct _zend_property_info **properties_info_table; + zend_function *constructor; zend_function *destructor; zend_function *clone; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 02b89be61b1..3154f4808f2 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1173,7 +1173,21 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ val = (zval*)((char*)class_type->default_properties_table + prop_info->offset - OBJ_PROP_TO_OFFSET(0)); } if (Z_TYPE_P(val) == IS_CONSTANT_AST) { - if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { + if (prop_info->type) { + zval tmp; + + ZVAL_COPY(&tmp, val); + if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { + return FAILURE; + } + /* property initializers must always be evaluated with strict types */; + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, /* strict */ 1))) { + zval_ptr_dtor(&tmp); + return FAILURE; + } + zval_ptr_dtor(val); + ZVAL_COPY_VALUE(val, &tmp); + } else if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { return FAILURE; } } @@ -1234,7 +1248,18 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti property_info && (property_info->flags & ZEND_ACC_STATIC) == 0) { zval *slot = OBJ_PROP(object, property_info->offset); - ZVAL_COPY_VALUE(slot, prop); + + if (UNEXPECTED(property_info->type)) { + zval tmp; + + ZVAL_COPY_VALUE(&tmp, prop); + if (UNEXPECTED(!zend_verify_property_type(property_info, &tmp, 0))) { + continue; + } + ZVAL_COPY_VALUE(slot, &tmp); + } else { + ZVAL_COPY_VALUE(slot, prop); + } ZVAL_INDIRECT(prop, slot); } } ZEND_HASH_FOREACH_END(); @@ -2632,6 +2657,7 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *cla if (parent_ce) { zend_do_inheritance(register_class, parent_ce); + zend_build_properties_info_table(register_class); } return register_class; } @@ -3556,10 +3582,14 @@ static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */ return Z_STR_P(zv); } -ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */ +ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type) /* {{{ */ { zend_property_info *property_info, *property_info_ptr; + if (ZEND_TYPE_IS_SET(type)) { + ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; + } + if (ce->type == ZEND_INTERNAL_CLASS) { property_info = pemalloc(sizeof(zend_property_info), 1); } else { @@ -3602,10 +3632,20 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z property_info->offset = property_info_ptr->offset; zval_ptr_dtor(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]); zend_hash_del(&ce->properties_info, name); + + ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS); + ZEND_ASSERT(ce->properties_info_table != NULL); + ce->properties_info_table[OBJ_PROP_TO_NUM(property_info->offset)] = property_info; } else { property_info->offset = OBJ_PROP_TO_OFFSET(ce->default_properties_count); ce->default_properties_count++; ce->default_properties_table = perealloc(ce->default_properties_table, sizeof(zval) * ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS); + + /* For user classes this is handled during linking */ + if (ce->type == ZEND_INTERNAL_CLASS) { + ce->properties_info_table = perealloc(ce->properties_info_table, sizeof(zend_property_info *) * ce->default_properties_count, 1); + ce->properties_info_table[ce->default_properties_count - 1] = property_info; + } } ZVAL_COPY_VALUE(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)], property); } @@ -3637,12 +3677,20 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z property_info->flags = access_type; property_info->doc_comment = doc_comment; property_info->ce = ce; + property_info->type = type; + zend_hash_update_ptr(&ce->properties_info, name, property_info); return SUCCESS; } /* }}} */ +ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */ +{ + return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0); +} +/* }}} */ + ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type) /* {{{ */ { zend_string *key = zend_string_init(name, name_length, ce->type & ZEND_INTERNAL_CLASS); @@ -3926,25 +3974,30 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string *name, zval *value) /* {{{ */ { - zval *property; + zval *property, tmp; + zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, name, 0); + property = zend_std_get_static_property_with_info(scope, name, BP_VAR_W, &prop_info); EG(fake_scope) = old_scope; if (!property) { return FAILURE; } - if (property != value) { - zval garbage; - ZVAL_DEREF(property); - ZVAL_DEREF(value); - ZVAL_COPY_VALUE(&garbage, property); - ZVAL_COPY(property, value); - zval_ptr_dtor(&garbage); + ZEND_ASSERT(!Z_ISREF_P(value)); + Z_TRY_ADDREF_P(value); + if (prop_info->type) { + ZVAL_COPY_VALUE(&tmp, value); + if (!zend_verify_property_type(prop_info, &tmp, /* strict */ 0)) { + Z_TRY_DELREF_P(value); + return FAILURE; + } + value = &tmp; } + + zend_assign_to_variable(property, value, IS_TMP_VAR, /* strict */ 0); return SUCCESS; } /* }}} */ @@ -4047,7 +4100,7 @@ ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, name, silent); + property = zend_std_get_static_property(scope, name, silent ? BP_VAR_IS : BP_VAR_R); EG(fake_scope) = old_scope; return property; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 2357a1a49d9..27fc6cb011d 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -309,6 +309,9 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint32_t check_flags, zend_s ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name); ZEND_API const char *zend_get_module_version(const char *module_name); ZEND_API int zend_get_module_started(const char *module_name); + +ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type); + ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment); ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type); ZEND_API int zend_declare_property_null(zend_class_entry *ce, const char *name, size_t name_length, int access_type); @@ -653,6 +656,134 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D +/* May modify arg in-place. Will free arg in failure case (and take ownership in success case). + * Prefer using the ZEND_TRY_ASSIGN_* macros over these APIs. */ +static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool strict) { + if (EXPECTED(Z_ISREF_P(zv))) { + zend_reference *ref = Z_REF_P(zv); + zv = Z_REFVAL_P(zv); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref)) && + UNEXPECTED(!zend_verify_ref_assignable_zval(ref, arg, strict)) + ) { + zval_ptr_dtor(arg); + return FAILURE; + } + } + + zval_ptr_dtor(zv); + ZVAL_COPY_VALUE(zv, arg); + return SUCCESS; +} + +static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { + return zend_try_assign_ex(zv, arg, ZEND_ARG_USES_STRICT_TYPES()); +} + +#define ZEND_TRY_ASSIGN_NULL(zv) do { \ + zval _zv; \ + ZVAL_NULL(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_FALSE(zv) do { \ + zval _zv; \ + ZVAL_FALSE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_TRUE(zv) do { \ + zval _zv; \ + ZVAL_TRUE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ + zval _zv; \ + ZVAL_LONG(&_zv, lval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) do { \ + zval _zv; \ + ZVAL_DOUBLE(&_zv, dval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) do { \ + zval _zv; \ + ZVAL_EMPTY_STRING(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STR(zv, str) do { \ + zval _zv; \ + ZVAL_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) do { \ + zval _zv; \ + ZVAL_NEW_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ + zval _zv; \ + ZVAL_STRING(&_zv, string); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) do { \ + zval _zv; \ + ZVAL_STRINGL(&_zv, string, len); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_RES(zv, res) do { \ + zval _zv; \ + ZVAL_RES(&_zv, res); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict) do { \ + zval _zv; \ + ZVAL_COPY_VALUE(&_zv, other_zv); \ + zend_try_assign_ex(zv, &_zv, strict); \ +} while (0) + +#define ZEND_TRY_ASSIGN_COPY_EX(zv, other_zv, strict) do { \ + zval _zv; \ + ZVAL_COPY(&_zv, other_zv); \ + zend_try_assign_ex(zv, &_zv, strict); \ +} while (0) + +#define ZEND_TRY_ASSIGN_VALUE(zv, other_zv) \ + ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, ZEND_ARG_USES_STRICT_TYPES()) +#define ZEND_TRY_ASSIGN_COPY(zv, other_zv) \ + ZEND_TRY_ASSIGN_COPY_EX(zv, other_zv, ZEND_ARG_USES_STRICT_TYPES()) + +/* Initializes a reference to an empty array and returns dereferenced zval, + * or NULL if the initialization failed. */ +static zend_always_inline zval *zend_try_array_init(zval *zv) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(0)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + +static zend_always_inline zval *zend_try_array_init_size(zval *zv, size_t size) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(size)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 08fde1d1b09..8ddf8ea9abc 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1442,7 +1442,10 @@ simple_list: zend_ast_export_var_list(str, (zend_ast_list*)ast, indent); smart_str_appendc(str, ')'); break; - case ZEND_AST_PROP_DECL: + case ZEND_AST_PROP_GROUP: { + zend_ast *type_ast = ast->child[0]; + zend_ast *prop_ast = ast->child[1]; + if (ast->attr & ZEND_ACC_PUBLIC) { smart_str_appends(str, "public "); } else if (ast->attr & ZEND_ACC_PROTECTED) { @@ -1453,7 +1456,20 @@ simple_list: if (ast->attr & ZEND_ACC_STATIC) { smart_str_appends(str, "static "); } + + if (type_ast) { + if (type_ast->attr & ZEND_TYPE_NULLABLE) { + smart_str_appendc(str, '?'); + } + zend_ast_export_ns_name( + str, type_ast, 0, indent); + smart_str_appendc(str, ' '); + } + + ast = prop_ast; goto simple_list; + } + case ZEND_AST_CONST_DECL: case ZEND_AST_CLASS_CONST_DECL: smart_str_appends(str, "const "); diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 008d5b19ebc..9600b801ca0 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -135,6 +135,7 @@ enum _zend_ast_kind { ZEND_AST_USE_ELEM, ZEND_AST_TRAIT_ALIAS, ZEND_AST_GROUP_USE, + ZEND_AST_PROP_GROUP, /* 3 child nodes */ ZEND_AST_METHOD_CALL = 3 << ZEND_AST_NUM_CHILDREN_SHIFT, diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 12aec3916e8..c3dbf145e99 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -325,10 +325,10 @@ ZEND_METHOD(Closure, fromCallable) if (success == FAILURE || error) { if (error) { - zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable: %s", error); + zend_type_error("Failed to create closure from callable: %s", error); efree(error); } else { - zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable"); + zend_type_error("Failed to create closure from callable"); } } } @@ -406,9 +406,10 @@ static zval *zend_closure_read_property(zval *object, zval *member, int type, vo } /* }}} */ -static void zend_closure_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *zend_closure_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { ZEND_CLOSURE_PROPERTY_ERROR(); + return value; } /* }}} */ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c5c9f1f4754..7210cb4babb 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -62,20 +62,15 @@ typedef struct _zend_loop_var { } u; } zend_loop_var; -static inline uint32_t zend_alloc_cache_slot(void) { +static inline uint32_t zend_alloc_cache_slots(unsigned count) { zend_op_array *op_array = CG(active_op_array); uint32_t ret = op_array->cache_size; - op_array->cache_size += sizeof(void*); + op_array->cache_size += count * sizeof(void*); return ret; } -#define POLYMORPHIC_CACHE_SLOT_SIZE 2 - -static inline uint32_t zend_alloc_polymorphic_cache_slot(void) { - zend_op_array *op_array = CG(active_op_array); - uint32_t ret = op_array->cache_size; - op_array->cache_size += POLYMORPHIC_CACHE_SLOT_SIZE * sizeof(void*); - return ret; +static inline uint32_t zend_alloc_cache_slot(void) { + return zend_alloc_cache_slots(1); } ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type); @@ -1605,6 +1600,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify ce->default_properties_count = 0; ce->default_static_members_count = 0; + ce->properties_info_table = NULL; if (nullify_handlers) { ce->constructor = NULL; @@ -2475,7 +2471,7 @@ static zend_bool is_this_fetch(zend_ast *ast) /* {{{ */ } /* }}} */ -static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ +static zend_op *zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ { if (is_this_fetch(ast)) { zend_op *opline = zend_emit_op(result, ZEND_FETCH_THIS, NULL, NULL); @@ -2483,9 +2479,11 @@ static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, opline->result_type = IS_TMP_VAR; result->op_type = IS_TMP_VAR; } + return opline; } else if (zend_try_compile_cv(result, ast) == FAILURE) { - zend_compile_simple_var_no_cv(result, ast, type, delayed); + return zend_compile_simple_var_no_cv(result, ast, type, delayed); } + return NULL; } /* }}} */ @@ -2503,7 +2501,7 @@ static void zend_separate_if_call_and_write(znode *node, zend_ast *ast, uint32_t } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type); +zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref); void zend_compile_assign(znode *result, zend_ast *ast); static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */ @@ -2524,7 +2522,11 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t znode var_node, dim_node; - zend_delayed_compile_var(&var_node, var_ast, type); + opline = zend_delayed_compile_var(&var_node, var_ast, type, 0); + if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { + opline->extended_value |= ZEND_FETCH_DIM_WRITE; + } + zend_separate_if_call_and_write(&var_node, var_ast, type); if (dim_ast == NULL) { @@ -2568,7 +2570,11 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t if (is_this_fetch(obj_ast)) { obj_node.op_type = IS_UNUSED; } else { - zend_delayed_compile_var(&obj_node, obj_ast, type); + opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0); + if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { + opline->extended_value |= ZEND_FETCH_OBJ_WRITE; + } + zend_separate_if_call_and_write(&obj_node, obj_ast, type); } zend_compile_expr(&prop_node, prop_ast); @@ -2576,7 +2582,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t opline = zend_delayed_emit_op(result, ZEND_FETCH_OBJ_R, &obj_node, &prop_node); if (opline->op2_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op2)); - opline->extended_value = zend_alloc_polymorphic_cache_slot(); + opline->extended_value = zend_alloc_cache_slots(3); } zend_adjust_for_fetch_type(opline, result, type); @@ -2584,15 +2590,18 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t } /* }}} */ -static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { uint32_t offset = zend_delayed_compile_begin(); - zend_delayed_compile_prop(result, ast, type); + zend_op *opline = zend_delayed_compile_prop(result, ast, type); + if (by_ref) { /* shared with cache_slot */ + opline->extended_value |= ZEND_FETCH_REF; + } return zend_delayed_compile_end(offset); } /* }}} */ -zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ +zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref, int delayed) /* {{{ */ { zend_ast *class_ast = ast->child[0]; zend_ast *prop_ast = ast->child[1]; @@ -2611,7 +2620,7 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i } if (opline->op1_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op1)); - opline->extended_value = zend_alloc_polymorphic_cache_slot(); + opline->extended_value = zend_alloc_cache_slots(3); } if (class_node.op_type == IS_CONST) { opline->op2_type = IS_CONST; @@ -2624,6 +2633,10 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i SET_NODE(opline->op2, &class_node); } + if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ + opline->extended_value |= ZEND_FETCH_REF; + } + zend_adjust_for_fetch_type(opline, result, type); return opline; } @@ -2854,13 +2867,22 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ switch (var_ast->kind) { case ZEND_AST_VAR: - case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); + zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W, 0); zend_compile_expr(&expr_node, expr_ast); zend_delayed_compile_end(offset); zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); return; + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(result, var_ast, BP_VAR_W, 0); + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_delayed_compile_end(offset); + opline->opcode = ZEND_ASSIGN_STATIC_PROP; + + zend_emit_op_data(&expr_node); + return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); zend_delayed_compile_dim(result, var_ast, BP_VAR_W); @@ -2901,7 +2923,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ "Cannot assign reference to non referencable value"); } - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); /* MAKE_REF is usually not necessary for CVs. However, if there are * self-assignments, this forces the RHS to evaluate first. */ if (expr_node.op_type != IS_CV @@ -2945,8 +2967,8 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(target_ast); offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W); - zend_compile_var(&source_node, source_ast, BP_VAR_W); + zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1); + zend_compile_var(&source_node, source_ast, BP_VAR_W, 1); if ((target_ast->kind != ZEND_AST_VAR || target_ast->child[0]->kind != ZEND_AST_ZVAL) @@ -2960,16 +2982,33 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_emit_op(&source_node, ZEND_MAKE_REF, &source_node, NULL); } - zend_delayed_compile_end(offset); + opline = zend_delayed_compile_end(offset); if (source_node.op_type != IS_VAR && zend_is_call(source_ast)) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use result of built-in function in write context"); } - opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { + opline->opcode = ZEND_ASSIGN_OBJ_REF; + opline->extended_value &= ~ZEND_FETCH_REF; + zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } + } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { + opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; + opline->extended_value &= ~ZEND_FETCH_REF; + zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } + } else { + opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline->extended_value = 0; + } if (zend_is_call(source_ast)) { - opline->extended_value = ZEND_RETURNS_FUNCTION; + opline->extended_value |= ZEND_RETURNS_FUNCTION; } } /* }}} */ @@ -2996,13 +3035,25 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ switch (var_ast->kind) { case ZEND_AST_VAR: - case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW); + zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW, 0); zend_compile_expr(&expr_node, expr_ast); zend_delayed_compile_end(offset); zend_emit_op(result, opcode, &var_node, &expr_node); return; + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(result, var_ast, BP_VAR_RW, 0); + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_delayed_compile_end(offset); + cache_slot = opline->extended_value; + opline->opcode = opcode; + opline->extended_value = ZEND_ASSIGN_STATIC_PROP; + + opline = zend_emit_op_data(&expr_node); + opline->extended_value = cache_slot; + return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); zend_delayed_compile_dim(result, var_ast, BP_VAR_RW); @@ -3012,7 +3063,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = opcode; opline->extended_value = ZEND_ASSIGN_DIM; - opline = zend_emit_op_data(&expr_node); + zend_emit_op_data(&expr_node); return; case ZEND_AST_PROP: offset = zend_delayed_compile_begin(); @@ -3066,7 +3117,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ arg_count++; if (zend_is_variable(arg)) { if (zend_is_call(arg)) { - zend_compile_var(&arg_node, arg, BP_VAR_R); + zend_compile_var(&arg_node, arg, BP_VAR_R, 0); if (arg_node.op_type & (IS_CONST|IS_TMP_VAR)) { /* Function call was converted into builtin instruction */ opcode = ZEND_SEND_VAL; @@ -3085,10 +3136,10 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ } } else if (fbc) { if (ARG_SHOULD_BE_SENT_BY_REF(fbc, arg_num)) { - zend_compile_var(&arg_node, arg, BP_VAR_W); + zend_compile_var(&arg_node, arg, BP_VAR_W, 1); opcode = ZEND_SEND_REF; } else { - zend_compile_var(&arg_node, arg, BP_VAR_R); + zend_compile_var(&arg_node, arg, BP_VAR_R, 0); opcode = (arg_node.op_type == IS_TMP_VAR) ? ZEND_SEND_VAL : ZEND_SEND_VAR; } } else { @@ -3106,7 +3157,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ } opline = zend_emit_op(NULL, ZEND_CHECK_FUNC_ARG, NULL, NULL); opline->op2.num = arg_num; - zend_compile_var(&arg_node, arg, BP_VAR_FUNC_ARG); + zend_compile_var(&arg_node, arg, BP_VAR_FUNC_ARG, 1); opcode = ZEND_SEND_FUNC_ARG; } while (0); } @@ -3250,7 +3301,7 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a opline->op2_type = IS_CONST; opline->op2.constant = zend_add_func_name_literal(method); /* 2 slots, for class and method */ - opline->result.num = zend_alloc_polymorphic_cache_slot(); + opline->result.num = zend_alloc_cache_slots(2); zval_ptr_dtor(&name_node->u.constant); } else { zend_op *opline = get_next_op(); @@ -3980,7 +4031,7 @@ void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type) /* {{ opline->op2_type = IS_CONST; opline->op2.constant = zend_add_func_name_literal( Z_STR(method_node.u.constant)); - opline->result.num = zend_alloc_polymorphic_cache_slot(); + opline->result.num = zend_alloc_cache_slots(2); } else { SET_NODE(opline->op2, &method_node); } @@ -4041,7 +4092,7 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{ opline->op2_type = IS_CONST; opline->op2.constant = zend_add_func_name_literal( Z_STR(method_node.u.constant)); - opline->result.num = zend_alloc_polymorphic_cache_slot(); + opline->result.num = zend_alloc_cache_slots(2); } else { if (opline->op1_type == IS_CONST) { opline->result.num = zend_alloc_cache_slot(); @@ -4239,11 +4290,11 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */ opline->opcode = ZEND_UNSET_DIM; return; case ZEND_AST_PROP: - opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET); + opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET, 0); opline->opcode = ZEND_UNSET_OBJ; return; case ZEND_AST_STATIC_PROP: - opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0); + opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0, 0); opline->opcode = ZEND_UNSET_STATIC_PROP; return; EMPTY_SWITCH_DEFAULT_CASE() @@ -4356,7 +4407,7 @@ void zend_compile_return(zend_ast *ast) /* {{{ */ expr_node.op_type = IS_CONST; ZVAL_NULL(&expr_node.u.constant); } else if (by_ref && zend_is_variable(expr_ast) && !zend_is_call(expr_ast)) { - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); } else { zend_compile_expr(&expr_node, expr_ast); } @@ -4714,7 +4765,7 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */ } if (by_ref && is_variable) { - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); } else { zend_compile_expr(&expr_node, expr_ast); } @@ -5979,10 +6030,9 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* } /* }}} */ -void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ +void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); - uint32_t flags = list->attr; zend_class_entry *ce = CG(active_class_entry); uint32_t i, children = list->children; @@ -6002,6 +6052,19 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast)); zend_string *doc_comment = NULL; zval value_zv; + zend_type type = 0; + + if (type_ast) { + type = zend_compile_typename(type_ast, 0); + + if (ZEND_TYPE_CODE(type) == IS_VOID || ZEND_TYPE_CODE(type) == IS_CALLABLE) { + zend_error_noreturn(E_COMPILE_ERROR, + "Property %s::$%s cannot have type %s", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(ZEND_TYPE_CODE(type))); + } + } /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ if (doc_comment_ast) { @@ -6021,15 +6084,58 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ if (value_ast) { zend_const_expr_to_zval(&value_zv, value_ast); - } else { + + if (ZEND_TYPE_IS_SET(type) && !Z_CONSTANT(value_zv)) { + if (Z_TYPE(value_zv) == IS_NULL) { + if (!ZEND_TYPE_ALLOW_NULL(type)) { + const char *name = ZEND_TYPE_IS_CLASS(type) + ? ZSTR_VAL(ZEND_TYPE_NAME(type)) : zend_get_type_by_const(ZEND_TYPE_CODE(type)); + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type %s may not be null. " + "Use the nullable type ?%s to allow null default value", + name, name); + } + } else if (ZEND_TYPE_IS_CLASS(type)) { + zend_error_noreturn(E_COMPILE_ERROR, + "Property of type %s may not have default value", ZSTR_VAL(ZEND_TYPE_NAME(type))); + } else if (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE) { + if (Z_TYPE(value_zv) != IS_ARRAY) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type %s can only be an array", + zend_get_type_by_const(ZEND_TYPE_CODE(type))); + } + } else if (ZEND_TYPE_CODE(type) == IS_DOUBLE) { + if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type float can only be float or int"); + } + } else if (!ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(type), Z_TYPE(value_zv))) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type %s can only be %s", + zend_get_type_by_const(ZEND_TYPE_CODE(type)), + zend_get_type_by_const(ZEND_TYPE_CODE(type))); + } + } + } else if (!ZEND_TYPE_IS_SET(type)) { ZVAL_NULL(&value_zv); + } else { + ZVAL_UNDEF(&value_zv); } - zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, type); } } /* }}} */ +void zend_compile_prop_group(zend_ast *list) /* {{{ */ +{ + zend_ast *type_ast = list->child[0]; + zend_ast *prop_ast = list->child[1]; + + zend_compile_prop_decl(prop_ast, type_ast, list->attr); +} +/* }}} */ + void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); @@ -6378,6 +6484,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ CG(zend_lineno) = decl->end_lineno; ce->ce_flags |= ZEND_ACC_LINKED; zend_do_inheritance(ce, parent_ce); + zend_build_properties_info_table(ce); if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } @@ -6389,6 +6496,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ } else { if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) { zend_string_release(lcname); + zend_build_properties_info_table(ce); ce->ce_flags |= ZEND_ACC_LINKED; return; } @@ -7192,12 +7300,16 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW); + zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_OBJ : ZEND_POST_DEC_OBJ; zend_make_tmp_result(result, opline); + } else if (var_ast->kind == ZEND_AST_STATIC_PROP) { + zend_op *opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_RW, 0, 0); + opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_STATIC_PROP : ZEND_POST_DEC_STATIC_PROP; + zend_make_tmp_result(result, opline); } else { znode var_node; - zend_compile_var(&var_node, var_ast, BP_VAR_RW); + zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); zend_emit_op_tmp(result, ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC : ZEND_POST_DEC, &var_node, NULL); } @@ -7212,11 +7324,14 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW); + zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ; + } else if (var_ast->kind == ZEND_AST_STATIC_PROP) { + zend_op *opline = zend_compile_static_prop(result, var_ast, BP_VAR_RW, 0, 0); + opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_STATIC_PROP : ZEND_PRE_DEC_STATIC_PROP; } else { znode var_node; - zend_compile_var(&var_node, var_ast, BP_VAR_RW); + zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); zend_emit_op(result, ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC, &var_node, NULL); } @@ -7310,7 +7425,7 @@ void zend_compile_coalesce(znode *result, zend_ast *ast) /* {{{ */ zend_op *opline; uint32_t opnum; - zend_compile_var(&expr_node, expr_ast, BP_VAR_IS); + zend_compile_var(&expr_node, expr_ast, BP_VAR_IS, 0); opnum = get_next_op_number(); zend_emit_op_tmp(result, ZEND_COALESCE, &expr_node, NULL); @@ -7377,7 +7492,7 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ if (value_ast) { if (returns_by_ref && zend_is_variable(value_ast) && !zend_is_call(value_ast)) { - zend_compile_var(&value_node, value_ast, BP_VAR_W); + zend_compile_var(&value_node, value_ast, BP_VAR_W, 1); } else { zend_compile_expr(&value_node, value_ast); } @@ -7495,11 +7610,11 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ; break; case ZEND_AST_PROP: - opline = zend_compile_prop(result, var_ast, BP_VAR_IS); + opline = zend_compile_prop(result, var_ast, BP_VAR_IS, 0); opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ; break; case ZEND_AST_STATIC_PROP: - opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0); + opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0, 0); opline->opcode = ZEND_ISSET_ISEMPTY_STATIC_PROP; break; EMPTY_SWITCH_DEFAULT_CASE() @@ -7593,7 +7708,7 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */ if (by_ref) { zend_ensure_writable_variable(value_ast); - zend_compile_var(&value_node, value_ast, BP_VAR_W); + zend_compile_var(&value_node, value_ast, BP_VAR_W, 1); } else { zend_compile_expr(&value_node, value_ast); } @@ -7709,7 +7824,7 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */ zend_set_class_name_op1(opline, &class_node); - opline->extended_value = zend_alloc_polymorphic_cache_slot(); + opline->extended_value = zend_alloc_cache_slots(2); } /* }}} */ @@ -8146,8 +8261,8 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */ case ZEND_AST_METHOD: zend_compile_func_decl(NULL, ast, 0); break; - case ZEND_AST_PROP_DECL: - zend_compile_prop_decl(ast); + case ZEND_AST_PROP_GROUP: + zend_compile_prop_group(ast); break; case ZEND_AST_CLASS_CONST_DECL: zend_compile_class_const_decl(ast); @@ -8207,7 +8322,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ case ZEND_AST_CALL: case ZEND_AST_METHOD_CALL: case ZEND_AST_STATIC_CALL: - zend_compile_var(result, ast, BP_VAR_R); + zend_compile_var(result, ast, BP_VAR_R, 0); return; case ZEND_AST_ASSIGN: zend_compile_assign(result, ast); @@ -8314,35 +8429,31 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { CG(zend_lineno) = zend_ast_get_lineno(ast); switch (ast->kind) { case ZEND_AST_VAR: - zend_compile_simple_var(result, ast, type, 0); - return; + return zend_compile_simple_var(result, ast, type, 0); case ZEND_AST_DIM: - zend_compile_dim(result, ast, type); - return; + return zend_compile_dim(result, ast, type); case ZEND_AST_PROP: - zend_compile_prop(result, ast, type); - return; + return zend_compile_prop(result, ast, type, by_ref); case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 0); - return; + return zend_compile_static_prop(result, ast, type, by_ref, 0); case ZEND_AST_CALL: zend_compile_call(result, ast, type); - return; + return NULL; case ZEND_AST_METHOD_CALL: zend_compile_method_call(result, ast, type); - return; + return NULL; case ZEND_AST_STATIC_CALL: zend_compile_static_call(result, ast, type); - return; + return NULL; case ZEND_AST_ZNODE: *result = *zend_ast_get_znode(ast); - return; + return NULL; default: if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { zend_error_noreturn(E_COMPILE_ERROR, @@ -8350,29 +8461,30 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ } zend_compile_expr(result, ast); - return; + return NULL; } } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */ { switch (ast->kind) { case ZEND_AST_VAR: - zend_compile_simple_var(result, ast, type, 1); - return; + return zend_compile_simple_var(result, ast, type, 1); case ZEND_AST_DIM: - zend_delayed_compile_dim(result, ast, type); - return; + return zend_delayed_compile_dim(result, ast, type); case ZEND_AST_PROP: - zend_delayed_compile_prop(result, ast, type); - return; + { + zend_op *opline = zend_delayed_compile_prop(result, ast, type); + if (by_ref) { + opline->extended_value |= ZEND_FETCH_REF; + } + return opline; + } case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 1); - return; + return zend_compile_static_prop(result, ast, type, by_ref, 1); default: - zend_compile_var(result, ast, type); - return; + return zend_compile_var(result, ast, type, 0); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 892a7af423e..07c8a1768f4 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -128,7 +128,7 @@ typedef union _zend_parser_stack_elem { void zend_compile_top_stmt(zend_ast *ast); void zend_compile_stmt(zend_ast *ast); void zend_compile_expr(znode *node, zend_ast *ast); -void zend_compile_var(znode *node, zend_ast *ast, uint32_t type); +zend_op *zend_compile_var(znode *node, zend_ast *ast, uint32_t type, int by_ref); void zend_eval_const_expr(zend_ast **ast_ptr); void zend_const_expr_to_zval(zval *result, zend_ast *ast); @@ -221,7 +221,7 @@ typedef struct _zend_oparray_context { #define ZEND_ACC_IMMUTABLE (1 << 7) /* X | X | | */ /* | | | */ /* Function has typed arguments / class has typed props | | | */ -#define ZEND_ACC_HAS_TYPE_HINTS (1 << 8) /* ? | X | | */ +#define ZEND_ACC_HAS_TYPE_HINTS (1 << 8) /* X | X | | */ /* | | | */ /* Top-level class or function declaration | | | */ #define ZEND_ACC_TOP_LEVEL (1 << 9) /* X | X | | */ @@ -334,6 +334,7 @@ typedef struct _zend_property_info { zend_string *name; zend_string *doc_comment; zend_class_entry *ce; + zend_type type; } zend_property_info; #define OBJ_PROP(obj, offset) \ @@ -796,6 +797,12 @@ ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_le zend_unmangle_property_name_ex(mangled_property, class_name, prop_name, NULL) ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len); +static zend_always_inline const char *zend_get_unmangled_property_name(const zend_string *mangled_prop) { + const char *class_name, *prop_name; + zend_unmangle_property_name(mangled_prop, &class_name, &prop_name); + return prop_name; +} + #define ZEND_FUNCTION_DTOR zend_function_dtor #define ZEND_CLASS_DTOR destroy_zend_class @@ -891,6 +898,12 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe +/* Only one of these can ever be in use */ +#define ZEND_FETCH_REF 1 +#define ZEND_FETCH_DIM_WRITE 2 +#define ZEND_FETCH_OBJ_WRITE 3 +#define ZEND_FETCH_OBJ_FLAGS 3 + #define ZEND_ISEMPTY (1<<0) #define ZEND_LAST_CATCH (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4f334c6b860..363812e01ff 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -626,7 +626,7 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 0; } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); @@ -634,16 +634,63 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 1; } +static void zend_format_type(zend_type type, const char **part1, const char **part2) { + *part1 = ZEND_TYPE_ALLOW_NULL(type) ? "?" : ""; + if (ZEND_TYPE_IS_CLASS(type)) { + if (ZEND_TYPE_IS_CE(type)) { + *part2 = ZSTR_VAL(ZEND_TYPE_CE(type)->name); + } else { + *part2 = ZSTR_VAL(ZEND_TYPE_NAME(type)); + } + } else { + *part2 = zend_get_type_by_const(ZEND_TYPE_CODE(type)); + } +} + +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error( + "Cannot auto-initialize an %s inside property %s::$%s of type %s%s", + type, + ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_property_info *prop, const char *type) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error( + "Cannot auto-initialize an %s inside a reference held by property %s::$%s of type %s%s", + type, + ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + +static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_error( + zend_property_info *prop) { + zend_throw_error(NULL, + "Cannot access uninitialized non-nullable property %s::$%s by reference", + ZSTR_VAL(prop->ce->name), + zend_get_unmangled_property_name(prop->name)); +} + +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref); + /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_object *obj; + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); @@ -661,8 +708,21 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); + if (RETURN_VALUE_USED(opline)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } + } + + zval_ptr_dtor_nogc(object); object_init(object); Z_ADDREF_P(object); obj = Z_OBJ_P(object); @@ -673,29 +733,42 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; } Z_DELREF_P(object); - return 1; + return object; } -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) +static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) { - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } + + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name)); zend_tmp_string_release(tmp_property_name); } - return 0; + return NULL; } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); + return NULL; + } + } + + zval_ptr_dtor_nogc(object); object_init(object); - return 1; + return object; } static ZEND_COLD void zend_verify_type_error_common( @@ -875,17 +948,125 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z return zend_verify_weak_scalar_type_hint(type_hint, arg); } +ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zval *property) +{ + const char *prop_type1, *prop_type2; + + /* we _may_ land here in case reading already errored and runtime cache thus has not been updated (i.e. it contains a valid but unrelated info) */ + if (EG(exception)) { + return; + } + + // TODO Switch to a more standard error message? + zend_format_type(info->type, &prop_type1, &prop_type2); + (void) prop_type1; + if (ZEND_TYPE_IS_CLASS(info->type)) { + zend_type_error("Typed property %s::$%s must be an instance of %s%s, %s used", + ZSTR_VAL(info->ce->name), + zend_get_unmangled_property_name(info->name), + prop_type2, + ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", + Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); + } else { + zend_type_error("Typed property %s::$%s must be %s%s, %s used", + ZSTR_VAL(info->ce->name), + zend_get_unmangled_property_name(info->name), + prop_type2, + ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", + Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); + } +} + +static zend_bool zend_resolve_class_type(zend_type *type, zend_class_entry *self_ce) { + zend_class_entry *ce; + zend_string *name = ZEND_TYPE_NAME(*type); + if (zend_string_equals_literal_ci(name, "self")) { + /* We need to explicitly check for this here, to avoid updating the type in the trait and + * later using the wrong "self" when the trait is used in a class. */ + if (UNEXPECTED((self_ce->ce_flags & ZEND_ACC_TRAIT) != 0)) { + zend_throw_error(NULL, "Cannot write a%s value to a 'self' typed static property of a trait", ZEND_TYPE_ALLOW_NULL(*type) ? " non-null" : ""); + return 0; + } + ce = self_ce; + } else if (zend_string_equals_literal_ci(name, "parent")) { + if (UNEXPECTED(!self_ce->parent)) { + zend_throw_error(NULL, "Cannot access parent:: when current class scope has no parent"); + return 0; + } + ce = self_ce->parent; + } else { + ce = zend_lookup_class(name); + if (UNEXPECTED(!ce)) { + return 0; + } + } + + zend_string_release(name); + *type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(*type)); + return 1; +} + + +static zend_always_inline zend_bool i_zend_check_property_type(zend_property_info *info, zval *property, zend_bool strict) +{ + ZEND_ASSERT(!Z_ISREF_P(property)); + if (ZEND_TYPE_IS_CLASS(info->type)) { + if (UNEXPECTED(Z_TYPE_P(property) != IS_OBJECT)) { + return Z_TYPE_P(property) == IS_NULL && ZEND_TYPE_ALLOW_NULL(info->type); + } + + if (UNEXPECTED(!ZEND_TYPE_IS_CE(info->type)) && UNEXPECTED(!zend_resolve_class_type(&info->type, info->ce))) { + return 0; + } + + return instanceof_function(Z_OBJCE_P(property), ZEND_TYPE_CE(info->type)); + } + + ZEND_ASSERT(ZEND_TYPE_CODE(info->type) != IS_CALLABLE); + if (EXPECTED(ZEND_TYPE_CODE(info->type) == Z_TYPE_P(property))) { + return 1; + } else if (EXPECTED(Z_TYPE_P(property) == IS_NULL)) { + return ZEND_TYPE_ALLOW_NULL(info->type); + } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { + return 1; + } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) { + return zend_is_iterable(property); + } else { + return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, strict); + } +} + +static zend_bool zend_always_inline i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) +{ + if (i_zend_check_property_type(info, property, strict)) { + return 1; + } + + zend_verify_property_type_error(info, property); + return 0; +} + +zend_bool zend_never_inline zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { + return i_zend_verify_property_type(info, property, strict); +} + static zend_always_inline zend_bool zend_check_type( zend_type type, zval *arg, zend_class_entry **ce, void **cache_slot, zval *default_value, zend_class_entry *scope, zend_bool is_return_type) { + zend_reference *ref = NULL; + if (!ZEND_TYPE_IS_SET(type)) { return 1; } - ZVAL_DEREF(arg); + if (UNEXPECTED(Z_ISREF_P(arg))) { + ref = Z_REF_P(arg); + arg = Z_REFVAL_P(arg); + } + if (ZEND_TYPE_IS_CLASS(type)) { if (EXPECTED(*cache_slot)) { *ce = (zend_class_entry *) *cache_slot; @@ -916,6 +1097,8 @@ static zend_always_inline zend_bool zend_check_type( } else if (ZEND_TYPE_CODE(type) == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { return 1; + } else if (ref && ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return 0; /* we cannot have conversions for typed refs */ } else { return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg, is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES()); @@ -1393,6 +1576,159 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } } +static zend_property_info *zend_get_prop_not_accepting_double(zend_reference *ref) +{ + zend_property_info *prop; + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_CODE(prop->type) != IS_DOUBLE) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +static ZEND_COLD void zend_throw_incdec_ref_error(zend_reference *ref, zend_bool inc) +{ + zend_property_info *error_prop = zend_get_prop_not_accepting_double(ref); + /* Currently there should be no way for a typed reference to accept both int and double. + * Generalize this and the related property code once this becomes possible. */ + ZEND_ASSERT(error_prop); + zend_type_error( + "Cannot %s a reference held by property %s::$%s of type %sint past its %simal value", + inc ? "increment" : "decrement", + ZSTR_VAL(error_prop->ce->name), + zend_get_unmangled_property_name(error_prop->name), + ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "", + inc ? "max" : "min"); +} + +static ZEND_COLD void zend_throw_incdec_prop_error(zend_property_info *prop, zend_bool inc) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot %s property %s::$%s of type %s%s past its %simal value", + inc ? "increment" : "decrement", + ZSTR_VAL(prop->ce->name), + zend_get_unmangled_property_name(prop->name), + prop_type1, prop_type2, + inc ? "max" : "min"); +} + +static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { + zend_throw_incdec_prop_error(prop_info, inc); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } else { + zend_reference *ref = NULL; + if (Z_ISREF_P(prop)) { + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(ref || prop_info)) { + zval z_copy; + ZVAL_COPY(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (prop_info) { + zend_throw_incdec_prop_error(prop_info, inc); + } else { + zend_throw_incdec_ref_error(ref, inc); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } +} + +static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(prop)); + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { + zend_throw_incdec_prop_error(prop_info, inc); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } else { + zend_reference *ref = NULL; + if (Z_ISREF_P(prop)) { + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } + prop = Z_REFVAL_P(prop); + } + + ZVAL_COPY(EX_VAR(opline->result.var), prop); + + if (UNEXPECTED(ref || prop_info)) { + zval z_copy; + ZVAL_COPY(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (prop_info) { + zend_throw_incdec_prop_error(prop_info, inc); + } else { + zend_throw_incdec_ref_error(ref, inc); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } +} + static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC) { zval rv, obj; @@ -1743,7 +2079,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_fetch_dimension_address_inner_ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *container, zval *dim, int dim_type, int type EXECUTE_DATA_DC) { - zval *retval; + zval *retval, *orig_container = container; if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { try_array: @@ -1821,8 +2157,14 @@ fetch_from_array: } if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { - array_init(container); - goto fetch_from_array; + zend_property_info *error_prop; + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + ZVAL_ERROR(result); + } else { + array_init(container); + goto fetch_from_array; + } } else { /* for read-mode only */ ZVAL_NULL(result); @@ -2150,21 +2492,151 @@ static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_slow(zval } } -static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type OPLINE_DC) +static zend_always_inline zend_bool promotes_to_array(zval *val) { + return Z_TYPE_P(val) <= IS_FALSE + || (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE); +} + +static zend_always_inline zend_bool promotes_to_object(zval *val) { + ZVAL_DEREF(val); + return Z_TYPE_P(val) <= IS_FALSE + || (Z_TYPE_P(val) == IS_STRING && Z_STRLEN_P(val) == 0); +} + +static zend_always_inline zend_bool check_type_array_assignable(zend_type type) { + if (!type) { + return 1; + } + return ZEND_TYPE_IS_CODE(type) + && (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE); +} + +static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type type) { + if (!type) { + return 1; + } + if (ZEND_TYPE_IS_CLASS(type)) { + if (ZEND_TYPE_IS_CE(type)) { + return ZEND_TYPE_CE(type) == zend_standard_class_def; + } else { + return zend_string_equals_literal_ci(ZEND_TYPE_NAME(type), "stdclass"); + } + } else { + return ZEND_TYPE_CODE(type) == IS_OBJECT; + } +} + +/* Checks whether an array can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_array_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +/* Checks whether an stdClass can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_stdClass_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { + return i_zend_check_ref_array_assignable(ref); +} + +static zend_always_inline zend_bool zend_need_to_handle_fetch_obj_flags(uint32_t flags, zval *ptr) { + return (flags == ZEND_FETCH_REF && Z_TYPE_P(ptr) != IS_REFERENCE) + || (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(ptr)) + || (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(ptr)); +} + +static zend_never_inline zend_bool zend_handle_fetch_obj_flags( + zval *result, zval *ptr, zend_property_info *prop_info, uint32_t flags) +{ + ZEND_ASSERT(prop_info && prop_info->type); + switch (flags) { + case ZEND_FETCH_DIM_WRITE: + if (!check_type_array_assignable(prop_info->type)) { + zend_throw_auto_init_in_prop_error(prop_info, "array"); + if (result) ZVAL_ERROR(result); + return 0; + } + break; + case ZEND_FETCH_OBJ_WRITE: + if (!check_type_stdClass_assignable(prop_info->type)) { + zend_throw_auto_init_in_prop_error(prop_info, "stdClass"); + if (result) ZVAL_ERROR(result); + return 0; + } + break; + case ZEND_FETCH_REF: + if (Z_TYPE_P(ptr) == IS_UNDEF) { + if (!ZEND_TYPE_ALLOW_NULL(prop_info->type)) { + zend_throw_access_uninit_prop_by_ref_error(prop_info); + if (result) ZVAL_ERROR(result); + return 0; + } + ZVAL_NULL(ptr); + } + + ZVAL_NEW_REF(ptr, ptr); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); + break; + EMPTY_SWITCH_DEFAULT_CASE() + } + return 1; +} + +static zend_always_inline zend_property_info *zend_object_fetch_property_type_info( + zend_object *obj, zval *slot) +{ + if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(obj->ce))) { + return NULL; + } + + /* Not a declared property */ + if (UNEXPECTED(slot < obj->properties_table || + slot >= obj->properties_table + obj->ce->default_properties_count)) { + return NULL; + } + + return zend_get_typed_property_info_for_slot(obj, slot); +} + +static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags, zend_bool init_undef OPLINE_DC) { zval *ptr; - if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { + + if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { do { - if (Z_ISREF_P(container)) { + if (Z_ISREF_P(container) && Z_TYPE_P(Z_REFVAL_P(container)) == IS_OBJECT) { container = Z_REFVAL_P(container); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { - break; - } + break; } /* this should modify object only if it's empty */ - if (type == BP_VAR_UNSET || - UNEXPECTED(!make_real_object_rw(container, prop_ptr OPLINE_CC))) { + if (type == BP_VAR_UNSET) { + return; + } + + container = make_real_object_rw(container, prop_ptr OPLINE_CC); + if (UNEXPECTED(!container)) { ZVAL_ERROR(result); return; } @@ -2174,12 +2646,16 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c EXPECTED(Z_OBJCE_P(container) == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(container); - zval *retval; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { - retval = OBJ_PROP(zobj, prop_offset); - if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { - ZVAL_INDIRECT(result, retval); + ptr = OBJ_PROP(zobj, prop_offset); + if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { + zend_property_info *prop_info; + ZVAL_INDIRECT(result, ptr); + if (flags && (prop_info = CACHED_PTR_EX(cache_slot + 2)) && + UNEXPECTED(zend_need_to_handle_fetch_obj_flags(flags, ptr))) { + zend_handle_fetch_obj_flags(result, ptr, prop_info, flags); + } return; } } else if (EXPECTED(zobj->properties != NULL)) { @@ -2189,24 +2665,378 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } zobj->properties = zend_array_dup(zobj->properties); } - retval = zend_hash_find_ex(zobj->properties, Z_STR_P(prop_ptr), 1); - if (EXPECTED(retval)) { - ZVAL_INDIRECT(result, retval); + ptr = zend_hash_find_ex(zobj->properties, Z_STR_P(prop_ptr), 1); + if (EXPECTED(ptr)) { + ZVAL_INDIRECT(result, ptr); return; } } } - ptr = Z_OBJ_HT_P(container)->get_property_ptr_ptr(container, prop_ptr, type, cache_slot); if (NULL == ptr) { ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result); - if (ptr != result) { - ZVAL_INDIRECT(result, ptr); - } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { - ZVAL_UNREF(ptr); + if (ptr == result) { + if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { + ZVAL_UNREF(ptr); + } + return; + } + } + + ZVAL_INDIRECT(result, ptr); + if (flags && UNEXPECTED(zend_need_to_handle_fetch_obj_flags(flags, ptr))) { + zend_property_info *prop_info = + zend_object_fetch_property_type_info(Z_OBJ_P(container), ptr); + if (prop_info && !zend_handle_fetch_obj_flags(result, ptr, prop_info, flags)) { + return; + } + } + if (init_undef && UNEXPECTED(Z_TYPE_P(ptr) == IS_UNDEF)) { + ZVAL_NULL(ptr); + } +} + +static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { + zend_free_op free_op1; + zend_string *name, *tmp_name; + zend_class_entry *ce; + zend_property_info *property_info; + + zend_uchar op1_type = opline->op1_type, op2_type = opline->op2_type; + + if (EXPECTED(op2_type == IS_CONST)) { + zval *class_name = RT_CONSTANT(opline, opline->op2); + + ZEND_ASSERT(op1_type != IS_CONST || CACHED_PTR(cache_slot) == NULL); + + if (EXPECTED((ce = CACHED_PTR(cache_slot)) == NULL)) { + ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); + if (UNEXPECTED(ce == NULL)) { + FREE_UNFETCHED_OP(op1_type, opline->op1.var); + return FAILURE; + } + if (UNEXPECTED(op1_type != IS_CONST)) { + CACHE_PTR(cache_slot, ce); + } } } else { - ZVAL_INDIRECT(result, ptr); + if (EXPECTED(op2_type == IS_UNUSED)) { + ce = zend_fetch_class(NULL, opline->op2.num); + if (UNEXPECTED(ce == NULL)) { + FREE_UNFETCHED_OP(op1_type, opline->op1.var); + return FAILURE; + } + } else { + ce = Z_CE_P(EX_VAR(opline->op2.var)); + } + if (EXPECTED(op1_type == IS_CONST) && EXPECTED(CACHED_PTR(cache_slot) == ce)) { + *retval = CACHED_PTR(cache_slot + sizeof(void *)); + *prop_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); + return SUCCESS; + } + } + + if (EXPECTED(op1_type == IS_CONST)) { + name = Z_STR_P(RT_CONSTANT(opline, opline->op1)); + } else { + zval *varname = get_zval_ptr_undef(opline->op1_type, opline->op1, &free_op1, BP_VAR_R); + if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { + name = Z_STR_P(varname); + tmp_name = NULL; + } else { + if (op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { + zval_undefined_cv(opline->op1.var EXECUTE_DATA_CC); + } + name = zval_get_tmp_string(varname, &tmp_name); + } + } + + *retval = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info); + + if (UNEXPECTED(op1_type != IS_CONST)) { + zend_tmp_string_release(tmp_name); + + if (op1_type != IS_CV) { + zval_ptr_dtor_nogc(free_op1); + } + } + + if (UNEXPECTED(*retval == NULL)) { + return FAILURE; + } + + *prop_info = property_info; + + if (EXPECTED(op1_type == IS_CONST)) { + CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval); + CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info); + } + + return SUCCESS; +} + + +static zend_always_inline int zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int flags OPLINE_DC EXECUTE_DATA_DC) { + int success; + zend_property_info *property_info; + + if (opline->op1_type == IS_CONST && (opline->op2_type == IS_CONST || (opline->op2_type == IS_UNUSED && (opline->op2.num == ZEND_FETCH_CLASS_SELF || opline->op2.num == ZEND_FETCH_CLASS_PARENT))) && EXPECTED(CACHED_PTR(cache_slot) != NULL)) { + *retval = CACHED_PTR(cache_slot + sizeof(void *)); + property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); + + if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) + && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + zend_get_unmangled_property_name(property_info->name)); + return FAILURE; + } + } else { + success = zend_fetch_static_property_address_ex(retval, &property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(success != SUCCESS)) { + return FAILURE; + } + } + + if (flags && property_info->type && zend_need_to_handle_fetch_obj_flags(flags, *retval)) { + zend_handle_fetch_obj_flags(NULL, *retval, property_info, flags); + } + + if (prop_info) { + *prop_info = property_info; + } + + return SUCCESS; +} + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2; + zend_format_type(prop1->type, &prop1_type1, &prop1_type2); + zend_format_type(prop2->type, &prop2_type1, &prop2_type2); + zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop1->ce->name), + zend_get_unmangled_property_name(prop1->name), + prop1_type1, prop1_type2, + ZSTR_VAL(prop2->ce->name), + zend_get_unmangled_property_name(prop2->name), + prop2_type1, prop2_type2 + ); +} + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop->ce->name), + zend_get_unmangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + +ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2; + zend_format_type(prop1->type, &prop1_type1, &prop1_type2); + zend_format_type(prop2->type, &prop2_type1, &prop2_type2); + zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop1->ce->name), + zend_get_unmangled_property_name(prop1->name), + prop1_type1, prop1_type2, + ZSTR_VAL(prop2->ce->name), + zend_get_unmangled_property_name(prop2->name), + prop2_type1, prop2_type2 + ); +} + +/* 1: valid, 0: invalid, -1: may be valid after type coercion */ +static zend_always_inline int i_zend_verify_type_assignable_zval( + zend_type *type_ptr, zend_class_entry *self_ce, zval *zv, zend_bool strict) { + zend_type type = *type_ptr; + zend_uchar type_code; + zend_uchar zv_type = Z_TYPE_P(zv); + + if (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL) { + return 1; + } + + if (ZEND_TYPE_IS_CLASS(type)) { + if (!ZEND_TYPE_IS_CE(type)) { + if (!zend_resolve_class_type(type_ptr, self_ce)) { + return 0; + } + type = *type_ptr; + } + return zv_type == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); + } + + type_code = ZEND_TYPE_CODE(type); + if (type_code == zv_type || + (type_code == _IS_BOOL && (zv_type == IS_FALSE || zv_type == IS_TRUE))) { + return 1; + } + + if (type_code == IS_ITERABLE) { + return zend_is_iterable(zv); + } + + /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ + if (strict) { + if (type_code == IS_DOUBLE && zv_type == IS_LONG) { + return -1; + } + return 0; + } + + /* No weak conversions for arrays and objects */ + if (type_code == IS_ARRAY || type_code == IS_OBJECT) { + return 0; + } + + /* NULL may be accepted only by nullable hints (this is already checked) */ + if (zv_type == IS_NULL) { + return 0; + } + + /* Coercion may be necessary, check separately */ + return -1; +} + +static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { + zend_property_info *prop; + + /* The value must satisfy each property type, and coerce to the same value for each property + * type. Right now, the latter rule means that *if* coercion is necessary, then all types + * must be the same (modulo nullability). To handle this, remember the first type we see and + * compare against it when coercion becomes necessary. */ + zend_property_info *seen_prop = NULL; + zend_uchar seen_type; + zend_bool needs_coercion = 0; + + ZEND_ASSERT(Z_TYPE_P(zv) != IS_REFERENCE); + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + int result = i_zend_verify_type_assignable_zval(&prop->type, prop->ce, zv, strict); + if (result == 0) { + zend_throw_ref_type_error_zval(prop, zv); + return 0; + } + + if (result < 0) { + needs_coercion = 1; + } + + if (!seen_prop) { + seen_prop = prop; + seen_type = ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type); + } else if (needs_coercion && seen_type != ZEND_TYPE_CODE(prop->type)) { + zend_throw_conflicting_coercion_error(seen_prop, prop, zv); + return 0; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + + if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv))) { + zend_throw_ref_type_error_zval(seen_prop, zv); + return 0; + } + + return 1; +} + +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) +{ + return i_zend_verify_ref_assignable_zval(ref, zv, strict); +} + +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict) { + zval *val = orig_val; + if (Z_ISREF_P(val) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(val))) { + int result; + + val = Z_REFVAL_P(val); + result = i_zend_verify_type_assignable_zval(&prop_info->type, prop_info->ce, val, strict); + if (result > 0) { + return 1; + } + + if (result < 0) { + zend_property_info *ref_prop = ZEND_REF_FIRST_SOURCE(Z_REF_P(orig_val)); + if (ZEND_TYPE_CODE(prop_info->type) != ZEND_TYPE_CODE(ref_prop->type)) { + /* Invalid due to conflicting coercion */ + zend_throw_ref_type_error_type(ref_prop, prop_info, val); + return 0; + } + if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_info->type), val)) { + return 1; + } + } + } else { + ZVAL_DEREF(val); + if (i_zend_check_property_type(prop_info, val, strict)) { + return 1; + } + } + + zend_verify_property_type_error(prop_info, val); + return 0; +} + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +{ + zend_property_info_list *list; + if (source_list->ptr == NULL) { + source_list->ptr = prop; + return; + } + + list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); + if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + list = emalloc(sizeof(zend_property_info_list) + (4 - 1) * sizeof(zend_property_info *)); + list->ptr[0] = source_list->ptr; + list->num_allocated = 4; + list->num = 1; + } else if (list->num_allocated == list->num) { + list->num_allocated = list->num * 2; + list = erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *)); + } + + list->ptr[list->num++] = prop; + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); +} + +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +{ + zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); + zend_property_info **ptr, **end; + + if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + ZEND_ASSERT(source_list->ptr == prop); + source_list->ptr = NULL; + return; + } + + if (list->num == 1) { + ZEND_ASSERT(*list->ptr == prop); + efree(list); + source_list->ptr = NULL; + return; + } + + /* Checking against end here to get a more graceful failure mode if we missed adding a type + * source at some point. */ + ptr = list->ptr; + end = ptr + list->num; + while (ptr < end && *ptr != prop) { + ptr++; + } + ZEND_ASSERT(*ptr == prop); + + /* Copy the last list element into the deleted slot. */ + *ptr = list->ptr[--list->num]; + + if (list->num >= 4 && list->num * 4 == list->num_allocated) { + list->num_allocated = list->num * 2; + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *))); } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 72113e8fe72..1060b1f632e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -56,9 +56,34 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type) +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type type, zend_reference *ref); + +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref); +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict); + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv); +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv); + +#define ZEND_REF_TYPE_SOURCES(ref) \ + (ref)->sources + +#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ + (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) + +#define ZEND_REF_FIRST_SOURCE(ref) \ + (ZEND_PROPERTY_INFO_SOURCE_IS_LIST((ref)->sources.list) \ + ? ZEND_PROPERTY_INFO_SOURCE_TO_LIST((ref)->sources.list)->ptr[0] \ + : (ref)->sources.ptr) + + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); + +static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { zend_refcounted *ref = NULL; + zval tmp; if (ZEND_CONST_COND(value_type & (IS_VAR|IS_CV), 1) && Z_ISREF_P(value)) { ref = Z_COUNTED_P(value); @@ -70,6 +95,25 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + zend_bool need_copy = ZEND_CONST_COND(value_type & (IS_CONST|IS_CV), 1) || + ((value_type & IS_VAR) && UNEXPECTED(ref) && GC_REFCOUNT(ref) > 1); + if (need_copy) { + ZVAL_COPY(&tmp, value); + value = &tmp; + } + if (!zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) { + if (need_copy) { + Z_TRY_DELREF_P(value); + } + zval_ptr_dtor(value); + return Z_REFVAL_P(variable_ptr); + } + if (need_copy) { + Z_TRY_DELREF_P(value); + } + } + variable_ptr = Z_REFVAL_P(variable_ptr); if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) { break; @@ -395,6 +439,39 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva } \ } while (0) +#define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS) + +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); +ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property); + +#define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \ + zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) + +#define ZEND_REF_DEL_TYPE_SOURCE(ref, source) \ + zend_ref_del_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) + +#define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) do { \ + zend_property_info_source_list *_source_list = &ZEND_REF_TYPE_SOURCES(ref); \ + zend_property_info **_prop, **_end; \ + zend_property_info_list *_list; \ + if (_source_list->ptr) { \ + if (ZEND_PROPERTY_INFO_SOURCE_IS_LIST(_source_list->list)) { \ + _list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(_source_list->list); \ + _prop = _list->ptr; \ + _end = _list->ptr + _list->num; \ + } else { \ + _prop = &_source_list->ptr; \ + _end = _prop + 1; \ + } \ + for (; _prop < _end; _prop++) { \ + prop = *_prop; \ + +#define ZEND_REF_FOREACH_TYPE_SOURCES_END() \ + } \ + } \ + } while (0) + + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 387c1ca4d78..9dc26088f76 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -36,6 +36,10 @@ static zend_property_info *zend_duplicate_property_info_internal(zend_property_i zend_property_info* new_property_info = pemalloc(sizeof(zend_property_info), 1); memcpy(new_property_info, property_info, sizeof(zend_property_info)); zend_string_addref(new_property_info->name); + if (ZEND_TYPE_IS_NAME(new_property_info->type)) { + zend_string_addref(ZEND_TYPE_NAME(new_property_info->type)); + } + return new_property_info; } /* }}} */ @@ -662,6 +666,55 @@ static zend_function *do_inherit_method(zend_string *key, zend_function *parent, } /* }}} */ +zend_string* zend_resolve_property_type(zend_string *type, zend_class_entry *scope) /* {{{ */ +{ + if (zend_string_equals_literal_ci(type, "parent")) { + if (scope && scope->parent) { + return scope->parent->name; + } + } + + if (zend_string_equals_literal_ci(type, "self")) { + if (scope) { + return scope->name; + } + } + + return type; +} /* }}} */ + +zend_bool property_types_compatible(zend_property_info *parent_info, zend_property_info *child_info) { + zend_string *parent_name, *child_name; + zend_class_entry *parent_type_ce, *child_type_ce; + if (parent_info->type == child_info->type) { + return 1; + } + + if (!ZEND_TYPE_IS_CLASS(parent_info->type) || !ZEND_TYPE_IS_CLASS(child_info->type) || + ZEND_TYPE_ALLOW_NULL(parent_info->type) != ZEND_TYPE_ALLOW_NULL(child_info->type)) { + return 0; + } + + parent_name = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce); + child_name = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(child_info->type), child_info->ce); + if (zend_string_equals_ci(parent_name, child_name)) { + return 1; + } + + /* Check for class aliases */ + parent_type_ce = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type) + : zend_lookup_class(parent_name); + child_type_ce = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type) + : zend_lookup_class(child_name); + return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; +} + static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ { zval *child = zend_hash_find_ex(&ce->properties_info, key, 1); @@ -691,6 +744,26 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke ZVAL_UNDEF(&ce->default_properties_table[child_num]); child_info->offset = parent_info->offset; } + + if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) { + if (!property_types_compatible(parent_info, child_info)) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s%s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZEND_TYPE_ALLOW_NULL(parent_info->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(parent_info->type) + ? ZSTR_VAL(ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce)) + : zend_get_type_by_const(ZEND_TYPE_CODE(parent_info->type)), + ZSTR_VAL(ce->parent->name)); + } + } else if (UNEXPECTED(ZEND_TYPE_IS_SET(child_info->type) && !ZEND_TYPE_IS_SET(parent_info->type))) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must not be defined (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZSTR_VAL(ce->parent->name)); + } } } else { if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { @@ -773,6 +846,42 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa } /* }}} */ +void zend_build_properties_info_table(zend_class_entry *ce) +{ + zend_property_info **table, *prop; + if (ce->default_properties_count == 0) { + return; + } + + ZEND_ASSERT(ce->properties_info_table == NULL); + if (ce->type == ZEND_USER_CLASS) { + ce->properties_info_table = table = zend_arena_alloc(&CG(arena), + sizeof(zend_property_info *) * ce->default_properties_count); + } else { + ce->properties_info_table = table = pemalloc( + sizeof(zend_property_info *) * ce->default_properties_count, 1); + } + + if (ce->parent && ce->parent->default_properties_count != 0) { + zend_property_info **parent_table = ce->parent->properties_info_table; + memcpy( + table, parent_table, + sizeof(zend_property_info *) * ce->parent->default_properties_count + ); + + /* Child did not add any new properties, we are done */ + if (ce->default_properties_count == ce->parent->default_properties_count) { + return; + } + } + + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { + table[OBJ_PROP_TO_NUM(prop->offset)] = prop; + } + } ZEND_HASH_FOREACH_END(); +} + ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */ { zend_property_info *property_info; @@ -998,7 +1107,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } } - ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_USE_GUARDS); + ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_USE_GUARDS); } /* }}} */ @@ -1653,7 +1762,9 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent not_compatible = 1; if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) - == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) { + == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) && + property_types_compatible(property_info, coliding_prop) + ) { /* the flags are identical, thus, the properties may be compatible */ zval *op1, *op2; zval op1_tmp, op2_tmp; @@ -1714,9 +1825,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent Z_TRY_ADDREF_P(prop_value); doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; - zend_declare_property_ex(ce, prop_name, - prop_value, flags, - doc_comment); + zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type); zend_string_release_ex(prop_name, 0); } ZEND_HASH_FOREACH_END(); } @@ -1930,6 +2039,8 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent) if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } + + zend_build_properties_info_table(ce); } /* }}} */ diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index bda628fc294..a882f6461f0 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -31,6 +31,7 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent_ void zend_verify_abstract_class(zend_class_entry *ce); void zend_check_deprecated_constructor(const zend_class_entry *ce); +void zend_build_properties_info_table(zend_class_entry *ce); END_EXTERN_C() diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index ec9ba821933..c1902303c28 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -716,8 +716,9 @@ class_statement_list: class_statement: - variable_modifiers property_list ';' - { $$ = $2; $$->attr = $1; } + variable_modifiers optional_type property_list ';' + { $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3); + $$->attr = $1; } | method_modifiers T_CONST class_const_list ';' { $$ = $3; $$->attr = $1; } | T_USE name_list trait_adaptations diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5f7e8195314..e91202669be 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -395,6 +395,7 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c dynamic: if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET); + CACHE_PTR_EX(cache_slot + 2, NULL); } return ZEND_DYNAMIC_PROPERTY_OFFSET; } @@ -450,6 +451,7 @@ found: } if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)property_info->offset); + CACHE_PTR_EX(cache_slot + 2, property_info->type ? property_info : NULL); } return property_info->offset; } @@ -627,12 +629,22 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe } /* }}} */ +static zend_always_inline zend_property_info *prop_info_for_offset( + zend_object *obj, uint32_t prop_offset, void **cache_slot) { + if (cache_slot) { + return cache_slot[2]; + } else { + return zend_get_typed_property_info_for_slot(obj, OBJ_PROP(obj, prop_offset)); + } +} + ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */ { zend_object *zobj; zend_string *name, *tmp_name; zval *retval; uintptr_t property_offset; + zend_property_info *prop_info; uint32_t *guard = NULL; zobj = Z_OBJ_P(object); @@ -737,6 +749,14 @@ call_getter: } else { retval = &EG(uninitialized_zval); } + + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && + IS_VALID_PROPERTY_OFFSET(property_offset) && + (prop_info = prop_info_for_offset(Z_OBJ_P(object), property_offset, cache_slot))) + ) { + zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); + } + OBJ_RELEASE(zobj); goto exit; } else if (UNEXPECTED(IS_WRONG_PROPERTY_OFFSET(property_offset))) { @@ -748,8 +768,15 @@ call_getter: } } - if ((type != BP_VAR_IS)) { - zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); + if (type != BP_VAR_IS) { + if (IS_VALID_PROPERTY_OFFSET(property_offset) && + (prop_info = prop_info_for_offset(Z_OBJ_P(object), property_offset, cache_slot))) { + zend_throw_error(NULL, "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(name)); + } else { + zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); + } } retval = &EG(uninitialized_zval); @@ -760,11 +787,11 @@ exit: } /* }}} */ -ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { zend_object *zobj; zend_string *name, *tmp_name; - zval *variable_ptr; + zval *variable_ptr, tmp; uintptr_t property_offset; ZEND_ASSERT(!Z_ISREF_P(value)); @@ -776,7 +803,23 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { - goto found; + zend_property_info *prop_info = prop_info_for_offset(Z_OBJ_P(object), property_offset, cache_slot); + + Z_TRY_ADDREF_P(value); + + if (UNEXPECTED(prop_info)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + Z_TRY_DELREF_P(value); + variable_ptr = &EG(error_zval); + goto exit; + } + value = &tmp; + } + +found: + zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + goto exit; } } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) { if (EXPECTED(zobj->properties != NULL)) { @@ -787,12 +830,12 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zobj->properties = zend_array_dup(zobj->properties); } if ((variable_ptr = zend_hash_find(zobj->properties, name)) != NULL) { -found: - zend_assign_to_variable(variable_ptr, value, IS_CV); - goto exit; + Z_TRY_ADDREF_P(value); + goto found; } } } else if (UNEXPECTED(EG(exception))) { + variable_ptr = &EG(error_zval); goto exit; } @@ -800,18 +843,20 @@ found: if (zobj->ce->__set) { uint32_t *guard = zend_get_property_guard(zobj, name); - if (!((*guard) & IN_SET)) { + if (!((*guard) & IN_SET)) { GC_ADDREF(zobj); (*guard) |= IN_SET; /* prevent circular setting */ zend_std_call_setter(zobj, name, value); (*guard) &= ~IN_SET; OBJ_RELEASE(zobj); + variable_ptr = value; } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) { goto write_std_property; } else { /* Trigger the correct error */ zend_get_property_offset(zobj->ce, name, 0, NULL); ZEND_ASSERT(EG(exception)); + variable_ptr = &EG(error_zval); goto exit; } } else { @@ -819,17 +864,32 @@ found: write_std_property: Z_TRY_ADDREF_P(value); if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { - ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); + zend_property_info *prop_info; + + variable_ptr = OBJ_PROP(zobj, property_offset); + + if (UNEXPECTED(prop_info = prop_info_for_offset(Z_OBJ_P(object), property_offset, cache_slot))) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + zval_ptr_dtor(value); + goto exit; + } + value = &tmp; + goto found; /* might have been updated via e.g. __toString() */ + } + + ZVAL_COPY_VALUE(variable_ptr, value); } else { if (!zobj->properties) { rebuild_object_properties(zobj); } - zend_hash_add_new(zobj->properties, name, value); + variable_ptr = zend_hash_add_new(zobj->properties, name, value); } } exit: zend_tmp_string_release(tmp_name); + return variable_ptr; } /* }}} */ @@ -957,9 +1017,6 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int typ if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { if (EXPECTED(!zobj->ce->__get) || UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) { - ZVAL_NULL(retval); - /* Notice is thrown after creation of the property, to avoid EG(std_property_info) - * being overwritten in an error handler. */ if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { zend_error(E_NOTICE, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); } @@ -1015,6 +1072,13 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s zval *slot = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(slot) != IS_UNDEF) { + if (UNEXPECTED(Z_ISREF_P(slot)) && + (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(slot)))) { + zend_property_info *prop_info = zend_get_property_info_for_slot(zobj, slot); + if (prop_info->type) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); + } + } zval_ptr_dtor(slot); ZVAL_UNDEF(slot); if (zobj->properties) { @@ -1366,11 +1430,12 @@ ZEND_API void zend_class_init_statics(zend_class_entry *class_type) /* {{{ */ zend_intenal_class_init_statics(class_type); } /* }}} */ -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent) /* {{{ */ +ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, zend_property_info **property_info_ptr) /* {{{ */ { - zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); - zend_class_entry *scope; zval *ret; + zend_class_entry *scope; + zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); + *property_info_ptr = property_info; if (UNEXPECTED(property_info == NULL)) { goto undeclared_property; @@ -1385,7 +1450,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p if (property_info->ce != scope) { if (UNEXPECTED(property_info->flags & ZEND_ACC_PRIVATE) || UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) { - if (!silent) { + if (type != BP_VAR_IS) { zend_bad_property_access(property_info, ce, property_name); } return NULL; @@ -1409,7 +1474,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p zend_intenal_class_init_statics(ce); } else { undeclared_property: - if (!silent) { + if (type != BP_VAR_IS) { zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; @@ -1418,10 +1483,25 @@ undeclared_property: ret = CE_STATIC_MEMBERS(ce) + property_info->offset; ZVAL_DEINDIRECT(ret); + + if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) + && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + zend_get_unmangled_property_name(property_name)); + return NULL; + } + return ret; } /* }}} */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type) /* {{{ */ +{ + zend_property_info *prop_info; + return zend_std_get_static_property_with_info(ce, property_name, type, &prop_info); +} + ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */ { zend_throw_error(NULL, "Attempt to unset static property %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index fbb66f798ac..c3b5fda42dd 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -51,9 +51,10 @@ typedef zval *(*zend_object_read_dimension_t)(zval *object, zval *offset, int ty If you receive a value zval in write_property/write_dimension, you may only modify it if its reference count is 1. Otherwise, you must create a copy of that zval before making any changes. You should NOT modify the reference count of the value passed to you. + You must return the final value of the assigned property. */ /* Used to set property of the object */ -typedef void (*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot); +typedef zval *(*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot); /* Used to set dimension of the object */ typedef void (*zend_object_write_dimension_t)(zval *object, zval *offset, zval *value); @@ -199,7 +200,8 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ZEND_API void zend_class_init_statics(zend_class_entry *ce); ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key); -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent); +ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info); +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type); ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name); ZEND_API zend_function *zend_std_get_constructor(zend_object *object); ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent); @@ -209,7 +211,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp); ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type); ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); +ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot); ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot); ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv); diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 0051ce84383..19d17dc9e95 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -57,7 +57,16 @@ ZEND_API void zend_object_std_dtor(zend_object *object) if (EXPECTED(object->ce->default_properties_count)) { end = p + object->ce->default_properties_count; do { - i_zval_ptr_dtor(p); + if (Z_REFCOUNTED_P(p)) { + if (UNEXPECTED(Z_ISREF_P(p)) && + (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(p)))) { + zend_property_info *prop_info = zend_get_property_info_for_slot(object, p); + if (prop_info->type) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + } + } + i_zval_ptr_dtor(p); + } p++; } while (p != end); } @@ -195,6 +204,13 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, i_zval_ptr_dtor(dst); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); + if (UNEXPECTED(Z_ISREF_P(dst)) && + (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(dst)))) { + zend_property_info *prop_info = zend_get_property_info_for_slot(new_object, dst); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info); + } + } src++; dst++; } while (src != end); diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index 658c8407cf8..2a569604fc8 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -95,6 +95,24 @@ static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_en return obj; } +static inline zend_property_info *zend_get_property_info_for_slot(zend_object *obj, zval *slot) +{ + zend_property_info **table = obj->ce->properties_info_table; + intptr_t prop_num = slot - obj->properties_table; + ZEND_ASSERT(prop_num >= 0 && prop_num < obj->ce->default_properties_count); + return table[prop_num]; +} + +/* Helper for cases where we're only interested in property info of typed properties. */ +static inline zend_property_info *zend_get_typed_property_info_for_slot(zend_object *obj, zval *slot) +{ + zend_property_info *prop_info = zend_get_property_info_for_slot(obj, slot); + if (prop_info && prop_info->type) { + return prop_info; + } + return NULL; +} + #endif /* ZEND_OBJECTS_H */ diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 6ec0e2d1c88..ec624a5adb8 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -148,6 +148,15 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce) ZEND_MAP_PTR_SET(ce->static_members_table, NULL); while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - static_members == prop_info->offset) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } i_zval_ptr_dtor(p); p++; } @@ -247,6 +256,15 @@ ZEND_API void destroy_zend_class(zval *zv) zval *end = p + ce->default_static_members_count; while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - ce->default_static_members_table == prop_info->offset) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } i_zval_ptr_dtor(p); p++; } @@ -258,6 +276,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (prop_info->doc_comment) { zend_string_release_ex(prop_info->doc_comment, 0); } + if (ZEND_TYPE_IS_NAME(prop_info->type)) { + zend_string_release(ZEND_TYPE_NAME(prop_info->type)); + } } } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&ce->properties_info); @@ -353,6 +374,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (ce->num_interfaces > 0) { free(ce->interfaces); } + if (ce->properties_info_table) { + free(ce->properties_info_table); + } free(ce); break; } diff --git a/Zend/zend_types.h b/Zend/zend_types.h index ece1bdd9002..f2b089631aa 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -108,6 +108,8 @@ typedef void (*copy_ctor_func_t)(zval *pElement); * ZEND_TYPE_IS_SET() - checks if type-hint exists * ZEND_TYPE_IS_CODE() - checks if type-hint refer to standard type * ZEND_TYPE_IS_CLASS() - checks if type-hint refer to some class + * ZEND_TYPE_IS_CE() - checks if type-hint refer to some class by zend_class_entry * + * ZEND_TYPE_IS_NAME() - checks if type-hint refer to some class by zend_string * * * ZEND_TYPE_NAME() - returns referenced class name * ZEND_TYPE_CE() - returns referenced class entry @@ -122,13 +124,19 @@ typedef void (*copy_ctor_func_t)(zval *pElement); typedef uintptr_t zend_type; #define ZEND_TYPE_IS_SET(t) \ - ((t) > Z_L(1)) + ((t) > Z_L(0x3)) #define ZEND_TYPE_IS_CODE(t) \ - (((t) > Z_L(1)) && ((t) <= Z_L(0x1ff))) + (((t) > Z_L(0x3)) && ((t) <= Z_L(0x3ff))) #define ZEND_TYPE_IS_CLASS(t) \ - ((t) > Z_L(0x1ff)) + ((t) > Z_L(0x3ff)) + +#define ZEND_TYPE_IS_CE(t) \ + (((t) & Z_L(0x2)) != 0) + +#define ZEND_TYPE_IS_NAME(t) \ + (ZEND_TYPE_IS_CLASS(t) && !ZEND_TYPE_IS_CE(t)) #define ZEND_TYPE_NAME(t) \ ((zend_string*)((t) & ~Z_L(0x3))) @@ -137,16 +145,22 @@ typedef uintptr_t zend_type; ((zend_class_entry*)((t) & ~Z_L(0x3))) #define ZEND_TYPE_CODE(t) \ - ((t) >> Z_L(1)) + ((t) >> Z_L(2)) #define ZEND_TYPE_ALLOW_NULL(t) \ (((t) & Z_L(0x1)) != 0) +#define ZEND_TYPE_WITHOUT_NULL(t) \ + ((t) & ~Z_L(0x1)) + #define ZEND_TYPE_ENCODE(code, allow_null) \ - (((code) << Z_L(1)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0))) + (((code) << Z_L(2)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0))) + +#define ZEND_TYPE_ENCODE_CE(ce, allow_null) \ + (((uintptr_t)(ce)) | ((allow_null) ? Z_L(0x3) : Z_L(0x2))) #define ZEND_TYPE_ENCODE_CLASS(class_name, allow_null) \ - (((uintptr_t)(class_name)) | ((allow_null) ? Z_L(0x1) : Z_L(0))) + (((uintptr_t)(class_name)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0))) #define ZEND_TYPE_ENCODE_CLASS_CONST_0(class_name) \ ((zend_type) class_name) @@ -369,9 +383,27 @@ struct _zend_resource { void *ptr; }; +typedef struct _zend_property_info zend_property_info; + +typedef struct { + size_t num; + size_t num_allocated; + zend_property_info *ptr[1]; +} zend_property_info_list; + +typedef union { + zend_property_info *ptr; + uintptr_t list; +} zend_property_info_source_list; + +#define ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list) (0x1 | (uintptr_t) (list)) +#define ZEND_PROPERTY_INFO_SOURCE_TO_LIST(list) ((zend_property_info_list *) ((list) & ~0x1)) +#define ZEND_PROPERTY_INFO_SOURCE_IS_LIST(list) ((list) & 0x1) + struct _zend_reference { - zend_refcounted_h gc; - zval val; + zend_refcounted_h gc; + zval val; + zend_property_info_source_list sources; }; struct _zend_ast_ref { @@ -861,6 +893,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { (zend_reference *) emalloc(sizeof(zend_reference)); \ GC_SET_REFCOUNT(_ref, 1); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -871,6 +904,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, 1); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -882,6 +916,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, (refcount)); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, _z); \ + _ref->sources.ptr = NULL; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ } while (0) @@ -893,6 +928,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE | \ (GC_PERSISTENT << GC_FLAGS_SHIFT); \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index c057390700f..d6e72362435 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -70,6 +70,7 @@ static void ZEND_FASTCALL zend_string_destroy(zend_string *str) static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref) { + ZEND_ASSERT(!ZEND_REF_HAS_TYPE_SOURCES(ref)); i_zval_ptr_dtor(&ref->val); efree_size(ref, sizeof(zend_reference)); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f78b961c721..22844ccc621 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -794,11 +794,13 @@ ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY) ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op_type binary_op) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -810,47 +812,126 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_op_object); - } + ZEND_VM_C_GOTO(assign_op_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ ZEND_VM_C_LABEL(assign_op_object): - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR, binary_op_type binary_op) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP_DATA(); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|CV, CONST|TMPVAR|UNUSED|CV, binary_op_type binary_op) { USE_OPLINE @@ -881,12 +962,32 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): if (UNEXPECTED(!var_ptr)) { ZEND_VM_C_GOTO(assign_dim_op_ret_null); } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + FREE_OP2(); + FREE_OP(free_op_data1); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -958,9 +1059,25 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -972,10 +1089,16 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op) +ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op) { -#if defined(ZEND_VM_SPEC) && OP2_TYPE == IS_UNUSED - ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); +#if defined(ZEND_VM_SPEC) && (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); +#elif defined(ZEND_VM_SPEC) && (OP2_TYPE == IS_UNUSED) + if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); + } + + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); #else # if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED # if !defined(ZEND_VM_SPEC) @@ -989,68 +1112,73 @@ ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TM if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); } +# if !defined(ZEND_VM_SPEC) || OP2_TYPE == IS_CONST || OP2_TYPE == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(opline->extended_value == ZEND_ASSIGN_STATIC_PROP)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); + } +# endif # endif ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_obj_helper, binary_op, binary_op); #endif } -ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, add_function); } -ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, sub_function); } -ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mul_function); } -ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, div_function); } -ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mod_function); } -ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_left_function); } -ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_right_function); } -ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, concat_function); } -ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_or_function); } -ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_and_function); } -ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_xor_function); } -ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function); } @@ -1062,6 +1190,8 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1074,46 +1204,34 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(pre_incdec_object); - } + ZEND_VM_C_GOTO(pre_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ ZEND_VM_C_LABEL(pre_incdec_object): - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -1139,6 +1257,8 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1151,42 +1271,33 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(post_incdec_object); - } + ZEND_VM_C_GOTO(post_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ ZEND_VM_C_LABEL(post_incdec_object): - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -1205,6 +1316,62 @@ ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0); } +ZEND_VM_HELPER(zend_pre_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(203, ZEND_PRE_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(204, ZEND_PRE_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 0); +} + +ZEND_VM_HELPER(zend_post_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(205, ZEND_POST_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(206, ZEND_POST_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 0); +} + ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) { USE_OPLINE @@ -1233,9 +1400,35 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + increment_function(var_ptr); + } + } else { + increment_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1273,9 +1466,36 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + decrement_function(var_ptr); + } + } else { + decrement_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1309,10 +1529,29 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + } FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -1342,10 +1581,29 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + } FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -1503,92 +1761,24 @@ ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED, VAR_FETCH) ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int type) { USE_OPLINE - zend_free_op free_op1; - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; SAVE_OPLINE(); - do { - if (OP2_TYPE == IS_CONST) { - if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); - - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - FREE_UNFETCHED_OP1(); - retval = NULL; - break; - } - if (OP1_TYPE != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (OP2_TYPE == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - FREE_UNFETCHED_OP1(); - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (OP1_TYPE == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } - - varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); - if (OP1_TYPE == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } - - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); - - if (OP1_TYPE != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - - if (OP1_TYPE == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } - - FREE_OP1(); - } while (0); - - if (UNEXPECTED(retval == NULL)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1598,7 +1788,7 @@ ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FET ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R); } -ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|DIM_OBJ_WRITE|CACHE_SLOT) { ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W); } @@ -1608,7 +1798,7 @@ ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FE ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_RW); } -ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) { int fetch_type = (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ? @@ -1811,7 +2001,7 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST zval *retval; if (OP2_TYPE == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -1867,7 +2057,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_finish): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT) +ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_OBJ_WRITE|CACHE_SLOT) { USE_OPLINE zend_free_op free_op1, free_op2; @@ -1882,7 +2072,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, OP1_TYPE, property, OP2_TYPE, + ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -1904,7 +2097,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH } property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2002,14 +2195,13 @@ ZEND_VM_C_LABEL(fetch_obj_is_finish): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT) +ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { /* Behave like FETCH_OBJ_W */ if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper); } - ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W); } else { ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R); @@ -2031,7 +2223,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2093,13 +2285,12 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_object); - } + ZEND_VM_C_GOTO(assign_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { FREE_OP_DATA(); ZEND_VM_C_GOTO(exit_assign_obj); } @@ -2108,15 +2299,54 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE ZEND_VM_C_LABEL(assign_object): if (OP2_TYPE == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + FREE_OP2(); + FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (OP_DATA_TYPE == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE); + value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2178,10 +2408,10 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): @@ -2191,18 +2421,74 @@ ZEND_VM_C_LABEL(exit_assign_obj): ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV)) { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { ZEND_VM_C_LABEL(try_assign_dim_array): @@ -2244,7 +2530,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): ZEND_VM_C_GOTO(assign_dim_error); } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE); + value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -2280,6 +2566,15 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + FREE_UNFETCHED_OP2(); + FREE_UNFETCHED_OP_DATA(); + FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); ZEND_VM_C_GOTO(try_assign_dim_array); } else { @@ -2319,7 +2614,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL)) ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE); + value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2346,7 +2641,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) } else if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); FREE_OP1_VAR_PTR(); FREE_OP2_VAR_PTR(); UNDEF_RESULT(); @@ -2379,6 +2674,152 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +ZEND_VM_HANDLER(200, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper); + } + + property = GET_OP2_ZVAL_PTR(BP_VAR_R); + + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + FREE_OP1_VAR_PTR(); + FREE_OP2(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +ZEND_VM_HANDLER(202, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP_DATA_VAR_PTR(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) { zend_execute_data *old_execute_data; @@ -5921,7 +6362,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit): if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = EX_VAR(opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); @@ -6004,6 +6445,15 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) value_type = Z_TYPE_INFO_P(value); if (EXPECTED(value_type != IS_UNDEF) && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) { + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = + zend_get_typed_property_info_for_slot(Z_OBJ_P(array), value); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); + value_type = IS_REFERENCE_EX; + } + } break; } } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0) @@ -6180,71 +6630,16 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA USE_OPLINE zval *value; int result; - zend_free_op free_op1; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; SAVE_OPLINE(); - if (OP2_TYPE == IS_CONST) { - if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - ZEND_VM_C_GOTO(is_static_prop_return); - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (OP1_TYPE != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (OP2_TYPE == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - FREE_UNFETCHED_OP1(); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (OP1_TYPE == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - ZEND_VM_C_GOTO(is_static_prop_return); - } - } + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - varname = GET_OP1_ZVAL_PTR(BP_VAR_IS); - if (OP1_TYPE == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (OP1_TYPE == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (OP1_TYPE != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - FREE_OP1(); - -ZEND_VM_C_LABEL(is_static_prop_return): if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -7811,6 +8206,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, UNUSED, REF) GC_SET_REFCOUNT(ref, 2); GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -8778,7 +9174,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf } variable_ptr = EX_VAR(opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 790e01b8f3a..d24636c0f81 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4432,94 +4432,229 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CON ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { - USE_OPLINE + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); - do { - if (IS_CONST == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - retval = NULL; - break; - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } + zval_ptr_dtor(&z_copy); } + } else { + binary_op(prop, prop, value); + } - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } - if (IS_CONST == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif - } while (0); + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif - if (UNEXPECTED(retval == NULL)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -4667,7 +4802,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -4820,7 +4955,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_AR if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -4840,6 +4974,282 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_CONST_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -5548,69 +5958,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_CONST == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CONST == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -6749,6 +7105,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6859,7 +7361,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -7012,7 +7514,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_AR if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -7897,94 +8398,83 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z ZEND_VM_RETURN(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; + zend_property_info *prop_info; SAVE_OPLINE(); - do { - if (IS_VAR == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - retval = NULL; - break; - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } + SAVE_OPLINE(); - if (IS_CONST == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - } while (0); + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - if (UNEXPECTED(retval == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -8022,6 +8512,282 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONS ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -8082,69 +8848,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_VAR == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CONST == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -8289,6 +9001,208 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -8411,91 +9325,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_UNUSED_HAN static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; SAVE_OPLINE(); - do { - if (IS_UNUSED == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); - - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - - retval = NULL; - break; - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } - - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } - - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); - - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - - if (IS_CONST == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } - - } while (0); - - if (UNEXPECTED(retval == NULL)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -8548,6 +9395,282 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ } } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -9064,69 +10187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_UNUSED == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CONST != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = RT_CONSTANT(opline, opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CONST == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CONST != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -9963,7 +11032,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -10116,7 +11185,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_AR if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -13505,95 +14573,83 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1; - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; + zend_property_info *prop_info; SAVE_OPLINE(); - do { - if (IS_CONST == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; - zval_ptr_dtor_nogc(free_op1); - } while (0); + SAVE_OPLINE(); - if (UNEXPECTED(retval == NULL)) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -13726,7 +14782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -13872,6 +14928,282 @@ fetch_obj_is_finish: ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14238,71 +15570,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC USE_OPLINE zval *value; int result; - zend_free_op free_op1; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; SAVE_OPLINE(); - if (IS_CONST == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - zval_ptr_dtor_nogc(free_op1); - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -15352,7 +16629,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -15955,95 +17232,83 @@ array_key_exists_array: ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1; - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; + zend_property_info *prop_info; SAVE_OPLINE(); - do { - if (IS_VAR == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; - zval_ptr_dtor_nogc(free_op1); - } while (0); + SAVE_OPLINE(); - if (UNEXPECTED(retval == NULL)) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -16081,6 +17346,282 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16140,71 +17681,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC USE_OPLINE zval *value; int result; - zend_free_op free_op1; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; SAVE_OPLINE(); - if (IS_VAR == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - zval_ptr_dtor_nogc(free_op1); - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -16261,6 +17747,62 @@ try_instanceof: ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -16383,92 +17925,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HA static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1; - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; SAVE_OPLINE(); - do { - if (IS_UNUSED == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); - - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } - - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } - - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); - - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } - - zval_ptr_dtor_nogc(free_op1); - } while (0); - - if (UNEXPECTED(retval == NULL)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -16506,6 +17980,282 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16646,71 +18396,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC USE_OPLINE zval *value; int result; - zend_free_op free_op1; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; SAVE_OPLINE(); - if (IS_UNUSED == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - zval_ptr_dtor_nogc(free_op1); - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -17247,7 +18942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -18617,6 +20312,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -18639,7 +20480,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -19031,6 +20871,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -19053,7 +21039,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -19578,6 +21563,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -20013,7 +22144,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -20425,9 +22555,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + increment_function(var_ptr); + } + } else { + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -20465,9 +22621,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + increment_function(var_ptr); + } + } else { + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -20505,9 +22687,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + decrement_function(var_ptr); + } + } else { + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -20545,9 +22754,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + decrement_function(var_ptr); + } + } else { + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -20581,10 +22817,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -20614,10 +22869,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -21534,7 +23808,7 @@ fe_fetch_r_exit: if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = EX_VAR(opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); @@ -21617,6 +23891,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z value_type = Z_TYPE_INFO_P(value); if (EXPECTED(value_type != IS_UNDEF) && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) { + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = + zend_get_typed_property_info_for_slot(Z_OBJ_P(array), value); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); + value_type = IS_REFERENCE_EX; + } + } break; } } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0) @@ -21993,11 +24276,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22009,47 +24294,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -22080,12 +24444,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -22156,9 +24540,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -22171,8 +24571,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -22186,6 +24592,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22194,8 +24605,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -22209,6 +24626,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22217,8 +24639,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -22232,6 +24660,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22253,6 +24720,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22268,6 +24740,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22283,6 +24760,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22298,6 +24780,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22313,6 +24800,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22328,6 +24820,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22343,6 +24840,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22358,6 +24860,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22373,6 +24880,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22388,6 +24900,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22403,6 +24920,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -22418,6 +24940,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -22425,6 +24952,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22437,46 +24966,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -22501,6 +25018,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22513,42 +25032,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -22647,7 +25157,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -22669,7 +25182,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA } property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -22684,7 +25197,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -22706,7 +25218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -22754,13 +25266,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -22769,15 +25280,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22839,10 +25389,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -22869,13 +25419,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -22884,15 +25433,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22954,10 +25542,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -22984,13 +25572,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -22999,15 +25586,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23069,10 +25695,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -23099,13 +25725,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -23114,15 +25739,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23184,10 +25848,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -23201,14 +25865,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -23250,7 +25914,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23285,6 +25949,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -23311,14 +25984,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -23360,7 +26033,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23396,6 +26069,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -23422,14 +26104,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -23471,7 +26153,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23507,6 +26189,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -23533,14 +26224,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -23582,7 +26273,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23617,6 +26308,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -23656,7 +26356,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23684,7 +26384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23695,6 +26395,194 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -24323,11 +27211,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -24339,47 +27229,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24410,12 +27379,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -24487,9 +27476,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -24503,8 +27508,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -24518,6 +27529,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24526,8 +27542,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -24541,6 +27563,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24549,8 +27576,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -24564,6 +27597,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24585,6 +27657,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24600,6 +27677,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24615,6 +27697,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24630,6 +27717,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24645,6 +27737,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24660,6 +27757,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24675,6 +27777,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24690,6 +27797,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24705,6 +27817,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24720,6 +27837,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24735,6 +27857,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24750,6 +27877,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24757,6 +27889,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -24769,46 +27903,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -24834,6 +27956,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -24846,42 +27970,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -24981,7 +28096,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -25003,7 +28121,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H } property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -25018,7 +28136,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -25040,7 +28157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -25089,13 +28206,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -25104,15 +28220,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25174,10 +28329,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -25204,13 +28359,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25219,15 +28373,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25289,10 +28482,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25319,13 +28512,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25334,15 +28526,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25404,10 +28635,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25434,13 +28665,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -25449,15 +28679,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25519,10 +28788,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -25536,14 +28805,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25585,7 +28854,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -25620,6 +28889,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25646,14 +28924,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25695,7 +28973,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -25731,6 +29009,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25757,14 +29044,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25806,7 +29093,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -25842,6 +29129,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25868,14 +29164,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25917,7 +29213,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -25952,6 +29248,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25974,6 +29279,194 @@ assign_dim_error: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -26405,7 +29898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26433,7 +29926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26635,7 +30128,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26663,7 +30156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26690,7 +30183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; UNDEF_RESULT(); @@ -26861,6 +30354,58 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -26891,12 +30436,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -26953,8 +30518,14 @@ assign_dim_op_ret_null: static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -26968,6 +30539,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -26979,61 +30589,121 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -27087,14 +30757,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -27136,7 +30806,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27171,6 +30841,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -27197,14 +30876,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -27246,7 +30925,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27282,6 +30961,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -27308,14 +30996,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -27357,7 +31045,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27393,6 +31081,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -27419,14 +31116,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -27468,7 +31165,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27503,6 +31200,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28186,11 +31892,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDL static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -28202,41 +31910,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ @@ -28273,12 +32008,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -28349,9 +32104,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -28364,8 +32135,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -28379,6 +32156,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -28387,8 +32169,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -28402,6 +32190,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -28410,8 +32203,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED # if 0 @@ -28425,6 +32224,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -28618,6 +32422,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -28630,46 +32436,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -28694,6 +32488,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -28706,42 +32502,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -28840,7 +32627,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28862,7 +32652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL } property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28877,7 +32667,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -28899,7 +32688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28947,13 +32736,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -28962,15 +32750,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29032,10 +32859,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -29062,13 +32889,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -29077,15 +32903,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29147,10 +33012,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -29177,13 +33042,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -29192,15 +33056,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29262,10 +33165,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -29292,13 +33195,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -29307,15 +33209,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29377,10 +33318,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -29394,14 +33335,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -29443,7 +33384,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29478,6 +33419,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -29504,14 +33454,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -29553,7 +33503,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29589,6 +33539,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -29615,14 +33574,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -29664,7 +33623,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29700,6 +33659,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -29726,14 +33694,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -29775,7 +33743,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29810,6 +33778,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -29849,7 +33826,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29877,7 +33854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29904,7 +33881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; UNDEF_RESULT(); @@ -29936,6 +33913,194 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -30497,7 +34662,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = EX_VAR(opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -30549,7 +34714,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = EX_VAR(opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -30735,11 +34900,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_H static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -30751,41 +34918,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -30794,8 +34988,14 @@ assign_op_object: static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED # if 0 @@ -30809,6 +35009,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -30882,6 +35087,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -30894,46 +35101,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -30958,6 +35153,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -30970,42 +35167,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -31068,7 +35256,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -31139,7 +35327,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -31161,7 +35352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST } property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -31266,7 +35457,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -31288,7 +35478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -31313,13 +35503,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -31328,15 +35517,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31398,10 +35626,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -31428,13 +35656,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -31443,15 +35670,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31513,10 +35779,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -31543,13 +35809,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -31558,15 +35823,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31628,10 +35932,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -31658,13 +35962,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -31673,15 +35976,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31743,10 +36085,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -31756,6 +36098,192 @@ exit_assign_obj: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -32415,11 +36943,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -32431,41 +36961,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ @@ -32474,8 +37031,14 @@ assign_op_object: static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED # if 0 @@ -32489,6 +37052,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -32562,6 +37130,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -32574,46 +37144,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -32639,6 +37197,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -32651,42 +37211,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -32750,7 +37301,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -32821,7 +37372,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32843,7 +37397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA } property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32948,7 +37502,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -32970,7 +37523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32995,13 +37548,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -33010,15 +37562,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33080,10 +37671,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -33110,13 +37701,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33125,15 +37715,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33195,10 +37824,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -33225,13 +37854,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33240,15 +37868,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33310,10 +37977,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -33340,13 +38007,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -33355,15 +38021,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33425,10 +38130,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -33438,6 +38143,192 @@ exit_assign_obj: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -34746,11 +39637,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -34762,41 +39655,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -34805,8 +39725,14 @@ assign_op_object: static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED # if 0 @@ -34820,6 +39746,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -34893,6 +39824,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -34905,46 +39838,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -34969,6 +39890,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = &EX(This); @@ -34981,42 +39904,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -35079,7 +39993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -35150,7 +40064,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -35172,7 +40089,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA } property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -35277,7 +40194,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -35299,7 +40215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -35324,13 +40240,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35339,15 +40254,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35409,10 +40363,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35439,13 +40393,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35454,15 +40407,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35524,10 +40516,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35554,13 +40546,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35569,15 +40560,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35639,10 +40669,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35669,13 +40699,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35684,15 +40713,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35754,10 +40822,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35767,6 +40835,192 @@ exit_assign_obj: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = &EX(This); + + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -36408,9 +41662,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + increment_function(var_ptr); + } + } else { + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -36447,9 +41727,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + increment_function(var_ptr); + } + } else { + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -36486,9 +41792,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + decrement_function(var_ptr); + } + } else { + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -36525,9 +41858,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY(&old, var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } + } else { + decrement_function(var_ptr); + } + } else { + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -36560,10 +41920,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 1); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); + } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -36592,10 +41971,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ ZVAL_NULL(var_ptr); ZVAL_UNDEFINED_OP1(); } - ZVAL_DEREF(var_ptr); - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + zend_throw_incdec_ref_error(ref, 0); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); + } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -38660,11 +44058,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -38676,47 +44076,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -38747,12 +44226,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -38823,9 +44322,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -38838,8 +44353,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -38853,6 +44374,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38861,8 +44387,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -38876,6 +44408,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38884,8 +44421,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -38899,6 +44442,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38920,6 +44502,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38935,6 +44522,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38950,6 +44542,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38965,6 +44562,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38980,6 +44582,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -38995,6 +44602,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39010,6 +44622,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39025,6 +44642,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39040,6 +44662,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39055,6 +44682,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39070,6 +44702,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39085,6 +44722,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -39092,6 +44734,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -39104,46 +44748,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -39168,6 +44800,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -39180,42 +44814,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -39233,94 +44858,83 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HAN ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; + zend_property_info *prop_info; SAVE_OPLINE(); - do { - if (IS_CONST == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - retval = NULL; - break; - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - varname = EX_VAR(opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } + SAVE_OPLINE(); - if (IS_CV == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - } while (0); + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - if (UNEXPECTED(retval == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -39519,7 +45133,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -39590,7 +45204,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -39612,7 +45229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN } property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -39717,7 +45334,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON if ((IS_CV & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -39739,7 +45355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -39764,13 +45380,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -39779,15 +45394,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -39849,10 +45503,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -39879,13 +45533,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -39894,15 +45547,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -39964,10 +45656,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -39994,13 +45686,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40009,15 +45700,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40079,10 +45809,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -40109,13 +45839,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -40124,15 +45853,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA assign_object: if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40194,10 +45962,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -40207,18 +45975,242 @@ exit_assign_obj: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -40260,7 +46252,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40295,6 +46287,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -40321,14 +46322,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -40370,7 +46371,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40406,6 +46407,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -40432,14 +46442,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -40481,7 +46491,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40517,6 +46527,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -40543,14 +46562,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -40592,7 +46611,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40627,6 +46646,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -40666,7 +46694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40694,7 +46722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40705,6 +46733,244 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = RT_CONSTANT(opline, opline->op2); + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -41252,69 +47518,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_CONST == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CV == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -42532,11 +48744,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -42548,47 +48762,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -42619,12 +48912,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -42696,9 +49009,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -42712,8 +49041,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -42727,6 +49062,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42735,8 +49075,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -42750,6 +49096,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42758,8 +49109,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -42773,6 +49130,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42794,6 +49190,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42809,6 +49210,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42824,6 +49230,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42839,6 +49250,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42854,6 +49270,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42869,6 +49290,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42884,6 +49310,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42899,6 +49330,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42914,6 +49350,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42929,6 +49370,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42944,6 +49390,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -42959,6 +49410,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -42966,6 +49422,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -42978,46 +49436,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -43043,6 +49489,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -43055,42 +49503,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -43270,7 +49709,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -43341,7 +49780,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -43363,7 +49805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA } property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -43468,7 +49910,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP if ((IS_CV & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -43490,7 +49931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -43515,13 +49956,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -43530,15 +49970,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43600,10 +50079,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -43630,13 +50109,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -43645,15 +50123,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43715,10 +50232,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -43745,13 +50262,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -43760,15 +50276,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43830,10 +50385,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -43860,13 +50415,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -43875,15 +50429,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D assign_object: if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43945,10 +50538,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -43962,14 +50555,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -44011,7 +50604,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -44046,6 +50639,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -44072,14 +50674,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -44121,7 +50723,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -44157,6 +50759,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -44183,14 +50794,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -44232,7 +50843,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -44268,6 +50879,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -44294,14 +50914,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -44343,7 +50963,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -44378,6 +50998,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -44400,6 +51029,192 @@ assign_dim_error: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + + zval_ptr_dtor_nogc(free_op2); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -45092,7 +51907,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45120,7 +51935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45304,94 +52119,83 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; + zend_property_info *prop_info; SAVE_OPLINE(); - do { - if (IS_VAR == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - retval = NULL; - break; - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - varname = EX_VAR(opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } + SAVE_OPLINE(); - if (IS_CV == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - } while (0); + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); - if (UNEXPECTED(retval == NULL)) { + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -45429,6 +52233,230 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_V ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -45446,7 +52474,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45474,7 +52502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45501,7 +52529,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER } else if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; UNDEF_RESULT(); @@ -45534,6 +52562,58 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -45594,69 +52674,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_VAR == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CV == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -45850,6 +52876,58 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + SAVE_OPLINE(); + + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + ZEND_ASSERT(EG(exception)); + UNDEF_RESULT(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(prop_info->type || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP(free_op_data); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -45880,12 +52958,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -45942,8 +53040,14 @@ assign_dim_op_ret_null: static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -45957,6 +53061,45 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED +# if 0 + /* opline->extended_value checks are specialized, don't need opline */ + USE_OPLINE +# endif + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45968,61 +53111,177 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -46145,91 +53404,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - - zval *varname; - zval *retval; - zend_string *name, *tmp_name; - zend_class_entry *ce; + zval *prop; SAVE_OPLINE(); - do { - if (IS_UNUSED == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } else { - zval *class_name = RT_CONSTANT(opline, opline->op2); - - if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - - retval = NULL; - break; - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value, ce); - } - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - - retval = NULL; - break; - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value) == ce)) { - retval = CACHED_PTR(opline->extended_value + sizeof(void*)); - break; - } - } - - varname = EX_VAR(opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - tmp_name = NULL; - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC); - } - name = zval_get_tmp_string(varname, &tmp_name); - } - - retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS); - - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - - if (IS_CV == IS_CONST && EXPECTED(retval)) { - CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval); - } - - } while (0); - - if (UNEXPECTED(retval == NULL)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } else { ZEND_ASSERT(type == BP_VAR_IS); - retval = &EG(uninitialized_zval); + prop = &EG(uninitialized_zval); } } if (type == BP_VAR_R || type == BP_VAR_IS) { - ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval); + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop); } else { - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); + ZVAL_INDIRECT(EX_VAR(opline->result.var), prop); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -46316,18 +53508,242 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU } } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value; + zend_property_info *prop_info; + zval tmp; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -46369,7 +53785,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46404,6 +53820,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -46430,14 +53855,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -46479,7 +53904,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46515,6 +53940,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -46541,14 +53975,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -46590,7 +54024,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46626,6 +54060,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -46652,14 +54095,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -46701,7 +54144,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46736,6 +54179,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -46758,6 +54210,58 @@ assign_dim_error: ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); + + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info->type)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -47133,69 +54637,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC zval *value; int result; - zval *varname; - zend_string *name, *tmp_name; - zend_class_entry *ce; - SAVE_OPLINE(); - if (IS_UNUSED == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) { - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - if (IS_CV != IS_CONST) { - CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce); - } - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) { + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); - value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*)); - goto is_static_prop_return; - } - } - - varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else { - name = zval_get_tmp_string(varname, &tmp_name); - } - - value = zend_std_get_static_property(ce, name, 1); - - if (IS_CV == IS_CONST && value) { - CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value); - } - - if (IS_CV != IS_CONST) { - zend_tmp_string_release(tmp_name); - } - -is_static_prop_return: if (!(opline->extended_value & ZEND_ISEMPTY)) { - result = value && Z_TYPE_P(value) > IS_NULL && + result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); } else { - result = !value || !i_zend_is_true(value); + result = result != SUCCESS || !i_zend_is_true(value); } ZEND_VM_SMART_BRANCH(result, 1); @@ -47428,6 +54878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_UNUSED_HAN GC_SET_REFCOUNT(ref, 2); GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -48266,11 +55717,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -48282,41 +55735,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ assign_op_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zval *orig_zptr = zptr; + zend_reference *ref; + zend_bool is_typed_ref = 0; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); + zptr = Z_REFVAL_P(zptr); + } + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); + } + if (UNEXPECTED(prop_info || is_typed_ref)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, zptr, value); + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(zptr, zptr, value); + } - binary_op(zptr, zptr, value); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -48353,12 +55833,32 @@ assign_dim_op_new_array: if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); } value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reference *ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -48429,9 +55929,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); + zend_reference *ref = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + ref = Z_REF_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval tmp; + binary_op(&tmp, var_ptr, value); + + if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zval_ptr_dtor(&tmp); + } + } else { + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -48444,8 +55960,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -48459,6 +55981,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -48467,8 +55994,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -48482,6 +56015,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -48490,8 +56028,14 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED # if 0 @@ -48505,6 +56049,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -48698,6 +56247,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -48710,46 +56261,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ pre_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -48774,6 +56313,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -48786,42 +56327,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } - /* here we are sure we are dealing with an object */ post_incdec_object: - if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL; + if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - ZVAL_DEREF(zptr); - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -49000,7 +56532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -49071,7 +56603,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49093,7 +56628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE } property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49198,7 +56733,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ if ((IS_CV & (IS_CONST|IS_TMP_VAR))) { ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } else { ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); @@ -49220,7 +56754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49245,13 +56779,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -49260,15 +56793,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49330,10 +56902,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49360,13 +56932,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -49375,15 +56946,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49445,10 +57055,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -49475,13 +57085,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -49490,15 +57099,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49560,10 +57208,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -49590,13 +57238,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -49605,15 +57252,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ assign_object: if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) { - uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*)); + void **cache_slot = CACHE_ADDR(opline->extended_value); + uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property_val; if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) { property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp; + + if (UNEXPECTED(prop_info != NULL)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* will remain valid, thus no need to check prop_info in future here */ + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } + + value = &tmp; + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49675,10 +57361,10 @@ fast_assign_obj: ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49692,14 +57378,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -49741,7 +57427,7 @@ try_assign_dim_array: goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49776,6 +57462,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49802,14 +57497,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -49851,7 +57546,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49887,6 +57582,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49913,14 +57617,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -49962,7 +57666,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49998,6 +57702,15 @@ try_assign_dim_array: zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50024,14 +57737,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = EX_VAR(opline->op1.var); + orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50073,7 +57786,7 @@ try_assign_dim_array: goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -50108,6 +57821,15 @@ try_assign_dim_array: } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { + zend_throw_auto_init_in_ref_error(error_prop, "array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50147,7 +57869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50175,7 +57897,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_ ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50202,7 +57924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( } else if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); UNDEF_RESULT(); @@ -50234,6 +57956,192 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + + SAVE_OPLINE(); + + container = EX_VAR(opline->op1.var); + + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + zend_property_info *prop_info = NULL; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr); + } + + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + + + + HANDLE_EXCEPTION(); + } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + if (prop_info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -51518,6 +59426,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51525,22 +59446,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51548,45 +59466,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_LABEL, @@ -51594,6 +59526,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51601,21 +59546,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51623,45 +59566,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_LABEL, @@ -51669,6 +59626,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51676,21 +59646,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51698,45 +59666,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_LABEL, @@ -51744,6 +59726,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51751,21 +59746,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51773,45 +59766,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_LABEL, @@ -51819,6 +59826,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51826,21 +59846,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51848,45 +59866,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_LABEL, @@ -51894,6 +59926,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51901,21 +59946,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51923,45 +59966,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_LABEL, @@ -51969,6 +60026,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51976,21 +60046,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -51998,45 +60066,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_LABEL, @@ -52044,6 +60126,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52051,21 +60146,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52073,45 +60166,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_LABEL, @@ -52119,6 +60226,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52126,21 +60246,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52148,45 +60266,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_LABEL, @@ -52194,6 +60326,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52201,21 +60346,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52223,45 +60366,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_LABEL, @@ -52269,6 +60426,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52276,21 +60446,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -52298,45 +60466,59 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_LABEL, @@ -52344,6 +60526,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_LABEL, (void*)&&ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -53707,6 +61890,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -53714,22 +61910,19 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -53737,48 +61930,63 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_LABEL, (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_BIND_GLOBAL_SPEC_CV_CONST_LABEL, (void*)&&ZEND_COALESCE_SPEC_CONST_LABEL, (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL, @@ -54092,6 +62300,381 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -55568,6 +64151,70 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_BOOL_XOR_SPEC_CONST_CONST) ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55620,6 +64267,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_LIST_R_SPEC_CONST_CONST) ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CONST) ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55808,6 +64475,54 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_SPACESHIP_SPEC_CONST_TMPVAR) ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR): VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55876,6 +64591,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_YIELD_SPEC_CONST_TMP) ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55900,6 +64631,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR) ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55912,6 +64663,70 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_YIELD_SPEC_CONST_VAR) ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CONST_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CONST_UNUSED) ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -55964,6 +64779,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56644,6 +65479,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56684,6 +65535,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56840,6 +65711,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56864,6 +65751,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56876,6 +65783,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56924,6 +65847,26 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57158,6 +66101,54 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST) ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST): VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57190,6 +66181,54 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_IN_ARRAY_SPEC_TMP_CONST) ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR): VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57230,6 +66269,54 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_YIELD_SPEC_TMP_VAR) ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED): VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57496,6 +66583,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST) ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57508,6 +66599,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST) ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57520,6 +66615,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST) ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57532,6 +66631,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST) ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57544,6 +66647,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CONST) ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57556,6 +66663,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CONST) ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57568,6 +66679,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST) ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57580,6 +66695,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST) ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57592,6 +66711,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST) ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57604,6 +66727,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST) ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57616,6 +66743,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CONST): VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CONST) ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57628,6 +66759,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ) ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_VAR_CONST): VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57720,6 +66855,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED) ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57764,6 +66907,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR) ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57776,6 +66923,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR) ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57788,6 +66939,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR) ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57800,6 +66955,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR) ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57812,6 +66971,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR) ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57824,6 +66987,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR) ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57836,6 +67003,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR) ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57848,6 +67019,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR) ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57860,6 +67035,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR) ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57872,6 +67051,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR) ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57884,6 +67067,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57896,6 +67083,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -57980,6 +67171,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58048,50 +67247,98 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM) ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED): VM_TRACE(ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58404,6 +67651,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_REF_SPEC_VAR_CV) ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58560,6 +67815,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CONST): VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_CONST) ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58700,6 +67963,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR): VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58880,6 +68151,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV) ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CV): VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_CV) ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59218,6 +68497,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CONST) ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59230,6 +68513,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CONST) ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59242,6 +68529,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CONST) ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59254,6 +68545,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CONST) ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59266,6 +68561,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CONST) ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59278,6 +68577,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CONST) ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59290,6 +68593,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST) ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59302,6 +68609,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST) ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59314,6 +68625,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST) ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59326,6 +68641,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST) ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59338,6 +68657,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CONST): VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CONST) ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59350,6 +68673,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ) ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_CV_CONST): VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_CV_CONST) ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59366,6 +68693,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_CV_CONST) ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59454,6 +68797,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST): VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST) ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59478,6 +68837,18 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED) ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CONST) ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59630,6 +69001,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR) ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59642,6 +69017,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR) ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59654,6 +69033,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR) ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59666,6 +69049,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR) ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59678,6 +69065,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR) ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59690,6 +69081,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR) ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59702,6 +69097,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR) ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59714,6 +69113,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR) ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59726,6 +69129,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR) ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59738,6 +69145,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR) ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59750,6 +69161,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR): VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59762,6 +69177,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR): VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59858,6 +69277,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_TMPVAR): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59922,6 +69349,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR) ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59946,6 +69389,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR) ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED): VM_TRACE(ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED) ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59958,6 +69417,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR) ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -59978,50 +69441,114 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM): VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM) ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP): + VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP) + ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CV_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CV_UNUSED) ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -60082,6 +69609,22 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST): VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -60098,6 +69641,10 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED): VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -60502,6 +70049,14 @@ zend_leave_helper_SPEC_LABEL: VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_CV) ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV) + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CV): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CV) ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -61074,6 +70629,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61081,22 +70649,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61104,45 +70669,59 @@ void zend_vm_init(void) ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER, @@ -61150,6 +70729,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61157,21 +70749,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61179,45 +70769,59 @@ void zend_vm_init(void) ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER, @@ -61225,6 +70829,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61232,21 +70849,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61254,45 +70869,59 @@ void zend_vm_init(void) ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER, @@ -61300,6 +70929,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61307,21 +70949,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61329,45 +70969,59 @@ void zend_vm_init(void) ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER, @@ -61375,6 +71029,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61382,21 +71049,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61404,45 +71069,59 @@ void zend_vm_init(void) ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER, @@ -61450,6 +71129,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61457,21 +71149,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61479,45 +71169,59 @@ void zend_vm_init(void) ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER, @@ -61525,6 +71229,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61532,21 +71249,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61554,45 +71269,59 @@ void zend_vm_init(void) ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER, @@ -61600,6 +71329,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61607,21 +71349,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61629,45 +71369,59 @@ void zend_vm_init(void) ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER, @@ -61675,6 +71429,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61682,21 +71449,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61704,45 +71469,59 @@ void zend_vm_init(void) ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER, @@ -61750,6 +71529,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61757,21 +71549,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61779,45 +71569,59 @@ void zend_vm_init(void) ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER, @@ -61825,6 +71629,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61832,21 +71649,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -61854,45 +71669,59 @@ void zend_vm_init(void) ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER, @@ -61900,6 +71729,7 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER, ZEND_NULL_HANDLER, @@ -63263,6 +73093,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -63270,22 +73113,19 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_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_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -63293,48 +73133,63 @@ void zend_vm_init(void) ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER, ZEND_COALESCE_SPEC_CONST_HANDLER, ZEND_COALESCE_SPEC_TMPVAR_HANDLER, @@ -63648,6 +73503,381 @@ void zend_vm_init(void) ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + 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_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_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + 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_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, ZEND_JMP_FORWARD_SPEC_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -64568,183 +74798,190 @@ void zend_vm_init(void) 461 | SPEC_RULE_OP1, 466 | SPEC_RULE_OP1, 471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 546 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 621 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 696 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 571 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 671 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 771 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 846 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 921 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 996 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 871 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 971 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 1071 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1146 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1221 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1296 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1306 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1316 | SPEC_RULE_OP1, - 1321 | SPEC_RULE_OP1, - 1326 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, - 1376 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1401 | SPEC_RULE_OP1, - 1406, - 1407, - 1408 | SPEC_RULE_OP1, - 1413 | SPEC_RULE_OP1, - 1418 | SPEC_RULE_OP1, - 1423 | SPEC_RULE_OP1, - 1428 | SPEC_RULE_OP1, - 1433 | SPEC_RULE_OP2, - 1438, - 1439 | SPEC_RULE_QUICK_ARG, - 1441 | SPEC_RULE_OP1, - 1446 | SPEC_RULE_OP1, - 1451 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1476 | SPEC_RULE_OP2, - 1481 | SPEC_RULE_OP2, - 1486 | SPEC_RULE_OP2, - 1491, - 1492, - 1493, - 1494 | SPEC_RULE_RETVAL, - 1496, - 1497 | SPEC_RULE_OP1, - 1502, - 1503, - 1504 | SPEC_RULE_OP1, - 1509 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1519 | SPEC_RULE_OP1, - 1524 | SPEC_RULE_OP1, - 1529, - 1530, - 1531 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1556 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1581 | SPEC_RULE_OP1, - 1586 | SPEC_RULE_OP1, - 1591 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1616 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1641 | SPEC_RULE_OP1, - 1646, - 1647 | SPEC_RULE_OP1, - 1652 | SPEC_RULE_OP1, - 1657 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1682 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1707 | SPEC_RULE_OP1, - 1712 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1737 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1762 | SPEC_RULE_OP1, - 1767 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1792 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1817 | SPEC_RULE_OP1, - 1822 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1847 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1872 | SPEC_RULE_OP1, - 1877 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1902 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1171 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1271 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1371 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1571 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1581 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1591 | SPEC_RULE_OP1, + 1596 | SPEC_RULE_OP1, + 1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, + 1651 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1676 | SPEC_RULE_OP1, + 1681, + 1682, + 1683 | SPEC_RULE_OP1, + 1688 | SPEC_RULE_OP1, + 1693 | SPEC_RULE_OP1, + 1698 | SPEC_RULE_OP1, + 1703 | SPEC_RULE_OP1, + 1708 | SPEC_RULE_OP2, + 1713, + 1714 | SPEC_RULE_QUICK_ARG, + 1716 | SPEC_RULE_OP1, + 1721 | SPEC_RULE_OP1, + 1726 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1751 | SPEC_RULE_OP2, + 1756 | SPEC_RULE_OP2, + 1761 | SPEC_RULE_OP2, + 1766, + 1767, + 1768, + 1769 | SPEC_RULE_RETVAL, + 1771, + 1772 | SPEC_RULE_OP1, + 1777, + 1778, + 1779 | SPEC_RULE_OP1, + 1784 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1794 | SPEC_RULE_OP1, + 1799 | SPEC_RULE_OP1, + 1804, + 1805, + 1806 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1831 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1856 | SPEC_RULE_OP1, + 1861 | SPEC_RULE_OP1, + 1866 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1891 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1916 | SPEC_RULE_OP1, + 1921, + 1922 | SPEC_RULE_OP1, 1927 | SPEC_RULE_OP1, 1932 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 1957 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1982 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2007, - 2008 | SPEC_RULE_QUICK_ARG, - 2010, - 2011, - 2012, - 2013, - 2014, - 2015, - 2016, - 2017 | SPEC_RULE_OP1, - 2022 | SPEC_RULE_OP2, - 2027 | SPEC_RULE_OP1, - 2032 | SPEC_RULE_OP1, - 2037 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2062 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2087 | SPEC_RULE_OP1, - 2092 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2117 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2127 | SPEC_RULE_OP1, - 2132 | SPEC_RULE_OP2, - 2137, - 2138 | SPEC_RULE_OP1, - 2143 | SPEC_RULE_OP1, - 2148, - 2149 | SPEC_RULE_OP1, - 2154 | SPEC_RULE_OP1, - 2159 | SPEC_RULE_OP1, - 2164, - 2165, - 2166 | SPEC_RULE_OP2, - 2171 | SPEC_RULE_RETVAL, - 2173 | SPEC_RULE_RETVAL, - 2175 | SPEC_RULE_RETVAL, + 1982 | SPEC_RULE_OP1, + 1987 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2012 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2037 | SPEC_RULE_OP1, + 2042 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2067 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2092 | SPEC_RULE_OP1, + 2097 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2122 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2147 | SPEC_RULE_OP1, + 2152 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2177 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2252 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2277 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2402, - 2403 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2428, - 2429, - 2430, - 2431 | SPEC_RULE_OP1, - 2436, - 3941, - 2437, - 3941, - 2438 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2563 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2588, - 2589, - 2590, - 2591 | SPEC_RULE_OP1, - 2596, - 3941, - 3941, - 2597, - 2598, - 2599, - 2600, - 2601 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2626 | SPEC_RULE_OP1, - 2631, - 2632, - 2633, - 2634, - 2635 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2660 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 2735, - 2736 | SPEC_RULE_OP1, - 2741 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2766, - 2767, - 2768 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2793 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2818 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2843 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2868 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2893 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2918 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2943 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2968 | SPEC_RULE_OP1, - 2973, - 2974, - 2975, - 2976, - 2977, - 2978 | SPEC_RULE_OP1, - 2983 | SPEC_RULE_OP1, - 2988 | SPEC_RULE_OP1, - 2993 | SPEC_RULE_OP1, - 2998 | SPEC_RULE_OP1, - 3003, - 3004 | SPEC_RULE_OP1, - 3009, - 3010 | SPEC_RULE_OP1, - 3015, - 3016 | SPEC_RULE_ISSET, - 3018 | SPEC_RULE_OP2, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3941 + 2202 | SPEC_RULE_OP1, + 2207 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2232 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2282, + 2283 | SPEC_RULE_QUICK_ARG, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292 | SPEC_RULE_OP1, + 2297 | SPEC_RULE_OP2, + 2302 | SPEC_RULE_OP1, + 2307 | SPEC_RULE_OP1, + 2312 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2337 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2362 | SPEC_RULE_OP1, + 2367 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2392 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2402 | SPEC_RULE_OP1, + 2407 | SPEC_RULE_OP2, + 2412, + 2413 | SPEC_RULE_OP1, + 2418 | SPEC_RULE_OP1, + 2423, + 2424 | SPEC_RULE_OP1, + 2429 | SPEC_RULE_OP1, + 2434 | SPEC_RULE_OP1, + 2439, + 2440, + 2441 | SPEC_RULE_OP2, + 2446 | SPEC_RULE_RETVAL, + 2448 | SPEC_RULE_RETVAL, + 2450 | SPEC_RULE_RETVAL, + 2452 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2477 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2527 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2552 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2677, + 2678 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2703, + 2704, + 2705, + 2706 | SPEC_RULE_OP1, + 2711, + 4616, + 2712, + 4616, + 2713 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2838 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2863, + 2864, + 2865, + 2866 | SPEC_RULE_OP1, + 2871, + 4616, + 4616, + 2872, + 2873, + 2874, + 2875, + 2876 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2901 | SPEC_RULE_OP1, + 2906, + 2907, + 2908, + 2909, + 2910 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2935 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3035, + 3036 | SPEC_RULE_OP1, + 3041 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3066, + 3067, + 3068 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3093 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3118 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3143 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3168 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3193 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3218 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3243 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3268 | SPEC_RULE_OP1, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278 | SPEC_RULE_OP1, + 3283 | SPEC_RULE_OP1, + 3288 | SPEC_RULE_OP1, + 3293 | SPEC_RULE_OP1, + 3298 | SPEC_RULE_OP1, + 3303, + 3304 | SPEC_RULE_OP1, + 3309, + 3310 | SPEC_RULE_OP1, + 3315, + 3316 | SPEC_RULE_ISSET, + 3318 | SPEC_RULE_OP2, + 3323 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3598 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3623 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3648 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3673 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3698 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4616 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -64853,11 +75090,13 @@ static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, co } else if (spec & SPEC_RULE_OP_DATA) { offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type]; } else if (spec & SPEC_RULE_DIM_OBJ) { - offset = offset * 3; + offset = offset * 4; if (op->extended_value == ZEND_ASSIGN_DIM) { offset += 1; } else if (op->extended_value == ZEND_ASSIGN_OBJ) { offset += 2; + } else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) { + offset += 3; } } else if (spec & SPEC_RULE_ISSET) { offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY); @@ -64947,7 +75186,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3049 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3724 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -64955,7 +75194,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3074 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3749 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -64963,7 +75202,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3099 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3774 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -64974,17 +75213,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3124 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3799 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3149 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3824 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3174 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3849 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -64995,17 +75234,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3199 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3874 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3224 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3899 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3249 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3924 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -65016,12 +75255,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3274 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3949 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3349 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4024 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -65032,12 +75271,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3424 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4099 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3499 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4174 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -65045,12 +75284,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3574 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4249 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3649 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4324 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -65058,75 +75297,75 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3724 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4399 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3799 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4474 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 3892 | SPEC_RULE_OP1; + spec = 4567 | SPEC_RULE_OP1; } else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 3897 | SPEC_RULE_OP1; + spec = 4572 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3874 | SPEC_RULE_RETVAL; + spec = 4549 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3876 | SPEC_RULE_RETVAL; + spec = 4551 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 3878 | SPEC_RULE_RETVAL; + spec = 4553 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3880 | SPEC_RULE_RETVAL; + spec = 4555 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3882 | SPEC_RULE_RETVAL; + spec = 4557 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 3884 | SPEC_RULE_RETVAL; + spec = 4559 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3886; + spec = 4561; } else if (op1_info == MAY_BE_LONG) { - spec = 3887; + spec = 4562; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 3888; + spec = 4563; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3889; + spec = 4564; } else if (op1_info == MAY_BE_LONG) { - spec = 3890; + spec = 4565; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 3891; + spec = 4566; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3048; + spec = 3723; } break; case ZEND_SEND_VAL: if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3937; + spec = 4612; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3932 | SPEC_RULE_OP1; + spec = 4607 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 3939 | SPEC_RULE_RETVAL; + spec = 4614 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -65134,17 +75373,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3902 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4577 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAL_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3938; + spec = 4613; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3927 | SPEC_RULE_OP1; + spec = 4602 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index d1092788d4b..cbba3732019 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -76,6 +76,8 @@ $vm_op_flags = array( "ZEND_VM_EXT_CACHE_SLOT" => 1<<18, "ZEND_VM_EXT_ARRAY_INIT" => 1<<19, "ZEND_VM_EXT_REF" => 1<<20, + "ZEND_VM_EXT_FETCH_REF" => 1<<21, + "ZEND_VM_EXT_DIM_OBJ_WRITE" => 1<<22, "ZEND_VM_EXT_MASK" => 0x0f000000, "ZEND_VM_EXT_NUM" => 0x01000000, "ZEND_VM_EXT_LAST_CATCH" => 0x02000000, @@ -129,8 +131,10 @@ $vm_ext_decode = array( "TYPE_MASK" => ZEND_VM_EXT_TYPE_MASK, "ISSET" => ZEND_VM_EXT_ISSET, "REF" => ZEND_VM_EXT_REF, + "FETCH_REF" => ZEND_VM_EXT_FETCH_REF, "SRC" => ZEND_VM_EXT_SRC, "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT, + "DIM_OBJ_WRITE" => ZEND_VM_EXT_DIM_OBJ_WRITE, ); $vm_kind_name = array( @@ -567,6 +571,17 @@ $op_data_get_zval_ptr_deref = array( "TMPVARCV" => "???", ); +$op_data_get_zval_ptr_ptr = array( + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1)", + "TMP" => "NULL", + "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)", + "CONST" => "NULL", + "UNUSED" => "NULL", + "CV" => "_get_zval_ptr_cv_\\1((opline+1)->op1.var EXECUTE_DATA_CC)", + "TMPVAR" => "???", + "TMPVARCV" => "???", +); + $op_data_free_op = array( "ANY" => "FREE_OP(free_op_data)", "TMP" => "zval_ptr_dtor_nogc(free_op_data)", @@ -578,6 +593,17 @@ $op_data_free_op = array( "TMPVARCV" => "???", ); +$op_data_free_op_var_ptr = array( + "ANY" => "if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}", + "TMP" => "", + "VAR" => "if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}", + "CONST" => "", + "UNUSED" => "", + "CV" => "", + "TMPVAR" => "???", + "TMPVARCV" => "???", +); + $op_data_free_unfetched = array( "ANY" => "FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var)", "TMP" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))", @@ -669,9 +695,11 @@ function helper_name($name, $spec, $op1, $op2, $extra_spec) { return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra; } -function opcode_name($name, $spec, $op1, $op2) { +function opcode_name($name, $spec, $op1, $op2, $extra_spec) { global $prefix, $opnames, $opcodes; + $extra = ""; + if (isset($opnames[$name])) { $opcode = $opcodes[$opnames[$name]]; // If we haven't helper with specified spicialized operands then @@ -710,8 +738,12 @@ function opcode_name($name, $spec, $op1, $op2) { return "ZEND_NULL"; } } + /* forward common specs (e.g. in ZEND_VM_DISPATCH_TO_HANDLER) */ + if (isset($extra_spec, $opcode["spec"])) { + $extra = extra_spec_name(array_intersect_key($extra_spec, $opcode["spec"])); + } } - return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]; + return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra; } // Formats condition, protecting it by parentheses when needed. @@ -742,8 +774,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op1_free, $op2_free, $op1_free_unfetched, $op2_free_unfetched, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, - $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref, - $op_data_free_op, $op_data_free_unfetched; + $op_data_type, $op_data_get_zval_ptr, + $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, + $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched; // Specializing $code = preg_replace( @@ -793,7 +826,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/OP_DATA_TYPE/", "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/", "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/", + "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/", "/FREE_OP_DATA\(\)/", + "/FREE_OP_DATA_VAR_PTR\(\)/", "/FREE_UNFETCHED_OP_DATA\(\)/", "/RETURN_VALUE_USED\(opline\)/", "/arg_num <= MAX_ARG_FLAG_NUM/", @@ -801,6 +836,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/opline->extended_value\s*==\s*0/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/", + "/opline->extended_value\s*==\s*ZEND_ASSIGN_STATIC_PROP/", "/opline->extended_value\s*&\s*ZEND_ISEMPTY/", "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/", ), @@ -850,7 +886,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)", isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM", @@ -869,6 +907,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp isset($extra_spec['DIM_OBJ']) ? ($extra_spec['DIM_OBJ'] == 2 ? "1" : "0") : "\\0", + isset($extra_spec['DIM_OBJ']) ? + ($extra_spec['DIM_OBJ'] == 3 ? "1" : "0") + : "\\0", isset($extra_spec['ISSET']) ? ($extra_spec['ISSET'] == 0 ? "0" : "1") : "\\0", @@ -929,7 +970,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))"; + return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -953,7 +994,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_LABEL"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -977,7 +1018,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_LABEL"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -1055,7 +1096,9 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) { } if (isset($extra_spec["DIM_OBJ"]) && - (($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1) || + ((($op1 == "CONST" || $op1 == "TMP") && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1 && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "CV" && $extra_spec["DIM_OBJ"] == 3) || ($op1 == "UNUSED" && $extra_spec["DIM_OBJ"] != 2))) { // Skip useless handlers return true; @@ -1579,6 +1622,8 @@ function extra_spec_name($extra_spec) { $s .= "_DIM"; } else if ($extra_spec["DIM_OBJ"] == 2) { $s .= "_OBJ"; + } else if ($extra_spec["DIM_OBJ"] == 3) { + $s .= "_STATIC_PROP"; } } if (isset($extra_spec["ISSET"])) { @@ -2281,7 +2326,7 @@ function parse_spec_rules($def, $lineno, $str) { $ret["SMART_BRANCH"] = array(0, 1, 2); break; case "DIM_OBJ": - $ret["DIM_OBJ"] = array(0, 1, 2); + $ret["DIM_OBJ"] = array(0, 1, 2, 3); break; case "NO_CONST_CONST": $ret["NO_CONST_CONST"] = array(1); @@ -2722,11 +2767,13 @@ function gen_vm($def, $skel) { } if (isset($used_extra_spec["DIM_OBJ"])) { out($f, "\t\t{$else}if (spec & SPEC_RULE_DIM_OBJ) {\n"); - out($f, "\t\t\toffset = offset * 3;\n"); + out($f, "\t\t\toffset = offset * 4;\n"); out($f, "\t\t\tif (op->extended_value == ZEND_ASSIGN_DIM) {\n"); out($f, "\t\t\t\toffset += 1;\n"); out($f, "\t\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n"); out($f, "\t\t\t\toffset += 2;\n"); + out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) {\n"); + out($f, "\t\t\toffset += 3;\n"); out($f, "\t\t\t}\n"); $else = "} else "; } diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 65342d343bc..93e0c6ffeb7 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -256,1816 +256,2140 @@ _(467, ZEND_QM_ASSIGN_SPEC_TMP) \ _(468, ZEND_QM_ASSIGN_SPEC_VAR) \ _(470, ZEND_QM_ASSIGN_SPEC_CV) \ - _(501, ZEND_ASSIGN_ADD_SPEC_VAR_CONST) \ - _(502, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM) \ - _(503, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ) \ - _(504, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR) \ - _(505, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM) \ - _(506, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ) \ - _(507, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR) \ - _(508, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM) \ - _(509, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ) \ - _(511, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM) \ - _(513, ZEND_ASSIGN_ADD_SPEC_VAR_CV) \ - _(514, ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM) \ - _(515, ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ) \ - _(518, ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ) \ - _(521, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ) \ - _(524, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ) \ - _(530, ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ) \ - _(531, ZEND_ASSIGN_ADD_SPEC_CV_CONST) \ - _(532, ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM) \ - _(533, ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ) \ - _(534, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR) \ - _(535, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM) \ - _(536, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ) \ - _(537, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR) \ - _(538, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM) \ - _(539, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ) \ - _(541, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM) \ - _(543, ZEND_ASSIGN_ADD_SPEC_CV_CV) \ - _(544, ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM) \ - _(545, ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ) \ - _(576, ZEND_ASSIGN_SUB_SPEC_VAR_CONST) \ - _(577, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM) \ - _(578, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ) \ - _(579, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR) \ - _(580, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM) \ - _(581, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ) \ - _(582, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR) \ - _(583, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM) \ - _(584, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ) \ - _(586, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM) \ - _(588, ZEND_ASSIGN_SUB_SPEC_VAR_CV) \ - _(589, ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM) \ - _(590, ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ) \ - _(593, ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ) \ - _(596, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ) \ - _(599, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ) \ - _(605, ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ) \ - _(606, ZEND_ASSIGN_SUB_SPEC_CV_CONST) \ - _(607, ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM) \ - _(608, ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ) \ - _(609, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR) \ - _(610, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM) \ - _(611, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ) \ - _(612, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR) \ - _(613, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM) \ - _(614, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ) \ - _(616, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM) \ - _(618, ZEND_ASSIGN_SUB_SPEC_CV_CV) \ - _(619, ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM) \ - _(620, ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ) \ - _(651, ZEND_ASSIGN_MUL_SPEC_VAR_CONST) \ - _(652, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM) \ - _(653, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ) \ - _(654, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR) \ - _(655, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM) \ - _(656, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ) \ - _(657, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR) \ - _(658, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM) \ - _(659, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ) \ - _(661, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM) \ - _(663, ZEND_ASSIGN_MUL_SPEC_VAR_CV) \ - _(664, ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM) \ - _(665, ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ) \ - _(668, ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ) \ - _(671, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ) \ - _(674, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ) \ - _(680, ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ) \ - _(681, ZEND_ASSIGN_MUL_SPEC_CV_CONST) \ - _(682, ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM) \ - _(683, ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ) \ - _(684, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR) \ - _(685, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM) \ - _(686, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ) \ - _(687, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR) \ - _(688, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM) \ - _(689, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ) \ - _(691, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM) \ - _(693, ZEND_ASSIGN_MUL_SPEC_CV_CV) \ - _(694, ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM) \ - _(695, ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ) \ - _(726, ZEND_ASSIGN_DIV_SPEC_VAR_CONST) \ - _(727, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM) \ - _(728, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ) \ - _(729, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR) \ - _(730, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM) \ - _(731, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ) \ - _(732, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR) \ - _(733, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM) \ - _(734, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ) \ - _(736, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM) \ - _(738, ZEND_ASSIGN_DIV_SPEC_VAR_CV) \ - _(739, ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM) \ - _(740, ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ) \ - _(743, ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ) \ - _(746, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ) \ - _(749, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ) \ - _(755, ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ) \ - _(756, ZEND_ASSIGN_DIV_SPEC_CV_CONST) \ - _(757, ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM) \ - _(758, ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ) \ - _(759, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR) \ - _(760, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM) \ - _(761, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ) \ - _(762, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR) \ - _(763, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM) \ - _(764, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ) \ - _(766, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM) \ - _(768, ZEND_ASSIGN_DIV_SPEC_CV_CV) \ - _(769, ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM) \ - _(770, ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ) \ - _(801, ZEND_ASSIGN_MOD_SPEC_VAR_CONST) \ - _(802, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM) \ - _(803, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ) \ - _(804, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR) \ - _(805, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM) \ - _(806, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ) \ - _(807, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR) \ - _(808, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM) \ - _(809, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ) \ - _(811, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM) \ - _(813, ZEND_ASSIGN_MOD_SPEC_VAR_CV) \ - _(814, ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM) \ - _(815, ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ) \ - _(818, ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ) \ - _(821, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ) \ - _(824, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ) \ - _(830, ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ) \ - _(831, ZEND_ASSIGN_MOD_SPEC_CV_CONST) \ - _(832, ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM) \ - _(833, ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ) \ - _(834, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR) \ - _(835, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM) \ - _(836, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ) \ - _(837, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR) \ - _(838, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM) \ - _(839, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ) \ - _(841, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM) \ - _(843, ZEND_ASSIGN_MOD_SPEC_CV_CV) \ - _(844, ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM) \ - _(845, ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ) \ - _(876, ZEND_ASSIGN_SL_SPEC_VAR_CONST) \ - _(877, ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM) \ - _(878, ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ) \ - _(879, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR) \ - _(880, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM) \ - _(881, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ) \ - _(882, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR) \ - _(883, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM) \ - _(884, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ) \ - _(886, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM) \ - _(888, ZEND_ASSIGN_SL_SPEC_VAR_CV) \ - _(889, ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM) \ - _(890, ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ) \ - _(893, ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ) \ - _(896, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ) \ - _(899, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ) \ - _(905, ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ) \ - _(906, ZEND_ASSIGN_SL_SPEC_CV_CONST) \ - _(907, ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM) \ - _(908, ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ) \ - _(909, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR) \ - _(910, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM) \ - _(911, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ) \ - _(912, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR) \ - _(913, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM) \ - _(914, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ) \ - _(916, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM) \ - _(918, ZEND_ASSIGN_SL_SPEC_CV_CV) \ - _(919, ZEND_ASSIGN_SL_SPEC_CV_CV_DIM) \ - _(920, ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ) \ - _(951, ZEND_ASSIGN_SR_SPEC_VAR_CONST) \ - _(952, ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM) \ - _(953, ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ) \ - _(954, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR) \ - _(955, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM) \ - _(956, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ) \ - _(957, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR) \ - _(958, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM) \ - _(959, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ) \ - _(961, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM) \ - _(963, ZEND_ASSIGN_SR_SPEC_VAR_CV) \ - _(964, ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM) \ - _(965, ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ) \ - _(968, ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ) \ - _(971, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(974, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(980, ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ) \ - _(981, ZEND_ASSIGN_SR_SPEC_CV_CONST) \ - _(982, ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM) \ - _(983, ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ) \ - _(984, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR) \ - _(985, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM) \ - _(986, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ) \ - _(987, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR) \ - _(988, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM) \ - _(989, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ) \ - _(991, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM) \ - _(993, ZEND_ASSIGN_SR_SPEC_CV_CV) \ - _(994, ZEND_ASSIGN_SR_SPEC_CV_CV_DIM) \ - _(995, ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ) \ - _(1026, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST) \ - _(1027, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM) \ - _(1028, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ) \ - _(1029, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR) \ - _(1030, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM) \ - _(1031, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ) \ - _(1032, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR) \ - _(1033, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM) \ - _(1034, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ) \ - _(1036, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM) \ - _(1038, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV) \ - _(1039, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM) \ - _(1040, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ) \ - _(1043, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ) \ - _(1046, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1049, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1055, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ) \ - _(1056, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST) \ - _(1057, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM) \ - _(1058, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ) \ - _(1059, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR) \ - _(1060, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM) \ - _(1061, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ) \ - _(1062, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR) \ - _(1063, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM) \ - _(1064, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ) \ - _(1066, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM) \ - _(1068, ZEND_ASSIGN_CONCAT_SPEC_CV_CV) \ - _(1069, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM) \ - _(1070, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ) \ - _(1101, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST) \ - _(1102, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM) \ - _(1103, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ) \ - _(1104, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR) \ - _(1105, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM) \ - _(1106, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ) \ - _(1107, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR) \ - _(1108, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM) \ - _(1109, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ) \ - _(1111, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM) \ - _(1113, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV) \ - _(1114, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM) \ - _(1115, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ) \ - _(1118, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ) \ - _(1121, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1124, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1130, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ) \ - _(1131, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST) \ - _(1132, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM) \ - _(1133, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ) \ - _(1134, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR) \ - _(1135, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM) \ - _(1136, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ) \ - _(1137, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR) \ - _(1138, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM) \ - _(1139, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ) \ - _(1141, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM) \ - _(1143, ZEND_ASSIGN_BW_OR_SPEC_CV_CV) \ - _(1144, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM) \ - _(1145, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ) \ - _(1176, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST) \ - _(1177, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM) \ - _(1178, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ) \ - _(1179, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR) \ - _(1180, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM) \ - _(1181, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ) \ - _(1182, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR) \ - _(1183, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM) \ - _(1184, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ) \ - _(1186, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM) \ - _(1188, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV) \ - _(1189, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM) \ - _(1190, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ) \ - _(1193, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ) \ - _(1196, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1199, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1205, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ) \ - _(1206, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST) \ - _(1207, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM) \ - _(1208, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ) \ - _(1209, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR) \ - _(1210, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM) \ - _(1211, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ) \ - _(1212, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR) \ - _(1213, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM) \ - _(1214, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ) \ - _(1216, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM) \ - _(1218, ZEND_ASSIGN_BW_AND_SPEC_CV_CV) \ - _(1219, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM) \ - _(1220, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ) \ - _(1251, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST) \ - _(1252, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM) \ - _(1253, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ) \ - _(1254, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR) \ - _(1255, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM) \ - _(1256, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ) \ - _(1257, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR) \ - _(1258, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM) \ - _(1259, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ) \ - _(1261, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM) \ - _(1263, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV) \ - _(1264, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM) \ - _(1265, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ) \ - _(1268, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ) \ - _(1271, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1274, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ) \ - _(1280, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ) \ - _(1281, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST) \ - _(1282, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM) \ - _(1283, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ) \ - _(1284, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR) \ - _(1285, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM) \ - _(1286, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ) \ - _(1287, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR) \ - _(1288, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM) \ - _(1289, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ) \ - _(1291, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM) \ - _(1293, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV) \ - _(1294, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM) \ - _(1295, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ) \ - _(1300, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED) \ - _(1301, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED) \ - _(1304, ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED) \ - _(1305, ZEND_PRE_INC_SPEC_CV_RETVAL_USED) \ - _(1310, ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED) \ - _(1311, ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED) \ - _(1314, ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED) \ - _(1315, ZEND_PRE_DEC_SPEC_CV_RETVAL_USED) \ - _(1318, ZEND_POST_INC_SPEC_VAR) \ - _(1320, ZEND_POST_INC_SPEC_CV) \ - _(1323, ZEND_POST_DEC_SPEC_VAR) \ - _(1325, ZEND_POST_DEC_SPEC_CV) \ - _(1346, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED) \ - _(1347, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED) \ - _(1348, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED) \ - _(1349, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED) \ - _(1350, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED) \ - _(1351, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED) \ - _(1354, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(1355, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED) \ - _(1366, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED) \ - _(1367, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED) \ - _(1368, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED) \ - _(1369, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED) \ - _(1370, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED) \ - _(1371, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED) \ - _(1374, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED) \ - _(1375, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED) \ - _(1388, ZEND_ASSIGN_REF_SPEC_VAR_VAR) \ - _(1390, ZEND_ASSIGN_REF_SPEC_VAR_CV) \ - _(1398, ZEND_ASSIGN_REF_SPEC_CV_VAR) \ - _(1400, ZEND_ASSIGN_REF_SPEC_CV_CV) \ - _(1401, ZEND_ECHO_SPEC_CONST) \ - _(1402, ZEND_ECHO_SPEC_TMPVAR) \ - _(1403, ZEND_ECHO_SPEC_TMPVAR) \ - _(1405, ZEND_ECHO_SPEC_CV) \ - _(1406, ZEND_GENERATOR_CREATE_SPEC) \ - _(1407, ZEND_JMP_SPEC) \ - _(1408, ZEND_JMPZ_SPEC_CONST) \ - _(1409, ZEND_JMPZ_SPEC_TMPVAR) \ - _(1410, ZEND_JMPZ_SPEC_TMPVAR) \ - _(1412, ZEND_JMPZ_SPEC_CV) \ - _(1413, ZEND_JMPNZ_SPEC_CONST) \ - _(1414, ZEND_JMPNZ_SPEC_TMPVAR) \ - _(1415, ZEND_JMPNZ_SPEC_TMPVAR) \ - _(1417, ZEND_JMPNZ_SPEC_CV) \ - _(1418, ZEND_JMPZNZ_SPEC_CONST) \ - _(1419, ZEND_JMPZNZ_SPEC_TMPVAR) \ - _(1420, ZEND_JMPZNZ_SPEC_TMPVAR) \ - _(1422, ZEND_JMPZNZ_SPEC_CV) \ - _(1423, ZEND_JMPZ_EX_SPEC_CONST) \ - _(1424, ZEND_JMPZ_EX_SPEC_TMPVAR) \ - _(1425, ZEND_JMPZ_EX_SPEC_TMPVAR) \ - _(1427, ZEND_JMPZ_EX_SPEC_CV) \ - _(1428, ZEND_JMPNZ_EX_SPEC_CONST) \ - _(1429, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ - _(1430, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ - _(1432, ZEND_JMPNZ_EX_SPEC_CV) \ - _(1433, ZEND_CASE_SPEC_TMPVAR_CONST) \ - _(1434, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ - _(1435, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ - _(1437, ZEND_CASE_SPEC_TMPVAR_CV) \ - _(1438, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \ - _(1439, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR) \ - _(1440, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK) \ - _(1443, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \ - _(1445, ZEND_MAKE_REF_SPEC_CV_UNUSED) \ - _(1446, ZEND_BOOL_SPEC_CONST) \ - _(1447, ZEND_BOOL_SPEC_TMPVAR) \ - _(1448, ZEND_BOOL_SPEC_TMPVAR) \ - _(1450, ZEND_BOOL_SPEC_CV) \ - _(1451, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \ - _(1452, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ - _(1453, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ - _(1455, ZEND_FAST_CONCAT_SPEC_CONST_CV) \ - _(1456, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ - _(1457, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1458, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1460, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ - _(1461, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ - _(1462, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1463, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1465, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ - _(1471, ZEND_FAST_CONCAT_SPEC_CV_CONST) \ - _(1472, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ - _(1473, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ - _(1475, ZEND_FAST_CONCAT_SPEC_CV_CV) \ - _(1476, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \ - _(1477, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ - _(1478, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ - _(1480, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \ - _(1481, ZEND_ROPE_ADD_SPEC_TMP_CONST) \ - _(1482, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ - _(1483, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ - _(1485, ZEND_ROPE_ADD_SPEC_TMP_CV) \ - _(1486, ZEND_ROPE_END_SPEC_TMP_CONST) \ - _(1487, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ - _(1488, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ - _(1490, ZEND_ROPE_END_SPEC_TMP_CV) \ - _(1491, ZEND_BEGIN_SILENCE_SPEC) \ - _(1492, ZEND_END_SILENCE_SPEC_TMP) \ - _(1493, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \ - _(1494, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \ - _(1495, ZEND_DO_FCALL_SPEC_RETVAL_USED) \ - _(1496, ZEND_INIT_FCALL_SPEC_CONST) \ - _(1497, ZEND_RETURN_SPEC_CONST) \ - _(1498, ZEND_RETURN_SPEC_TMP) \ - _(1499, ZEND_RETURN_SPEC_VAR) \ - _(1501, ZEND_RETURN_SPEC_CV) \ - _(1502, ZEND_RECV_SPEC_UNUSED) \ - _(1503, ZEND_RECV_INIT_SPEC_CONST) \ - _(1504, ZEND_SEND_VAL_SPEC_CONST) \ - _(1505, ZEND_SEND_VAL_SPEC_TMPVAR) \ - _(1506, ZEND_SEND_VAL_SPEC_TMPVAR) \ - _(1513, ZEND_SEND_VAR_EX_SPEC_VAR) \ - _(1514, ZEND_SEND_VAR_EX_SPEC_VAR_QUICK) \ - _(1517, ZEND_SEND_VAR_EX_SPEC_CV) \ - _(1518, ZEND_SEND_VAR_EX_SPEC_CV_QUICK) \ - _(1521, ZEND_SEND_REF_SPEC_VAR) \ - _(1523, ZEND_SEND_REF_SPEC_CV) \ - _(1524, ZEND_NEW_SPEC_CONST_UNUSED) \ - _(1526, ZEND_NEW_SPEC_VAR_UNUSED) \ - _(1527, ZEND_NEW_SPEC_UNUSED_UNUSED) \ - _(1529, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \ - _(1530, ZEND_FREE_SPEC_TMPVAR) \ - _(1531, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \ - _(1532, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ - _(1533, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ - _(1534, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \ - _(1535, ZEND_INIT_ARRAY_SPEC_CONST_CV) \ - _(1536, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \ - _(1537, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ - _(1538, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ - _(1539, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \ - _(1540, ZEND_INIT_ARRAY_SPEC_TMP_CV) \ - _(1541, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \ - _(1542, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ - _(1543, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ - _(1544, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \ - _(1545, ZEND_INIT_ARRAY_SPEC_VAR_CV) \ - _(1551, ZEND_INIT_ARRAY_SPEC_CV_CONST) \ - _(1552, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ - _(1553, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ - _(1554, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \ - _(1555, ZEND_INIT_ARRAY_SPEC_CV_CV) \ - _(1556, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \ - _(1557, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ - _(1558, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ - _(1559, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \ - _(1560, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \ - _(1561, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \ - _(1562, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ - _(1563, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ - _(1564, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \ - _(1565, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \ - _(1566, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \ - _(1567, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ - _(1568, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ - _(1569, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \ - _(1570, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \ - _(1576, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \ - _(1577, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ - _(1578, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ - _(1579, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \ - _(1580, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \ - _(1581, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \ - _(1582, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ - _(1583, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ - _(1585, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \ - _(1586, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \ - _(1587, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ - _(1588, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ - _(1590, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \ - _(1601, ZEND_UNSET_DIM_SPEC_VAR_CONST) \ - _(1602, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ - _(1603, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ - _(1605, ZEND_UNSET_DIM_SPEC_VAR_CV) \ - _(1611, ZEND_UNSET_DIM_SPEC_CV_CONST) \ - _(1612, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ - _(1613, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ - _(1615, ZEND_UNSET_DIM_SPEC_CV_CV) \ - _(1626, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \ - _(1627, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ - _(1628, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ - _(1630, ZEND_UNSET_OBJ_SPEC_VAR_CV) \ - _(1631, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \ - _(1632, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ - _(1633, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ - _(1635, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \ - _(1636, ZEND_UNSET_OBJ_SPEC_CV_CONST) \ - _(1637, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ - _(1638, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ - _(1640, ZEND_UNSET_OBJ_SPEC_CV_CV) \ - _(1641, ZEND_FE_RESET_R_SPEC_CONST) \ - _(1642, ZEND_FE_RESET_R_SPEC_TMP) \ - _(1643, ZEND_FE_RESET_R_SPEC_VAR) \ - _(1645, ZEND_FE_RESET_R_SPEC_CV) \ - _(1646, ZEND_FE_FETCH_R_SPEC_VAR) \ - _(1647, ZEND_EXIT_SPEC_CONST) \ - _(1648, ZEND_EXIT_SPEC_TMPVAR) \ - _(1649, ZEND_EXIT_SPEC_TMPVAR) \ - _(1650, ZEND_EXIT_SPEC_UNUSED) \ - _(1651, ZEND_EXIT_SPEC_CV) \ - _(1652, ZEND_FETCH_R_SPEC_CONST_UNUSED) \ - _(1653, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ - _(1654, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ - _(1656, ZEND_FETCH_R_SPEC_CV_UNUSED) \ - _(1657, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \ - _(1658, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ - _(1659, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ - _(1661, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \ - _(1662, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ - _(1663, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1664, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1666, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ - _(1667, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ - _(1668, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1669, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1671, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ - _(1677, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \ - _(1678, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ - _(1679, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ - _(1681, ZEND_FETCH_DIM_R_SPEC_CV_CV) \ - _(1682, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \ - _(1683, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ - _(1684, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ - _(1686, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \ - _(1687, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ - _(1688, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1689, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1691, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ - _(1692, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ - _(1693, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1694, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1696, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ - _(1697, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \ - _(1698, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ - _(1699, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ - _(1701, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \ - _(1702, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \ - _(1703, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ - _(1704, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ - _(1706, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \ - _(1707, ZEND_FETCH_W_SPEC_CONST_UNUSED) \ - _(1708, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ - _(1709, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ - _(1711, ZEND_FETCH_W_SPEC_CV_UNUSED) \ - _(1722, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \ - _(1723, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ - _(1724, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ - _(1725, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \ - _(1726, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \ - _(1732, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \ - _(1733, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ - _(1734, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ - _(1735, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \ - _(1736, ZEND_FETCH_DIM_W_SPEC_CV_CV) \ - _(1747, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \ - _(1748, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ - _(1749, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ - _(1751, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \ - _(1752, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \ - _(1753, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ - _(1754, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ - _(1756, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \ - _(1757, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \ - _(1758, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ - _(1759, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ - _(1761, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \ - _(1762, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \ - _(1763, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ - _(1764, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ - _(1766, ZEND_FETCH_RW_SPEC_CV_UNUSED) \ - _(1777, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \ - _(1778, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ - _(1779, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ - _(1780, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \ - _(1781, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \ - _(1787, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \ - _(1788, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ - _(1789, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ - _(1790, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \ - _(1791, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \ - _(1802, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \ - _(1803, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ - _(1804, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ - _(1806, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \ - _(1807, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \ - _(1808, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ - _(1809, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ - _(1811, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \ - _(1812, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \ - _(1813, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ - _(1814, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ - _(1816, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \ - _(1817, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \ - _(1818, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ - _(1819, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ - _(1821, ZEND_FETCH_IS_SPEC_CV_UNUSED) \ - _(1822, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \ - _(1823, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ - _(1824, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ - _(1826, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \ - _(1827, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ - _(1828, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1829, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1831, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ - _(1832, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ - _(1833, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1834, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1836, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ - _(1842, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \ - _(1843, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ - _(1844, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ - _(1846, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \ - _(1847, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \ - _(1848, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ - _(1849, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ - _(1851, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \ - _(1852, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ - _(1853, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1854, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1856, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ - _(1857, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ - _(1858, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1859, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1861, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ - _(1862, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \ - _(1863, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ - _(1864, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ - _(1866, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \ - _(1867, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \ - _(1868, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ - _(1869, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ - _(1871, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \ - _(1872, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \ - _(1873, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(1874, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(1876, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \ - _(1877, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \ - _(1878, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1879, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1880, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \ - _(1881, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \ - _(1882, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \ - _(1883, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1884, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1885, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \ - _(1886, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \ - _(1887, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \ - _(1888, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1889, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1890, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \ - _(1891, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \ - _(1897, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \ - _(1898, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1899, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1900, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \ - _(1901, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \ - _(1902, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \ - _(1903, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1904, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1906, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \ - _(1907, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \ - _(1908, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1909, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1911, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \ - _(1912, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \ - _(1913, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1914, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1916, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \ - _(1917, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \ - _(1918, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ - _(1919, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ - _(1921, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \ - _(1922, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \ - _(1923, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1924, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1926, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \ - _(1927, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \ - _(1928, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ - _(1929, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ - _(1931, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \ - _(1942, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \ - _(1943, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ - _(1944, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ - _(1946, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \ - _(1952, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \ - _(1953, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ - _(1954, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ - _(1956, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \ - _(1967, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \ - _(1968, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ - _(1969, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ - _(1971, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \ - _(1972, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \ - _(1973, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ - _(1974, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ - _(1976, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \ - _(1977, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \ - _(1978, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ - _(1979, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ - _(1981, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \ - _(1982, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \ - _(1983, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ - _(1984, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ - _(1986, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \ - _(1987, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ - _(1988, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1989, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1991, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(1992, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ - _(1993, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1994, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1996, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(2002, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ - _(2003, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(2004, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(2006, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(2007, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \ - _(2008, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED) \ - _(2009, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK) \ - _(2010, ZEND_EXT_STMT_SPEC) \ - _(2011, ZEND_EXT_FCALL_BEGIN_SPEC) \ - _(2012, ZEND_EXT_FCALL_END_SPEC) \ - _(2013, ZEND_EXT_NOP_SPEC) \ - _(2014, ZEND_TICKS_SPEC) \ - _(2015, ZEND_SEND_VAR_NO_REF_SPEC_VAR) \ - _(2016, ZEND_CATCH_SPEC_CONST) \ - _(2017, ZEND_THROW_SPEC_CONST) \ - _(2018, ZEND_THROW_SPEC_TMP) \ - _(2019, ZEND_THROW_SPEC_VAR) \ - _(2021, ZEND_THROW_SPEC_CV) \ - _(2022, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \ - _(2023, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ - _(2024, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ - _(2025, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \ - _(2026, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \ - _(2027, ZEND_CLONE_SPEC_CONST) \ - _(2028, ZEND_CLONE_SPEC_TMPVAR) \ - _(2029, ZEND_CLONE_SPEC_TMPVAR) \ - _(2030, ZEND_CLONE_SPEC_UNUSED) \ - _(2031, ZEND_CLONE_SPEC_CV) \ - _(2032, ZEND_RETURN_BY_REF_SPEC_CONST) \ - _(2033, ZEND_RETURN_BY_REF_SPEC_TMP) \ - _(2034, ZEND_RETURN_BY_REF_SPEC_VAR) \ - _(2036, ZEND_RETURN_BY_REF_SPEC_CV) \ - _(2037, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \ - _(2038, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2039, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2041, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \ - _(2042, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ - _(2043, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2044, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2046, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ - _(2047, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ - _(2048, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2049, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2051, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ - _(2052, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \ - _(2053, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2054, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2056, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \ - _(2057, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \ - _(2058, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ - _(2059, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ - _(2061, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \ - _(2062, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \ - _(2063, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2064, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2065, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \ - _(2066, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \ - _(2072, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \ - _(2073, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ - _(2074, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ - _(2075, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \ - _(2076, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \ - _(2077, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \ - _(2078, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2079, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2080, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \ - _(2081, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \ - _(2087, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \ - _(2088, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ - _(2089, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ - _(2091, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \ - _(2092, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \ - _(2093, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ - _(2094, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ - _(2096, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \ - _(2097, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ - _(2098, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2099, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2101, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ - _(2102, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ - _(2103, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2104, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2106, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ - _(2112, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \ - _(2113, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ - _(2114, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ - _(2116, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \ - _(2117, ZEND_SEND_VAL_EX_SPEC_CONST) \ - _(2118, ZEND_SEND_VAL_EX_SPEC_CONST_QUICK) \ - _(2119, ZEND_SEND_VAL_EX_SPEC_TMP) \ - _(2120, ZEND_SEND_VAL_EX_SPEC_TMP_QUICK) \ - _(2129, ZEND_SEND_VAR_SPEC_VAR) \ - _(2131, ZEND_SEND_VAR_SPEC_CV) \ - _(2132, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \ - _(2133, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ - _(2134, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ - _(2136, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \ - _(2137, ZEND_SEND_ARRAY_SPEC) \ - _(2138, ZEND_SEND_USER_SPEC_CONST) \ - _(2139, ZEND_SEND_USER_SPEC_TMP) \ - _(2140, ZEND_SEND_USER_SPEC_VAR) \ - _(2142, ZEND_SEND_USER_SPEC_CV) \ - _(2143, ZEND_STRLEN_SPEC_CONST) \ - _(2144, ZEND_STRLEN_SPEC_TMPVAR) \ - _(2145, ZEND_STRLEN_SPEC_TMPVAR) \ - _(2147, ZEND_STRLEN_SPEC_CV) \ - _(2148, ZEND_DEFINED_SPEC_CONST) \ - _(2149, ZEND_TYPE_CHECK_SPEC_CONST) \ - _(2150, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ - _(2151, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ - _(2153, ZEND_TYPE_CHECK_SPEC_CV) \ - _(2154, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \ - _(2155, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \ - _(2156, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \ - _(2157, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \ - _(2158, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \ - _(2159, ZEND_FE_RESET_RW_SPEC_CONST) \ - _(2160, ZEND_FE_RESET_RW_SPEC_TMP) \ - _(2161, ZEND_FE_RESET_RW_SPEC_VAR) \ - _(2163, ZEND_FE_RESET_RW_SPEC_CV) \ - _(2164, ZEND_FE_FETCH_RW_SPEC_VAR) \ - _(2165, ZEND_FE_FREE_SPEC_TMPVAR) \ - _(2166, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \ - _(2167, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ - _(2168, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ - _(2170, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \ - _(2171, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \ - _(2172, ZEND_DO_ICALL_SPEC_RETVAL_USED) \ - _(2173, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \ - _(2174, ZEND_DO_UCALL_SPEC_RETVAL_USED) \ - _(2175, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \ - _(2176, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \ - _(2187, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \ - _(2188, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2189, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2191, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \ - _(2192, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \ - _(2193, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2194, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2196, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \ - _(2197, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \ - _(2198, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2199, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2201, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \ - _(2212, ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST) \ - _(2213, ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR) \ - _(2214, ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR) \ - _(2216, ZEND_PRE_DEC_OBJ_SPEC_VAR_CV) \ - _(2217, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST) \ - _(2218, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2219, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2221, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV) \ - _(2222, ZEND_PRE_DEC_OBJ_SPEC_CV_CONST) \ - _(2223, ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR) \ - _(2224, ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR) \ - _(2226, ZEND_PRE_DEC_OBJ_SPEC_CV_CV) \ - _(2237, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \ - _(2238, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2239, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2241, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \ - _(2242, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \ - _(2243, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2244, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2246, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \ - _(2247, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \ - _(2248, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2249, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2251, ZEND_POST_INC_OBJ_SPEC_CV_CV) \ - _(2262, ZEND_POST_DEC_OBJ_SPEC_VAR_CONST) \ - _(2263, ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR) \ - _(2264, ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR) \ - _(2266, ZEND_POST_DEC_OBJ_SPEC_VAR_CV) \ - _(2267, ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST) \ - _(2268, ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2269, ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2271, ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV) \ - _(2272, ZEND_POST_DEC_OBJ_SPEC_CV_CONST) \ - _(2273, ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR) \ - _(2274, ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR) \ - _(2276, ZEND_POST_DEC_OBJ_SPEC_CV_CV) \ - _(2327, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST) \ - _(2328, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP) \ - _(2329, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR) \ - _(2331, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV) \ - _(2332, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ - _(2333, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ - _(2334, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ - _(2336, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \ - _(2337, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ - _(2338, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ - _(2339, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ - _(2341, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \ - _(2347, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST) \ - _(2348, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP) \ - _(2349, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR) \ - _(2351, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV) \ - _(2352, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST) \ - _(2353, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP) \ - _(2354, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR) \ - _(2356, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV) \ - _(2357, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \ - _(2358, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \ - _(2359, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ - _(2361, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ - _(2362, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \ - _(2363, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \ - _(2364, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ - _(2366, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ - _(2372, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST) \ - _(2373, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP) \ - _(2374, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR) \ - _(2376, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV) \ - _(2377, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST) \ - _(2378, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP) \ - _(2379, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR) \ - _(2381, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV) \ - _(2382, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \ - _(2383, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \ - _(2384, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \ - _(2386, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \ - _(2387, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \ - _(2388, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \ - _(2389, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \ - _(2391, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \ - _(2397, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST) \ - _(2398, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP) \ - _(2399, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR) \ - _(2401, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV) \ - _(2408, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ - _(2410, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ - _(2411, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ - _(2413, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ - _(2415, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ - _(2416, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ - _(2423, ZEND_INSTANCEOF_SPEC_CV_CONST) \ - _(2425, ZEND_INSTANCEOF_SPEC_CV_VAR) \ - _(2426, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \ - _(2428, ZEND_DECLARE_CLASS_SPEC_CONST) \ - _(2429, ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST) \ - _(2430, ZEND_DECLARE_FUNCTION_SPEC) \ - _(2431, ZEND_YIELD_FROM_SPEC_CONST) \ - _(2432, ZEND_YIELD_FROM_SPEC_TMP) \ - _(2433, ZEND_YIELD_FROM_SPEC_VAR) \ - _(2435, ZEND_YIELD_FROM_SPEC_CV) \ - _(2436, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \ - _(2437, ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST) \ - _(2488, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST) \ - _(2489, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP) \ - _(2490, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR) \ - _(2492, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV) \ - _(2493, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ - _(2494, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ - _(2495, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ - _(2497, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \ - _(2498, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ - _(2499, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ - _(2500, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ - _(2502, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \ - _(2503, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST) \ - _(2504, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP) \ - _(2505, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR) \ - _(2507, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV) \ - _(2508, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST) \ - _(2509, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP) \ - _(2510, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR) \ - _(2512, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV) \ - _(2538, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST) \ - _(2539, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP) \ - _(2540, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR) \ - _(2542, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV) \ - _(2543, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \ - _(2544, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \ - _(2545, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \ - _(2547, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \ - _(2548, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \ - _(2549, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \ - _(2550, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \ - _(2552, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \ - _(2553, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST) \ - _(2554, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP) \ - _(2555, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR) \ - _(2557, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(2558, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST) \ - _(2559, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP) \ - _(2560, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR) \ - _(2562, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV) \ - _(2563, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \ - _(2564, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ - _(2565, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ - _(2567, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \ - _(2568, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ - _(2569, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2570, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2572, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ - _(2573, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ - _(2574, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2575, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2577, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ - _(2578, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \ - _(2579, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2580, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2582, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \ - _(2583, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \ - _(2584, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ - _(2585, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ - _(2587, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \ - _(2588, ZEND_HANDLE_EXCEPTION_SPEC) \ - _(2589, ZEND_USER_OPCODE_SPEC) \ - _(2590, ZEND_ASSERT_CHECK_SPEC) \ - _(2591, ZEND_JMP_SET_SPEC_CONST) \ - _(2592, ZEND_JMP_SET_SPEC_TMP) \ - _(2593, ZEND_JMP_SET_SPEC_VAR) \ - _(2595, ZEND_JMP_SET_SPEC_CV) \ - _(2596, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \ - _(2597, ZEND_SEPARATE_SPEC_VAR_UNUSED) \ - _(2598, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \ - _(2599, ZEND_CALL_TRAMPOLINE_SPEC) \ - _(2600, ZEND_DISCARD_EXCEPTION_SPEC) \ - _(2601, ZEND_YIELD_SPEC_CONST_CONST) \ - _(2602, ZEND_YIELD_SPEC_CONST_TMP) \ - _(2603, ZEND_YIELD_SPEC_CONST_VAR) \ - _(2604, ZEND_YIELD_SPEC_CONST_UNUSED) \ - _(2605, ZEND_YIELD_SPEC_CONST_CV) \ - _(2606, ZEND_YIELD_SPEC_TMP_CONST) \ - _(2607, ZEND_YIELD_SPEC_TMP_TMP) \ - _(2608, ZEND_YIELD_SPEC_TMP_VAR) \ - _(2609, ZEND_YIELD_SPEC_TMP_UNUSED) \ - _(2610, ZEND_YIELD_SPEC_TMP_CV) \ - _(2611, ZEND_YIELD_SPEC_VAR_CONST) \ - _(2612, ZEND_YIELD_SPEC_VAR_TMP) \ - _(2613, ZEND_YIELD_SPEC_VAR_VAR) \ - _(2614, ZEND_YIELD_SPEC_VAR_UNUSED) \ - _(2615, ZEND_YIELD_SPEC_VAR_CV) \ - _(2616, ZEND_YIELD_SPEC_UNUSED_CONST) \ - _(2617, ZEND_YIELD_SPEC_UNUSED_TMP) \ - _(2618, ZEND_YIELD_SPEC_UNUSED_VAR) \ - _(2619, ZEND_YIELD_SPEC_UNUSED_UNUSED) \ - _(2620, ZEND_YIELD_SPEC_UNUSED_CV) \ - _(2621, ZEND_YIELD_SPEC_CV_CONST) \ - _(2622, ZEND_YIELD_SPEC_CV_TMP) \ - _(2623, ZEND_YIELD_SPEC_CV_VAR) \ - _(2624, ZEND_YIELD_SPEC_CV_UNUSED) \ - _(2625, ZEND_YIELD_SPEC_CV_CV) \ - _(2626, ZEND_GENERATOR_RETURN_SPEC_CONST) \ - _(2627, ZEND_GENERATOR_RETURN_SPEC_TMP) \ - _(2628, ZEND_GENERATOR_RETURN_SPEC_VAR) \ - _(2630, ZEND_GENERATOR_RETURN_SPEC_CV) \ - _(2631, ZEND_FAST_CALL_SPEC) \ - _(2632, ZEND_FAST_RET_SPEC) \ - _(2633, ZEND_RECV_VARIADIC_SPEC_UNUSED) \ - _(2634, ZEND_SEND_UNPACK_SPEC) \ - _(2635, ZEND_POW_SPEC_CONST_CONST) \ - _(2636, ZEND_POW_SPEC_CONST_TMPVAR) \ - _(2637, ZEND_POW_SPEC_CONST_TMPVAR) \ - _(2639, ZEND_POW_SPEC_CONST_CV) \ - _(2640, ZEND_POW_SPEC_TMPVAR_CONST) \ - _(2641, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ - _(2642, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ - _(2644, ZEND_POW_SPEC_TMPVAR_CV) \ - _(2645, ZEND_POW_SPEC_TMPVAR_CONST) \ - _(2646, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ - _(2647, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ - _(2649, ZEND_POW_SPEC_TMPVAR_CV) \ - _(2655, ZEND_POW_SPEC_CV_CONST) \ - _(2656, ZEND_POW_SPEC_CV_TMPVAR) \ - _(2657, ZEND_POW_SPEC_CV_TMPVAR) \ - _(2659, ZEND_POW_SPEC_CV_CV) \ - _(2690, ZEND_ASSIGN_POW_SPEC_VAR_CONST) \ - _(2691, ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM) \ - _(2692, ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ) \ - _(2693, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \ - _(2694, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \ - _(2695, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \ - _(2696, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \ - _(2697, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \ - _(2698, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \ - _(2700, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM) \ - _(2702, ZEND_ASSIGN_POW_SPEC_VAR_CV) \ - _(2703, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM) \ - _(2704, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ) \ - _(2707, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ) \ - _(2710, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \ - _(2713, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \ - _(2719, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ) \ - _(2720, ZEND_ASSIGN_POW_SPEC_CV_CONST) \ - _(2721, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM) \ - _(2722, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ) \ - _(2723, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \ - _(2724, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \ - _(2725, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \ - _(2726, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \ - _(2727, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \ - _(2728, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \ - _(2730, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM) \ - _(2732, ZEND_ASSIGN_POW_SPEC_CV_CV) \ - _(2733, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM) \ - _(2734, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ) \ - _(2735, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \ - _(2736, ZEND_COALESCE_SPEC_CONST) \ - _(2737, ZEND_COALESCE_SPEC_TMPVAR) \ - _(2738, ZEND_COALESCE_SPEC_TMPVAR) \ - _(2740, ZEND_COALESCE_SPEC_CV) \ - _(2741, ZEND_SPACESHIP_SPEC_CONST_CONST) \ - _(2742, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ - _(2743, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ - _(2745, ZEND_SPACESHIP_SPEC_CONST_CV) \ - _(2746, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ - _(2747, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2748, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2750, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ - _(2751, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ - _(2752, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2753, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2755, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ - _(2761, ZEND_SPACESHIP_SPEC_CV_CONST) \ - _(2762, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ - _(2763, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ - _(2765, ZEND_SPACESHIP_SPEC_CV_CV) \ - _(2766, ZEND_DECLARE_ANON_CLASS_SPEC) \ - _(2767, ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST) \ - _(2768, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) \ - _(2770, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) \ - _(2771, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED) \ - _(2773, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \ - _(2775, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \ - _(2776, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \ - _(2778, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \ - _(2780, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \ - _(2781, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \ - _(2788, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) \ - _(2790, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) \ - _(2791, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED) \ - _(2793, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST) \ - _(2795, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR) \ - _(2796, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED) \ - _(2798, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \ - _(2800, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \ - _(2801, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \ - _(2803, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \ - _(2805, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \ - _(2806, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \ - _(2813, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST) \ - _(2815, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR) \ - _(2816, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED) \ - _(2818, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST) \ - _(2820, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR) \ - _(2821, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED) \ - _(2823, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \ - _(2825, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \ - _(2826, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \ - _(2828, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \ - _(2830, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \ - _(2831, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \ - _(2838, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST) \ - _(2840, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR) \ - _(2841, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED) \ - _(2843, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST) \ - _(2845, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR) \ - _(2846, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED) \ - _(2848, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \ - _(2850, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \ - _(2851, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \ - _(2853, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \ - _(2855, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \ - _(2856, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \ - _(2863, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST) \ - _(2865, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR) \ - _(2866, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED) \ - _(2868, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST) \ - _(2870, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR) \ - _(2871, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED) \ - _(2873, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \ - _(2875, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \ - _(2876, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(2878, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \ - _(2880, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \ - _(2881, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(2888, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST) \ - _(2890, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR) \ - _(2891, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED) \ - _(2893, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST) \ - _(2895, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR) \ - _(2896, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED) \ - _(2898, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \ - _(2900, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \ - _(2901, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \ - _(2903, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \ - _(2905, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \ - _(2906, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \ - _(2913, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST) \ - _(2915, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR) \ - _(2916, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED) \ - _(2918, ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST) \ - _(2920, ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) \ - _(2921, ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(2923, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(2925, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(2926, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(2928, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(2930, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(2931, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(2938, ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST) \ - _(2940, ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) \ - _(2941, ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED) \ - _(2943, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST) \ - _(2945, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR) \ - _(2946, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(2948, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(2950, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(2951, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(2953, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(2955, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(2956, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(2963, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST) \ - _(2965, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR) \ - _(2966, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED) \ - _(2968, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \ - _(2970, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \ - _(2971, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \ - _(2973, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \ - _(2974, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \ - _(2975, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \ - _(2976, ZEND_SEND_FUNC_ARG_SPEC_VAR) \ - _(2977, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \ - _(2978, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \ - _(2979, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2980, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2982, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2983, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \ - _(2984, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2985, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2987, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2988, ZEND_IN_ARRAY_SPEC_CONST_CONST) \ - _(2989, ZEND_IN_ARRAY_SPEC_TMP_CONST) \ - _(2990, ZEND_IN_ARRAY_SPEC_VAR_CONST) \ - _(2992, ZEND_IN_ARRAY_SPEC_CV_CONST) \ - _(2993, ZEND_COUNT_SPEC_CONST_UNUSED) \ - _(2994, ZEND_COUNT_SPEC_TMP_UNUSED) \ - _(2995, ZEND_COUNT_SPEC_VAR_UNUSED) \ - _(2997, ZEND_COUNT_SPEC_CV_UNUSED) \ - _(2998, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \ - _(2999, ZEND_GET_CLASS_SPEC_TMP_UNUSED) \ - _(3000, ZEND_GET_CLASS_SPEC_VAR_UNUSED) \ - _(3001, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \ - _(3002, ZEND_GET_CLASS_SPEC_CV_UNUSED) \ - _(3003, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \ - _(3004, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \ - _(3005, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \ - _(3006, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \ - _(3008, ZEND_GET_TYPE_SPEC_CV_UNUSED) \ - _(3009, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \ - _(3010, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \ - _(3013, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \ - _(3015, ZEND_UNSET_CV_SPEC_CV_UNUSED) \ - _(3016, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \ - _(3017, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \ - _(3018, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \ - _(3019, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ - _(3020, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ - _(3022, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \ - _(3023, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \ - _(3024, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ - _(3025, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ - _(3027, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \ - _(3028, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ - _(3029, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(3030, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(3032, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ - _(3033, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ - _(3034, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(3035, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(3037, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ - _(3043, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \ - _(3044, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ - _(3045, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ - _(3047, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \ - _(3048, ZEND_JMP_FORWARD_SPEC) \ - _(3054, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3055, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3056, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3058, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3059, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3060, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3061, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3063, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3069, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3070, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3071, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3073, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3079, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3080, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3081, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3083, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3084, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3085, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3086, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3088, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3094, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3095, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3096, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3098, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3104, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3105, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3106, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3108, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3109, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3110, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3111, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3113, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3119, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3120, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3121, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3123, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3125, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3126, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3128, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3129, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3130, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3131, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3133, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3134, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3135, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3136, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3138, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3144, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3145, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3146, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3148, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3150, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3151, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3153, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3154, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3155, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3156, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3158, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3159, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3160, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3161, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3163, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3169, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3170, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3171, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3173, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3175, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3176, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3178, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3179, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3180, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3181, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3183, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3184, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3185, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3186, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3188, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3194, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3195, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3196, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3198, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3204, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3205, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3206, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3208, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3209, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3210, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3211, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3213, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3219, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3220, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3221, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3223, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3229, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3230, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3231, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3233, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3234, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3235, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3236, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3238, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3244, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3245, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3246, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3248, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3254, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3255, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3256, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3258, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3259, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3260, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3261, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3263, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3269, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3270, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3271, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3273, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3289, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3290, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3291, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3292, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3293, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3294, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3295, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3296, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3297, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3301, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3302, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3303, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3304, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3305, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3306, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3307, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3308, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3309, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3310, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3311, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3312, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3316, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3317, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3318, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3334, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3335, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3336, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3337, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3338, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3339, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3340, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3341, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3342, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3346, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3347, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3348, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3364, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3365, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3366, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3367, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3368, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3369, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3370, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3371, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3372, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3376, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3377, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3378, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3379, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3380, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3381, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3382, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3383, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3384, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3385, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3386, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3387, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3391, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3392, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3393, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3409, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3410, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3411, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3412, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3413, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3414, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3415, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3416, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3417, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3421, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3422, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3423, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3439, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3440, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3441, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3442, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3443, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3444, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3445, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3446, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3447, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3451, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3452, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3453, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3454, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3455, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3456, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3457, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3458, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3459, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3460, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3461, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3462, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3466, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3467, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3468, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3484, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3485, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3486, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3487, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3488, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3489, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3490, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3491, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3492, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3496, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3497, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3498, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3514, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3515, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3516, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3517, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3518, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3519, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3520, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3521, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3522, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3526, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3527, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3528, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3529, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3530, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3531, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3532, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3533, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3534, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3535, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3536, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3537, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3541, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3542, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3543, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3559, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3560, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3561, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3562, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3563, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3564, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3565, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3566, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3567, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3571, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3572, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3573, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3577, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3578, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3579, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3580, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3581, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3582, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3586, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3587, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3588, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3589, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3590, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3591, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3592, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3593, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3594, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3595, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3596, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3597, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3601, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3602, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3603, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3604, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3605, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3606, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3607, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3608, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3609, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3610, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3611, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3612, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3616, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3617, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3618, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3634, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3635, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3636, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3637, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3638, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3639, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3640, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3641, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3642, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3646, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3647, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3648, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3652, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3653, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3654, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3655, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3656, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3657, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3661, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3662, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3663, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3664, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3665, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3666, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3667, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3668, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3669, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3670, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3671, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3672, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3676, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3677, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3678, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3679, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3680, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3681, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3682, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3683, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3684, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3685, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3686, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3687, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3691, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3692, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3693, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3709, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3710, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3711, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3712, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3713, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3714, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3715, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3716, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3717, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3721, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3722, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3723, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3727, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3728, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3729, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3730, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3731, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3732, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3736, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3737, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3738, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3739, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3740, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3741, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3742, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3743, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3744, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3745, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3746, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3747, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3751, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3752, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3753, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3754, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3755, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3756, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3757, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3758, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3759, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3760, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3761, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3762, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3766, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3767, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3768, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3784, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3785, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3786, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3787, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3788, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3789, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3790, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3791, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3792, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3796, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3797, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3798, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3802, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3803, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3804, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3805, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3806, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3807, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3811, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3812, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3813, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3814, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3815, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3816, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3817, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3818, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3819, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3820, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3821, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3822, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3826, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3827, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3828, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3829, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3830, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3831, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3832, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3833, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3834, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3835, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3836, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3837, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3841, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3842, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3843, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3859, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3860, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3861, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3862, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3863, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3864, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3865, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3866, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3867, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3871, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3872, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3873, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3874, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3875, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(3876, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3877, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(3878, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3879, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(3880, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3881, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(3882, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3883, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(3884, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(3885, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(3886, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(3887, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(3888, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(3889, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(3890, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(3891, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(3892, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(3893, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3894, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3896, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3897, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(3898, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3899, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3901, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3903, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3904, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3906, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3907, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3908, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3909, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3911, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3912, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3913, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3914, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3916, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3922, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(3923, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3924, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3926, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3929, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(3931, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(3934, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(3936, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(3937, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ - _(3938, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ - _(3939, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(3940, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(3940+1, ZEND_NULL) + _(474, ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP) \ + _(478, ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(482, ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(486, ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(494, ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP) \ + _(498, ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(502, ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(506, ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(511, ZEND_ASSIGN_ADD_SPEC_VAR_CONST) \ + _(512, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM) \ + _(513, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ) \ + _(514, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP) \ + _(515, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR) \ + _(516, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM) \ + _(517, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ) \ + _(518, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(519, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR) \ + _(520, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM) \ + _(521, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ) \ + _(522, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(524, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM) \ + _(526, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(527, ZEND_ASSIGN_ADD_SPEC_VAR_CV) \ + _(528, ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM) \ + _(529, ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ) \ + _(533, ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ) \ + _(537, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ) \ + _(541, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ) \ + _(549, ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ) \ + _(551, ZEND_ASSIGN_ADD_SPEC_CV_CONST) \ + _(552, ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM) \ + _(553, ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ) \ + _(554, ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP) \ + _(555, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR) \ + _(556, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM) \ + _(557, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ) \ + _(558, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(559, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR) \ + _(560, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM) \ + _(561, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ) \ + _(562, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(564, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM) \ + _(566, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP) \ + _(567, ZEND_ASSIGN_ADD_SPEC_CV_CV) \ + _(568, ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM) \ + _(569, ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ) \ + _(574, ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP) \ + _(578, ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(582, ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(586, ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(594, ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP) \ + _(598, ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(602, ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(606, ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(611, ZEND_ASSIGN_SUB_SPEC_VAR_CONST) \ + _(612, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM) \ + _(613, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ) \ + _(614, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP) \ + _(615, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR) \ + _(616, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM) \ + _(617, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ) \ + _(618, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(619, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR) \ + _(620, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM) \ + _(621, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ) \ + _(622, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(624, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM) \ + _(626, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(627, ZEND_ASSIGN_SUB_SPEC_VAR_CV) \ + _(628, ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM) \ + _(629, ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ) \ + _(633, ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ) \ + _(637, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ) \ + _(641, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ) \ + _(649, ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ) \ + _(651, ZEND_ASSIGN_SUB_SPEC_CV_CONST) \ + _(652, ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM) \ + _(653, ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ) \ + _(654, ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP) \ + _(655, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR) \ + _(656, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM) \ + _(657, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ) \ + _(658, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(659, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR) \ + _(660, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM) \ + _(661, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ) \ + _(662, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(664, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM) \ + _(666, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP) \ + _(667, ZEND_ASSIGN_SUB_SPEC_CV_CV) \ + _(668, ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM) \ + _(669, ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ) \ + _(674, ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP) \ + _(678, ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(682, ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(686, ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(694, ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP) \ + _(698, ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(702, ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(706, ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(711, ZEND_ASSIGN_MUL_SPEC_VAR_CONST) \ + _(712, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM) \ + _(713, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ) \ + _(714, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP) \ + _(715, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR) \ + _(716, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM) \ + _(717, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ) \ + _(718, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(719, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR) \ + _(720, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM) \ + _(721, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ) \ + _(722, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(724, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM) \ + _(726, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(727, ZEND_ASSIGN_MUL_SPEC_VAR_CV) \ + _(728, ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM) \ + _(729, ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ) \ + _(733, ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ) \ + _(737, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ) \ + _(741, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ) \ + _(749, ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ) \ + _(751, ZEND_ASSIGN_MUL_SPEC_CV_CONST) \ + _(752, ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM) \ + _(753, ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ) \ + _(754, ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP) \ + _(755, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR) \ + _(756, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM) \ + _(757, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ) \ + _(758, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(759, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR) \ + _(760, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM) \ + _(761, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ) \ + _(762, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(764, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM) \ + _(766, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP) \ + _(767, ZEND_ASSIGN_MUL_SPEC_CV_CV) \ + _(768, ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM) \ + _(769, ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ) \ + _(774, ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP) \ + _(778, ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(782, ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(786, ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(794, ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP) \ + _(798, ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(802, ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(806, ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(811, ZEND_ASSIGN_DIV_SPEC_VAR_CONST) \ + _(812, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM) \ + _(813, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ) \ + _(814, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP) \ + _(815, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR) \ + _(816, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM) \ + _(817, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ) \ + _(818, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(819, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR) \ + _(820, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM) \ + _(821, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ) \ + _(822, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(824, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM) \ + _(826, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(827, ZEND_ASSIGN_DIV_SPEC_VAR_CV) \ + _(828, ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM) \ + _(829, ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ) \ + _(833, ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ) \ + _(837, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ) \ + _(841, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ) \ + _(849, ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ) \ + _(851, ZEND_ASSIGN_DIV_SPEC_CV_CONST) \ + _(852, ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM) \ + _(853, ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ) \ + _(854, ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP) \ + _(855, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR) \ + _(856, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM) \ + _(857, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ) \ + _(858, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(859, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR) \ + _(860, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM) \ + _(861, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ) \ + _(862, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(864, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM) \ + _(866, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP) \ + _(867, ZEND_ASSIGN_DIV_SPEC_CV_CV) \ + _(868, ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM) \ + _(869, ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ) \ + _(874, ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP) \ + _(878, ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(882, ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(886, ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(894, ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP) \ + _(898, ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(902, ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(906, ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(911, ZEND_ASSIGN_MOD_SPEC_VAR_CONST) \ + _(912, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM) \ + _(913, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ) \ + _(914, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP) \ + _(915, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR) \ + _(916, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM) \ + _(917, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ) \ + _(918, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(919, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR) \ + _(920, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM) \ + _(921, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ) \ + _(922, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(924, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM) \ + _(926, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(927, ZEND_ASSIGN_MOD_SPEC_VAR_CV) \ + _(928, ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM) \ + _(929, ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ) \ + _(933, ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ) \ + _(937, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ) \ + _(941, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ) \ + _(949, ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ) \ + _(951, ZEND_ASSIGN_MOD_SPEC_CV_CONST) \ + _(952, ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM) \ + _(953, ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ) \ + _(954, ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP) \ + _(955, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR) \ + _(956, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM) \ + _(957, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ) \ + _(958, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(959, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR) \ + _(960, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM) \ + _(961, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ) \ + _(962, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(964, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM) \ + _(966, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP) \ + _(967, ZEND_ASSIGN_MOD_SPEC_CV_CV) \ + _(968, ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM) \ + _(969, ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ) \ + _(974, ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP) \ + _(978, ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(982, ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(986, ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(994, ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP) \ + _(998, ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1002, ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1006, ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1011, ZEND_ASSIGN_SL_SPEC_VAR_CONST) \ + _(1012, ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM) \ + _(1013, ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ) \ + _(1014, ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP) \ + _(1015, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR) \ + _(1016, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM) \ + _(1017, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ) \ + _(1018, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1019, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR) \ + _(1020, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM) \ + _(1021, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ) \ + _(1022, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1024, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM) \ + _(1026, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1027, ZEND_ASSIGN_SL_SPEC_VAR_CV) \ + _(1028, ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM) \ + _(1029, ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ) \ + _(1033, ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ) \ + _(1037, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1041, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1049, ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ) \ + _(1051, ZEND_ASSIGN_SL_SPEC_CV_CONST) \ + _(1052, ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM) \ + _(1053, ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ) \ + _(1054, ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP) \ + _(1055, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR) \ + _(1056, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM) \ + _(1057, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ) \ + _(1058, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1059, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR) \ + _(1060, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM) \ + _(1061, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ) \ + _(1062, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1064, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM) \ + _(1066, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1067, ZEND_ASSIGN_SL_SPEC_CV_CV) \ + _(1068, ZEND_ASSIGN_SL_SPEC_CV_CV_DIM) \ + _(1069, ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ) \ + _(1074, ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP) \ + _(1078, ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1082, ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1086, ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(1094, ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP) \ + _(1098, ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1102, ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1106, ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1111, ZEND_ASSIGN_SR_SPEC_VAR_CONST) \ + _(1112, ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM) \ + _(1113, ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ) \ + _(1114, ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP) \ + _(1115, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR) \ + _(1116, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM) \ + _(1117, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ) \ + _(1118, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1119, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR) \ + _(1120, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM) \ + _(1121, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ) \ + _(1122, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1124, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM) \ + _(1126, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1127, ZEND_ASSIGN_SR_SPEC_VAR_CV) \ + _(1128, ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM) \ + _(1129, ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ) \ + _(1133, ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ) \ + _(1137, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1141, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1149, ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ) \ + _(1151, ZEND_ASSIGN_SR_SPEC_CV_CONST) \ + _(1152, ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM) \ + _(1153, ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ) \ + _(1154, ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP) \ + _(1155, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR) \ + _(1156, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM) \ + _(1157, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ) \ + _(1158, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1159, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR) \ + _(1160, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM) \ + _(1161, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ) \ + _(1162, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1164, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM) \ + _(1166, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1167, ZEND_ASSIGN_SR_SPEC_CV_CV) \ + _(1168, ZEND_ASSIGN_SR_SPEC_CV_CV_DIM) \ + _(1169, ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ) \ + _(1174, ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP) \ + _(1178, ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1182, ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1186, ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(1194, ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP) \ + _(1198, ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1202, ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1206, ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1211, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST) \ + _(1212, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM) \ + _(1213, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ) \ + _(1214, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP) \ + _(1215, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR) \ + _(1216, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM) \ + _(1217, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ) \ + _(1218, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1219, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR) \ + _(1220, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM) \ + _(1221, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ) \ + _(1222, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1224, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM) \ + _(1226, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1227, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV) \ + _(1228, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM) \ + _(1229, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ) \ + _(1233, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ) \ + _(1237, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1241, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1249, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ) \ + _(1251, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST) \ + _(1252, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM) \ + _(1253, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ) \ + _(1254, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP) \ + _(1255, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR) \ + _(1256, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM) \ + _(1257, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ) \ + _(1258, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1259, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR) \ + _(1260, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM) \ + _(1261, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ) \ + _(1262, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1264, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM) \ + _(1266, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1267, ZEND_ASSIGN_CONCAT_SPEC_CV_CV) \ + _(1268, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM) \ + _(1269, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ) \ + _(1274, ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP) \ + _(1278, ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1282, ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1286, ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(1294, ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP) \ + _(1298, ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1302, ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1306, ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1311, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST) \ + _(1312, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM) \ + _(1313, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ) \ + _(1314, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP) \ + _(1315, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR) \ + _(1316, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM) \ + _(1317, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ) \ + _(1318, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1319, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR) \ + _(1320, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM) \ + _(1321, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ) \ + _(1322, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1324, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM) \ + _(1326, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1327, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV) \ + _(1328, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM) \ + _(1329, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ) \ + _(1333, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ) \ + _(1337, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1341, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1349, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ) \ + _(1351, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST) \ + _(1352, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM) \ + _(1353, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ) \ + _(1354, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP) \ + _(1355, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR) \ + _(1356, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM) \ + _(1357, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ) \ + _(1358, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1359, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR) \ + _(1360, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM) \ + _(1361, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ) \ + _(1362, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1364, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM) \ + _(1366, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1367, ZEND_ASSIGN_BW_OR_SPEC_CV_CV) \ + _(1368, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM) \ + _(1369, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ) \ + _(1374, ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP) \ + _(1378, ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1382, ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1386, ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(1394, ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP) \ + _(1398, ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1402, ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1406, ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1411, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST) \ + _(1412, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM) \ + _(1413, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ) \ + _(1414, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP) \ + _(1415, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR) \ + _(1416, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM) \ + _(1417, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ) \ + _(1418, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1419, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR) \ + _(1420, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM) \ + _(1421, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ) \ + _(1422, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1424, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM) \ + _(1426, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1427, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV) \ + _(1428, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM) \ + _(1429, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ) \ + _(1433, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ) \ + _(1437, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1441, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1449, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ) \ + _(1451, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST) \ + _(1452, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM) \ + _(1453, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ) \ + _(1454, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP) \ + _(1455, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR) \ + _(1456, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM) \ + _(1457, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ) \ + _(1458, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1459, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR) \ + _(1460, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM) \ + _(1461, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ) \ + _(1462, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1464, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM) \ + _(1466, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1467, ZEND_ASSIGN_BW_AND_SPEC_CV_CV) \ + _(1468, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM) \ + _(1469, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ) \ + _(1474, ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP) \ + _(1478, ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1482, ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(1486, ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(1494, ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP) \ + _(1498, ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1502, ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(1506, ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(1511, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST) \ + _(1512, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM) \ + _(1513, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ) \ + _(1514, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP) \ + _(1515, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR) \ + _(1516, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM) \ + _(1517, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ) \ + _(1518, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1519, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR) \ + _(1520, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM) \ + _(1521, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ) \ + _(1522, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(1524, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM) \ + _(1526, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(1527, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV) \ + _(1528, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM) \ + _(1529, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ) \ + _(1533, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ) \ + _(1537, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1541, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ) \ + _(1549, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ) \ + _(1551, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST) \ + _(1552, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM) \ + _(1553, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ) \ + _(1554, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP) \ + _(1555, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR) \ + _(1556, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM) \ + _(1557, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ) \ + _(1558, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1559, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR) \ + _(1560, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM) \ + _(1561, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ) \ + _(1562, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(1564, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM) \ + _(1566, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP) \ + _(1567, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV) \ + _(1568, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM) \ + _(1569, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ) \ + _(1575, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED) \ + _(1576, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED) \ + _(1579, ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED) \ + _(1580, ZEND_PRE_INC_SPEC_CV_RETVAL_USED) \ + _(1585, ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED) \ + _(1586, ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED) \ + _(1589, ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED) \ + _(1590, ZEND_PRE_DEC_SPEC_CV_RETVAL_USED) \ + _(1593, ZEND_POST_INC_SPEC_VAR) \ + _(1595, ZEND_POST_INC_SPEC_CV) \ + _(1598, ZEND_POST_DEC_SPEC_VAR) \ + _(1600, ZEND_POST_DEC_SPEC_CV) \ + _(1621, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED) \ + _(1622, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED) \ + _(1623, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED) \ + _(1624, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED) \ + _(1625, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED) \ + _(1626, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED) \ + _(1629, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(1630, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED) \ + _(1641, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED) \ + _(1642, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED) \ + _(1643, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED) \ + _(1644, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED) \ + _(1645, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED) \ + _(1646, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED) \ + _(1649, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED) \ + _(1650, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED) \ + _(1663, ZEND_ASSIGN_REF_SPEC_VAR_VAR) \ + _(1665, ZEND_ASSIGN_REF_SPEC_VAR_CV) \ + _(1673, ZEND_ASSIGN_REF_SPEC_CV_VAR) \ + _(1675, ZEND_ASSIGN_REF_SPEC_CV_CV) \ + _(1676, ZEND_ECHO_SPEC_CONST) \ + _(1677, ZEND_ECHO_SPEC_TMPVAR) \ + _(1678, ZEND_ECHO_SPEC_TMPVAR) \ + _(1680, ZEND_ECHO_SPEC_CV) \ + _(1681, ZEND_GENERATOR_CREATE_SPEC) \ + _(1682, ZEND_JMP_SPEC) \ + _(1683, ZEND_JMPZ_SPEC_CONST) \ + _(1684, ZEND_JMPZ_SPEC_TMPVAR) \ + _(1685, ZEND_JMPZ_SPEC_TMPVAR) \ + _(1687, ZEND_JMPZ_SPEC_CV) \ + _(1688, ZEND_JMPNZ_SPEC_CONST) \ + _(1689, ZEND_JMPNZ_SPEC_TMPVAR) \ + _(1690, ZEND_JMPNZ_SPEC_TMPVAR) \ + _(1692, ZEND_JMPNZ_SPEC_CV) \ + _(1693, ZEND_JMPZNZ_SPEC_CONST) \ + _(1694, ZEND_JMPZNZ_SPEC_TMPVAR) \ + _(1695, ZEND_JMPZNZ_SPEC_TMPVAR) \ + _(1697, ZEND_JMPZNZ_SPEC_CV) \ + _(1698, ZEND_JMPZ_EX_SPEC_CONST) \ + _(1699, ZEND_JMPZ_EX_SPEC_TMPVAR) \ + _(1700, ZEND_JMPZ_EX_SPEC_TMPVAR) \ + _(1702, ZEND_JMPZ_EX_SPEC_CV) \ + _(1703, ZEND_JMPNZ_EX_SPEC_CONST) \ + _(1704, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ + _(1705, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ + _(1707, ZEND_JMPNZ_EX_SPEC_CV) \ + _(1708, ZEND_CASE_SPEC_TMPVAR_CONST) \ + _(1709, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ + _(1710, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ + _(1712, ZEND_CASE_SPEC_TMPVAR_CV) \ + _(1713, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \ + _(1714, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR) \ + _(1715, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK) \ + _(1718, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \ + _(1720, ZEND_MAKE_REF_SPEC_CV_UNUSED) \ + _(1721, ZEND_BOOL_SPEC_CONST) \ + _(1722, ZEND_BOOL_SPEC_TMPVAR) \ + _(1723, ZEND_BOOL_SPEC_TMPVAR) \ + _(1725, ZEND_BOOL_SPEC_CV) \ + _(1726, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \ + _(1727, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ + _(1728, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ + _(1730, ZEND_FAST_CONCAT_SPEC_CONST_CV) \ + _(1731, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ + _(1732, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1733, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1735, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ + _(1736, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ + _(1737, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1738, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1740, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ + _(1746, ZEND_FAST_CONCAT_SPEC_CV_CONST) \ + _(1747, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ + _(1748, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ + _(1750, ZEND_FAST_CONCAT_SPEC_CV_CV) \ + _(1751, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \ + _(1752, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ + _(1753, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ + _(1755, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \ + _(1756, ZEND_ROPE_ADD_SPEC_TMP_CONST) \ + _(1757, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ + _(1758, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ + _(1760, ZEND_ROPE_ADD_SPEC_TMP_CV) \ + _(1761, ZEND_ROPE_END_SPEC_TMP_CONST) \ + _(1762, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ + _(1763, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ + _(1765, ZEND_ROPE_END_SPEC_TMP_CV) \ + _(1766, ZEND_BEGIN_SILENCE_SPEC) \ + _(1767, ZEND_END_SILENCE_SPEC_TMP) \ + _(1768, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \ + _(1769, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \ + _(1770, ZEND_DO_FCALL_SPEC_RETVAL_USED) \ + _(1771, ZEND_INIT_FCALL_SPEC_CONST) \ + _(1772, ZEND_RETURN_SPEC_CONST) \ + _(1773, ZEND_RETURN_SPEC_TMP) \ + _(1774, ZEND_RETURN_SPEC_VAR) \ + _(1776, ZEND_RETURN_SPEC_CV) \ + _(1777, ZEND_RECV_SPEC_UNUSED) \ + _(1778, ZEND_RECV_INIT_SPEC_CONST) \ + _(1779, ZEND_SEND_VAL_SPEC_CONST) \ + _(1780, ZEND_SEND_VAL_SPEC_TMPVAR) \ + _(1781, ZEND_SEND_VAL_SPEC_TMPVAR) \ + _(1788, ZEND_SEND_VAR_EX_SPEC_VAR) \ + _(1789, ZEND_SEND_VAR_EX_SPEC_VAR_QUICK) \ + _(1792, ZEND_SEND_VAR_EX_SPEC_CV) \ + _(1793, ZEND_SEND_VAR_EX_SPEC_CV_QUICK) \ + _(1796, ZEND_SEND_REF_SPEC_VAR) \ + _(1798, ZEND_SEND_REF_SPEC_CV) \ + _(1799, ZEND_NEW_SPEC_CONST_UNUSED) \ + _(1801, ZEND_NEW_SPEC_VAR_UNUSED) \ + _(1802, ZEND_NEW_SPEC_UNUSED_UNUSED) \ + _(1804, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \ + _(1805, ZEND_FREE_SPEC_TMPVAR) \ + _(1806, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \ + _(1807, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ + _(1808, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ + _(1809, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \ + _(1810, ZEND_INIT_ARRAY_SPEC_CONST_CV) \ + _(1811, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \ + _(1812, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ + _(1813, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ + _(1814, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \ + _(1815, ZEND_INIT_ARRAY_SPEC_TMP_CV) \ + _(1816, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \ + _(1817, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ + _(1818, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ + _(1819, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \ + _(1820, ZEND_INIT_ARRAY_SPEC_VAR_CV) \ + _(1826, ZEND_INIT_ARRAY_SPEC_CV_CONST) \ + _(1827, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ + _(1828, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ + _(1829, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \ + _(1830, ZEND_INIT_ARRAY_SPEC_CV_CV) \ + _(1831, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \ + _(1832, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ + _(1833, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ + _(1834, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \ + _(1835, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \ + _(1836, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \ + _(1837, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ + _(1838, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ + _(1839, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \ + _(1840, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \ + _(1841, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \ + _(1842, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ + _(1843, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ + _(1844, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \ + _(1845, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \ + _(1851, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \ + _(1852, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ + _(1853, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ + _(1854, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \ + _(1855, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \ + _(1856, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \ + _(1857, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ + _(1858, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ + _(1860, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \ + _(1861, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \ + _(1862, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ + _(1863, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ + _(1865, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \ + _(1876, ZEND_UNSET_DIM_SPEC_VAR_CONST) \ + _(1877, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ + _(1878, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ + _(1880, ZEND_UNSET_DIM_SPEC_VAR_CV) \ + _(1886, ZEND_UNSET_DIM_SPEC_CV_CONST) \ + _(1887, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ + _(1888, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ + _(1890, ZEND_UNSET_DIM_SPEC_CV_CV) \ + _(1901, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \ + _(1902, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ + _(1903, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ + _(1905, ZEND_UNSET_OBJ_SPEC_VAR_CV) \ + _(1906, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \ + _(1907, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ + _(1908, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ + _(1910, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \ + _(1911, ZEND_UNSET_OBJ_SPEC_CV_CONST) \ + _(1912, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ + _(1913, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ + _(1915, ZEND_UNSET_OBJ_SPEC_CV_CV) \ + _(1916, ZEND_FE_RESET_R_SPEC_CONST) \ + _(1917, ZEND_FE_RESET_R_SPEC_TMP) \ + _(1918, ZEND_FE_RESET_R_SPEC_VAR) \ + _(1920, ZEND_FE_RESET_R_SPEC_CV) \ + _(1921, ZEND_FE_FETCH_R_SPEC_VAR) \ + _(1922, ZEND_EXIT_SPEC_CONST) \ + _(1923, ZEND_EXIT_SPEC_TMPVAR) \ + _(1924, ZEND_EXIT_SPEC_TMPVAR) \ + _(1925, ZEND_EXIT_SPEC_UNUSED) \ + _(1926, ZEND_EXIT_SPEC_CV) \ + _(1927, ZEND_FETCH_R_SPEC_CONST_UNUSED) \ + _(1928, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ + _(1929, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ + _(1931, ZEND_FETCH_R_SPEC_CV_UNUSED) \ + _(1932, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \ + _(1933, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ + _(1934, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ + _(1936, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \ + _(1937, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ + _(1938, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1939, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1941, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ + _(1942, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ + _(1943, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1944, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1946, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ + _(1952, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \ + _(1953, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ + _(1954, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ + _(1956, ZEND_FETCH_DIM_R_SPEC_CV_CV) \ + _(1957, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \ + _(1958, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ + _(1959, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ + _(1961, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \ + _(1962, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ + _(1963, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1964, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1966, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ + _(1967, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ + _(1968, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1969, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1971, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ + _(1972, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \ + _(1973, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ + _(1974, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ + _(1976, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \ + _(1977, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \ + _(1978, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ + _(1979, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ + _(1981, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \ + _(1982, ZEND_FETCH_W_SPEC_CONST_UNUSED) \ + _(1983, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ + _(1984, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ + _(1986, ZEND_FETCH_W_SPEC_CV_UNUSED) \ + _(1997, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \ + _(1998, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ + _(1999, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ + _(2000, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \ + _(2001, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \ + _(2007, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \ + _(2008, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ + _(2009, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ + _(2010, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \ + _(2011, ZEND_FETCH_DIM_W_SPEC_CV_CV) \ + _(2022, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \ + _(2023, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ + _(2024, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ + _(2026, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \ + _(2027, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \ + _(2028, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ + _(2029, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ + _(2031, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \ + _(2032, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \ + _(2033, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ + _(2034, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ + _(2036, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \ + _(2037, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \ + _(2038, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ + _(2039, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ + _(2041, ZEND_FETCH_RW_SPEC_CV_UNUSED) \ + _(2052, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \ + _(2053, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ + _(2054, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ + _(2055, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \ + _(2056, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \ + _(2062, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \ + _(2063, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ + _(2064, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ + _(2065, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \ + _(2066, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \ + _(2077, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \ + _(2078, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ + _(2079, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ + _(2081, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \ + _(2082, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \ + _(2083, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ + _(2084, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ + _(2086, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \ + _(2087, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \ + _(2088, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ + _(2089, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ + _(2091, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \ + _(2092, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \ + _(2093, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ + _(2094, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ + _(2096, ZEND_FETCH_IS_SPEC_CV_UNUSED) \ + _(2097, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \ + _(2098, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ + _(2099, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ + _(2101, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \ + _(2102, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ + _(2103, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(2104, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(2106, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ + _(2107, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ + _(2108, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(2109, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(2111, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ + _(2117, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \ + _(2118, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ + _(2119, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ + _(2121, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \ + _(2122, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \ + _(2123, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ + _(2124, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ + _(2126, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \ + _(2127, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ + _(2128, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(2129, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(2131, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ + _(2132, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ + _(2133, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(2134, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(2136, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ + _(2137, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \ + _(2138, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ + _(2139, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ + _(2141, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \ + _(2142, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \ + _(2143, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ + _(2144, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ + _(2146, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \ + _(2147, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \ + _(2148, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(2149, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(2151, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \ + _(2152, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \ + _(2153, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(2154, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(2155, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \ + _(2156, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \ + _(2157, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \ + _(2158, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(2159, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(2160, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \ + _(2161, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \ + _(2162, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \ + _(2163, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(2164, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(2165, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \ + _(2166, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \ + _(2172, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \ + _(2173, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(2174, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(2175, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \ + _(2176, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \ + _(2177, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \ + _(2178, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(2179, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(2181, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \ + _(2182, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \ + _(2183, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(2184, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(2186, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \ + _(2187, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \ + _(2188, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(2189, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(2191, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \ + _(2192, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \ + _(2193, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ + _(2194, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ + _(2196, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \ + _(2197, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \ + _(2198, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(2199, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(2201, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \ + _(2202, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \ + _(2203, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ + _(2204, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ + _(2206, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \ + _(2217, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \ + _(2218, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ + _(2219, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ + _(2221, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \ + _(2227, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \ + _(2228, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ + _(2229, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ + _(2231, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \ + _(2242, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \ + _(2243, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ + _(2244, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ + _(2246, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \ + _(2247, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \ + _(2248, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ + _(2249, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ + _(2251, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \ + _(2252, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \ + _(2253, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ + _(2254, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ + _(2256, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \ + _(2257, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \ + _(2258, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ + _(2259, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ + _(2261, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \ + _(2262, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ + _(2263, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2264, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2266, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ + _(2267, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ + _(2268, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2269, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2271, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ + _(2277, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ + _(2278, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2279, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(2281, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ + _(2282, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \ + _(2283, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED) \ + _(2284, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK) \ + _(2285, ZEND_EXT_STMT_SPEC) \ + _(2286, ZEND_EXT_FCALL_BEGIN_SPEC) \ + _(2287, ZEND_EXT_FCALL_END_SPEC) \ + _(2288, ZEND_EXT_NOP_SPEC) \ + _(2289, ZEND_TICKS_SPEC) \ + _(2290, ZEND_SEND_VAR_NO_REF_SPEC_VAR) \ + _(2291, ZEND_CATCH_SPEC_CONST) \ + _(2292, ZEND_THROW_SPEC_CONST) \ + _(2293, ZEND_THROW_SPEC_TMP) \ + _(2294, ZEND_THROW_SPEC_VAR) \ + _(2296, ZEND_THROW_SPEC_CV) \ + _(2297, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \ + _(2298, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ + _(2299, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ + _(2300, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \ + _(2301, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \ + _(2302, ZEND_CLONE_SPEC_CONST) \ + _(2303, ZEND_CLONE_SPEC_TMPVAR) \ + _(2304, ZEND_CLONE_SPEC_TMPVAR) \ + _(2305, ZEND_CLONE_SPEC_UNUSED) \ + _(2306, ZEND_CLONE_SPEC_CV) \ + _(2307, ZEND_RETURN_BY_REF_SPEC_CONST) \ + _(2308, ZEND_RETURN_BY_REF_SPEC_TMP) \ + _(2309, ZEND_RETURN_BY_REF_SPEC_VAR) \ + _(2311, ZEND_RETURN_BY_REF_SPEC_CV) \ + _(2312, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \ + _(2313, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2314, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2316, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \ + _(2317, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ + _(2318, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2319, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2321, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ + _(2322, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ + _(2323, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2324, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2326, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ + _(2327, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \ + _(2328, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2329, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2331, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \ + _(2332, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \ + _(2333, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ + _(2334, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ + _(2336, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \ + _(2337, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \ + _(2338, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2339, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2340, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \ + _(2341, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \ + _(2347, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \ + _(2348, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ + _(2349, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ + _(2350, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \ + _(2351, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \ + _(2352, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \ + _(2353, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2354, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2355, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \ + _(2356, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \ + _(2362, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \ + _(2363, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ + _(2364, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ + _(2366, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \ + _(2367, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \ + _(2368, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ + _(2369, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ + _(2371, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \ + _(2372, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ + _(2373, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2374, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2376, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ + _(2377, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ + _(2378, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2379, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2381, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ + _(2387, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \ + _(2388, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ + _(2389, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ + _(2391, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \ + _(2392, ZEND_SEND_VAL_EX_SPEC_CONST) \ + _(2393, ZEND_SEND_VAL_EX_SPEC_CONST_QUICK) \ + _(2394, ZEND_SEND_VAL_EX_SPEC_TMP) \ + _(2395, ZEND_SEND_VAL_EX_SPEC_TMP_QUICK) \ + _(2404, ZEND_SEND_VAR_SPEC_VAR) \ + _(2406, ZEND_SEND_VAR_SPEC_CV) \ + _(2407, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \ + _(2408, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ + _(2409, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ + _(2411, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \ + _(2412, ZEND_SEND_ARRAY_SPEC) \ + _(2413, ZEND_SEND_USER_SPEC_CONST) \ + _(2414, ZEND_SEND_USER_SPEC_TMP) \ + _(2415, ZEND_SEND_USER_SPEC_VAR) \ + _(2417, ZEND_SEND_USER_SPEC_CV) \ + _(2418, ZEND_STRLEN_SPEC_CONST) \ + _(2419, ZEND_STRLEN_SPEC_TMPVAR) \ + _(2420, ZEND_STRLEN_SPEC_TMPVAR) \ + _(2422, ZEND_STRLEN_SPEC_CV) \ + _(2423, ZEND_DEFINED_SPEC_CONST) \ + _(2424, ZEND_TYPE_CHECK_SPEC_CONST) \ + _(2425, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ + _(2426, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ + _(2428, ZEND_TYPE_CHECK_SPEC_CV) \ + _(2429, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \ + _(2430, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \ + _(2431, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \ + _(2432, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \ + _(2433, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \ + _(2434, ZEND_FE_RESET_RW_SPEC_CONST) \ + _(2435, ZEND_FE_RESET_RW_SPEC_TMP) \ + _(2436, ZEND_FE_RESET_RW_SPEC_VAR) \ + _(2438, ZEND_FE_RESET_RW_SPEC_CV) \ + _(2439, ZEND_FE_FETCH_RW_SPEC_VAR) \ + _(2440, ZEND_FE_FREE_SPEC_TMPVAR) \ + _(2441, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \ + _(2442, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ + _(2443, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ + _(2445, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \ + _(2446, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \ + _(2447, ZEND_DO_ICALL_SPEC_RETVAL_USED) \ + _(2448, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \ + _(2449, ZEND_DO_UCALL_SPEC_RETVAL_USED) \ + _(2450, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \ + _(2451, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \ + _(2462, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \ + _(2463, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2464, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2466, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \ + _(2467, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \ + _(2468, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2469, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2471, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \ + _(2472, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \ + _(2473, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2474, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2476, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \ + _(2487, ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST) \ + _(2488, ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR) \ + _(2489, ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR) \ + _(2491, ZEND_PRE_DEC_OBJ_SPEC_VAR_CV) \ + _(2492, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST) \ + _(2493, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2494, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2496, ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV) \ + _(2497, ZEND_PRE_DEC_OBJ_SPEC_CV_CONST) \ + _(2498, ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR) \ + _(2499, ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR) \ + _(2501, ZEND_PRE_DEC_OBJ_SPEC_CV_CV) \ + _(2512, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \ + _(2513, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2514, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2516, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \ + _(2517, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \ + _(2518, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2519, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2521, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \ + _(2522, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \ + _(2523, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2524, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2526, ZEND_POST_INC_OBJ_SPEC_CV_CV) \ + _(2537, ZEND_POST_DEC_OBJ_SPEC_VAR_CONST) \ + _(2538, ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR) \ + _(2539, ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR) \ + _(2541, ZEND_POST_DEC_OBJ_SPEC_VAR_CV) \ + _(2542, ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST) \ + _(2543, ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2544, ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2546, ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV) \ + _(2547, ZEND_POST_DEC_OBJ_SPEC_CV_CONST) \ + _(2548, ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR) \ + _(2549, ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR) \ + _(2551, ZEND_POST_DEC_OBJ_SPEC_CV_CV) \ + _(2602, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST) \ + _(2603, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP) \ + _(2604, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR) \ + _(2606, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV) \ + _(2607, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ + _(2608, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ + _(2609, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(2611, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(2612, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ + _(2613, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ + _(2614, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(2616, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(2622, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST) \ + _(2623, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP) \ + _(2624, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR) \ + _(2626, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV) \ + _(2627, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST) \ + _(2628, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP) \ + _(2629, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR) \ + _(2631, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV) \ + _(2632, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \ + _(2633, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \ + _(2634, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ + _(2636, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ + _(2637, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \ + _(2638, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \ + _(2639, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ + _(2641, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ + _(2647, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST) \ + _(2648, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP) \ + _(2649, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR) \ + _(2651, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV) \ + _(2652, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST) \ + _(2653, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP) \ + _(2654, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR) \ + _(2656, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV) \ + _(2657, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \ + _(2658, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \ + _(2659, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(2661, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(2662, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \ + _(2663, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \ + _(2664, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(2666, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(2672, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST) \ + _(2673, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP) \ + _(2674, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR) \ + _(2676, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV) \ + _(2683, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ + _(2685, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ + _(2686, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ + _(2688, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ + _(2690, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ + _(2691, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ + _(2698, ZEND_INSTANCEOF_SPEC_CV_CONST) \ + _(2700, ZEND_INSTANCEOF_SPEC_CV_VAR) \ + _(2701, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \ + _(2703, ZEND_DECLARE_CLASS_SPEC_CONST) \ + _(2704, ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST) \ + _(2705, ZEND_DECLARE_FUNCTION_SPEC) \ + _(2706, ZEND_YIELD_FROM_SPEC_CONST) \ + _(2707, ZEND_YIELD_FROM_SPEC_TMP) \ + _(2708, ZEND_YIELD_FROM_SPEC_VAR) \ + _(2710, ZEND_YIELD_FROM_SPEC_CV) \ + _(2711, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \ + _(2712, ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST) \ + _(2763, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST) \ + _(2764, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP) \ + _(2765, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR) \ + _(2767, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV) \ + _(2768, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ + _(2769, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ + _(2770, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(2772, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(2773, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \ + _(2774, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \ + _(2775, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(2777, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(2778, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST) \ + _(2779, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP) \ + _(2780, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR) \ + _(2782, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV) \ + _(2783, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST) \ + _(2784, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP) \ + _(2785, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR) \ + _(2787, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV) \ + _(2813, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST) \ + _(2814, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP) \ + _(2815, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR) \ + _(2817, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV) \ + _(2818, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \ + _(2819, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \ + _(2820, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(2822, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(2823, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \ + _(2824, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \ + _(2825, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(2827, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(2828, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST) \ + _(2829, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP) \ + _(2830, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR) \ + _(2832, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) \ + _(2833, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST) \ + _(2834, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP) \ + _(2835, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR) \ + _(2837, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV) \ + _(2838, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \ + _(2839, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ + _(2840, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ + _(2842, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \ + _(2843, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ + _(2844, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2845, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2847, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ + _(2848, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ + _(2849, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2850, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2852, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ + _(2853, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \ + _(2854, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2855, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2857, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \ + _(2858, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \ + _(2859, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ + _(2860, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ + _(2862, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \ + _(2863, ZEND_HANDLE_EXCEPTION_SPEC) \ + _(2864, ZEND_USER_OPCODE_SPEC) \ + _(2865, ZEND_ASSERT_CHECK_SPEC) \ + _(2866, ZEND_JMP_SET_SPEC_CONST) \ + _(2867, ZEND_JMP_SET_SPEC_TMP) \ + _(2868, ZEND_JMP_SET_SPEC_VAR) \ + _(2870, ZEND_JMP_SET_SPEC_CV) \ + _(2871, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \ + _(2872, ZEND_SEPARATE_SPEC_VAR_UNUSED) \ + _(2873, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \ + _(2874, ZEND_CALL_TRAMPOLINE_SPEC) \ + _(2875, ZEND_DISCARD_EXCEPTION_SPEC) \ + _(2876, ZEND_YIELD_SPEC_CONST_CONST) \ + _(2877, ZEND_YIELD_SPEC_CONST_TMP) \ + _(2878, ZEND_YIELD_SPEC_CONST_VAR) \ + _(2879, ZEND_YIELD_SPEC_CONST_UNUSED) \ + _(2880, ZEND_YIELD_SPEC_CONST_CV) \ + _(2881, ZEND_YIELD_SPEC_TMP_CONST) \ + _(2882, ZEND_YIELD_SPEC_TMP_TMP) \ + _(2883, ZEND_YIELD_SPEC_TMP_VAR) \ + _(2884, ZEND_YIELD_SPEC_TMP_UNUSED) \ + _(2885, ZEND_YIELD_SPEC_TMP_CV) \ + _(2886, ZEND_YIELD_SPEC_VAR_CONST) \ + _(2887, ZEND_YIELD_SPEC_VAR_TMP) \ + _(2888, ZEND_YIELD_SPEC_VAR_VAR) \ + _(2889, ZEND_YIELD_SPEC_VAR_UNUSED) \ + _(2890, ZEND_YIELD_SPEC_VAR_CV) \ + _(2891, ZEND_YIELD_SPEC_UNUSED_CONST) \ + _(2892, ZEND_YIELD_SPEC_UNUSED_TMP) \ + _(2893, ZEND_YIELD_SPEC_UNUSED_VAR) \ + _(2894, ZEND_YIELD_SPEC_UNUSED_UNUSED) \ + _(2895, ZEND_YIELD_SPEC_UNUSED_CV) \ + _(2896, ZEND_YIELD_SPEC_CV_CONST) \ + _(2897, ZEND_YIELD_SPEC_CV_TMP) \ + _(2898, ZEND_YIELD_SPEC_CV_VAR) \ + _(2899, ZEND_YIELD_SPEC_CV_UNUSED) \ + _(2900, ZEND_YIELD_SPEC_CV_CV) \ + _(2901, ZEND_GENERATOR_RETURN_SPEC_CONST) \ + _(2902, ZEND_GENERATOR_RETURN_SPEC_TMP) \ + _(2903, ZEND_GENERATOR_RETURN_SPEC_VAR) \ + _(2905, ZEND_GENERATOR_RETURN_SPEC_CV) \ + _(2906, ZEND_FAST_CALL_SPEC) \ + _(2907, ZEND_FAST_RET_SPEC) \ + _(2908, ZEND_RECV_VARIADIC_SPEC_UNUSED) \ + _(2909, ZEND_SEND_UNPACK_SPEC) \ + _(2910, ZEND_POW_SPEC_CONST_CONST) \ + _(2911, ZEND_POW_SPEC_CONST_TMPVAR) \ + _(2912, ZEND_POW_SPEC_CONST_TMPVAR) \ + _(2914, ZEND_POW_SPEC_CONST_CV) \ + _(2915, ZEND_POW_SPEC_TMPVAR_CONST) \ + _(2916, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ + _(2917, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ + _(2919, ZEND_POW_SPEC_TMPVAR_CV) \ + _(2920, ZEND_POW_SPEC_TMPVAR_CONST) \ + _(2921, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ + _(2922, ZEND_POW_SPEC_TMPVAR_TMPVAR) \ + _(2924, ZEND_POW_SPEC_TMPVAR_CV) \ + _(2930, ZEND_POW_SPEC_CV_CONST) \ + _(2931, ZEND_POW_SPEC_CV_TMPVAR) \ + _(2932, ZEND_POW_SPEC_CV_TMPVAR) \ + _(2934, ZEND_POW_SPEC_CV_CV) \ + _(2938, ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP) \ + _(2942, ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(2946, ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP) \ + _(2950, ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP) \ + _(2958, ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP) \ + _(2962, ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(2966, ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP) \ + _(2970, ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP) \ + _(2975, ZEND_ASSIGN_POW_SPEC_VAR_CONST) \ + _(2976, ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM) \ + _(2977, ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ) \ + _(2978, ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP) \ + _(2979, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \ + _(2980, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \ + _(2981, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \ + _(2982, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(2983, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \ + _(2984, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \ + _(2985, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \ + _(2986, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP) \ + _(2988, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM) \ + _(2990, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP) \ + _(2991, ZEND_ASSIGN_POW_SPEC_VAR_CV) \ + _(2992, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM) \ + _(2993, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ) \ + _(2997, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ) \ + _(3001, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \ + _(3005, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \ + _(3013, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ) \ + _(3015, ZEND_ASSIGN_POW_SPEC_CV_CONST) \ + _(3016, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM) \ + _(3017, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ) \ + _(3018, ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP) \ + _(3019, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \ + _(3020, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \ + _(3021, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \ + _(3022, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(3023, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \ + _(3024, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \ + _(3025, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \ + _(3026, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP) \ + _(3028, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM) \ + _(3030, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP) \ + _(3031, ZEND_ASSIGN_POW_SPEC_CV_CV) \ + _(3032, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM) \ + _(3033, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ) \ + _(3035, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \ + _(3036, ZEND_COALESCE_SPEC_CONST) \ + _(3037, ZEND_COALESCE_SPEC_TMPVAR) \ + _(3038, ZEND_COALESCE_SPEC_TMPVAR) \ + _(3040, ZEND_COALESCE_SPEC_CV) \ + _(3041, ZEND_SPACESHIP_SPEC_CONST_CONST) \ + _(3042, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ + _(3043, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ + _(3045, ZEND_SPACESHIP_SPEC_CONST_CV) \ + _(3046, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ + _(3047, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(3048, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(3050, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ + _(3051, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ + _(3052, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(3053, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(3055, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ + _(3061, ZEND_SPACESHIP_SPEC_CV_CONST) \ + _(3062, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ + _(3063, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ + _(3065, ZEND_SPACESHIP_SPEC_CV_CV) \ + _(3066, ZEND_DECLARE_ANON_CLASS_SPEC) \ + _(3067, ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST) \ + _(3068, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) \ + _(3070, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) \ + _(3071, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED) \ + _(3073, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \ + _(3075, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \ + _(3076, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \ + _(3078, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \ + _(3080, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \ + _(3081, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \ + _(3088, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) \ + _(3090, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) \ + _(3091, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED) \ + _(3093, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST) \ + _(3095, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR) \ + _(3096, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED) \ + _(3098, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \ + _(3100, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \ + _(3101, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \ + _(3103, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \ + _(3105, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \ + _(3106, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \ + _(3113, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST) \ + _(3115, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR) \ + _(3116, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED) \ + _(3118, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST) \ + _(3120, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR) \ + _(3121, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED) \ + _(3123, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \ + _(3125, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \ + _(3126, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \ + _(3128, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \ + _(3130, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \ + _(3131, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \ + _(3138, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST) \ + _(3140, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR) \ + _(3141, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED) \ + _(3143, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST) \ + _(3145, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR) \ + _(3146, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED) \ + _(3148, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \ + _(3150, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \ + _(3151, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \ + _(3153, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \ + _(3155, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \ + _(3156, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \ + _(3163, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST) \ + _(3165, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR) \ + _(3166, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED) \ + _(3168, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST) \ + _(3170, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR) \ + _(3171, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED) \ + _(3173, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \ + _(3175, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \ + _(3176, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(3178, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \ + _(3180, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \ + _(3181, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(3188, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST) \ + _(3190, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR) \ + _(3191, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED) \ + _(3193, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST) \ + _(3195, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR) \ + _(3196, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED) \ + _(3198, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \ + _(3200, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \ + _(3201, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \ + _(3203, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \ + _(3205, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \ + _(3206, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \ + _(3213, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST) \ + _(3215, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR) \ + _(3216, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED) \ + _(3218, ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST) \ + _(3220, ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) \ + _(3221, ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3223, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3225, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3226, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3228, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3230, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3231, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3238, ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST) \ + _(3240, ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) \ + _(3241, ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3243, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST) \ + _(3245, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR) \ + _(3246, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3248, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3250, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3251, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3253, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3255, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3256, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3263, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST) \ + _(3265, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR) \ + _(3266, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3268, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \ + _(3270, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \ + _(3271, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \ + _(3273, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \ + _(3274, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \ + _(3275, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \ + _(3276, ZEND_SEND_FUNC_ARG_SPEC_VAR) \ + _(3277, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \ + _(3278, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \ + _(3279, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(3280, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(3282, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(3283, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \ + _(3284, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(3285, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(3287, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(3288, ZEND_IN_ARRAY_SPEC_CONST_CONST) \ + _(3289, ZEND_IN_ARRAY_SPEC_TMP_CONST) \ + _(3290, ZEND_IN_ARRAY_SPEC_VAR_CONST) \ + _(3292, ZEND_IN_ARRAY_SPEC_CV_CONST) \ + _(3293, ZEND_COUNT_SPEC_CONST_UNUSED) \ + _(3294, ZEND_COUNT_SPEC_TMP_UNUSED) \ + _(3295, ZEND_COUNT_SPEC_VAR_UNUSED) \ + _(3297, ZEND_COUNT_SPEC_CV_UNUSED) \ + _(3298, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \ + _(3299, ZEND_GET_CLASS_SPEC_TMP_UNUSED) \ + _(3300, ZEND_GET_CLASS_SPEC_VAR_UNUSED) \ + _(3301, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \ + _(3302, ZEND_GET_CLASS_SPEC_CV_UNUSED) \ + _(3303, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \ + _(3304, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \ + _(3305, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \ + _(3306, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \ + _(3308, ZEND_GET_TYPE_SPEC_CV_UNUSED) \ + _(3309, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \ + _(3310, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \ + _(3313, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \ + _(3315, ZEND_UNSET_CV_SPEC_CV_UNUSED) \ + _(3316, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \ + _(3317, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \ + _(3318, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \ + _(3319, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ + _(3320, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ + _(3322, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \ + _(3323, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \ + _(3324, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ + _(3325, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ + _(3327, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \ + _(3328, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ + _(3329, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(3330, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(3332, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ + _(3333, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ + _(3334, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(3335, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(3337, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ + _(3343, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \ + _(3344, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ + _(3345, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ + _(3347, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \ + _(3400, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR) \ + _(3402, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV) \ + _(3405, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(3407, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(3410, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \ + _(3412, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \ + _(3420, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR) \ + _(3422, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV) \ + _(3425, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR) \ + _(3427, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV) \ + _(3430, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ + _(3432, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ + _(3435, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \ + _(3437, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \ + _(3445, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR) \ + _(3447, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV) \ + _(3450, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR) \ + _(3452, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) \ + _(3455, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(3457, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(3460, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR) \ + _(3462, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV) \ + _(3470, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR) \ + _(3472, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV) \ + _(3473, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST) \ + _(3474, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP) \ + _(3475, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR) \ + _(3477, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) \ + _(3483, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST) \ + _(3484, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP) \ + _(3485, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR) \ + _(3487, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) \ + _(3488, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST) \ + _(3489, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP) \ + _(3490, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR) \ + _(3492, ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) \ + _(3498, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST) \ + _(3499, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP) \ + _(3500, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3502, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3508, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST) \ + _(3509, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP) \ + _(3510, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3512, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3513, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST) \ + _(3514, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP) \ + _(3515, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3517, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3523, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST) \ + _(3524, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP) \ + _(3525, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3527, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3533, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST) \ + _(3534, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP) \ + _(3535, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3537, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3538, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST) \ + _(3539, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP) \ + _(3540, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3542, ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3573, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST) \ + _(3574, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP) \ + _(3575, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR) \ + _(3577, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV) \ + _(3583, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST) \ + _(3584, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP) \ + _(3585, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR) \ + _(3587, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV) \ + _(3588, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST) \ + _(3589, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) \ + _(3590, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) \ + _(3592, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) \ + _(3598, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) \ + _(3600, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) \ + _(3601, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) \ + _(3603, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3605, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3606, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3608, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3610, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3611, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3618, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) \ + _(3620, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) \ + _(3621, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) \ + _(3623, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3625, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3626, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3628, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3630, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3631, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3633, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3635, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3636, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3643, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3645, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3646, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3648, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3650, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3651, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3653, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3655, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3656, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3658, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3660, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3661, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3668, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3670, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3671, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3673, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3675, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3676, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3678, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3680, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3681, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3683, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3685, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3686, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3693, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3695, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3696, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3698, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3700, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3701, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3703, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3705, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3706, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3708, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3710, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3711, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3718, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3720, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3721, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3723, ZEND_JMP_FORWARD_SPEC) \ + _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3731, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3736, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3738, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3746, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3748, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3756, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3761, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3763, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3771, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3773, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3781, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3786, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3788, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3796, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3798, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3801, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3806, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3811, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3813, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3821, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3823, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3826, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3828, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3831, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3836, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3838, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3846, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3848, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3851, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3853, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3856, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3861, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3863, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3871, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3873, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3881, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3886, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3888, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3896, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3898, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3906, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3911, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3913, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3921, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3923, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3931, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3936, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3938, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3946, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3948, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3972, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3987, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3993, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4017, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4023, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4047, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4062, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4068, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4092, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4098, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4122, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4137, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4143, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4167, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4173, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4197, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4212, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4218, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4242, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4248, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4257, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4263, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4272, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4287, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4293, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4317, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4323, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4332, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4347, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4362, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4368, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4392, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4398, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4407, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4422, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4437, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4443, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4467, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4473, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4482, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4497, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4512, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4518, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4542, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4548, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4550, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4552, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4554, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4556, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4558, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4560, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4561, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4562, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4563, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4564, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4565, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4566, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4569, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4571, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4574, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4576, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4579, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4584, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4589, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4591, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4599, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4601, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4604, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4606, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4609, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4611, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4612, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ + _(4613, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ + _(4614, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4615, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4615+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 12d8fa8d679..b821fcbc8f4 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[200] = { +static const char *zend_vm_opcodes_names[207] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -223,9 +223,16 @@ static const char *zend_vm_opcodes_names[200] = { "ZEND_ISSET_ISEMPTY_CV", "ZEND_FETCH_LIST_W", "ZEND_ARRAY_KEY_EXISTS", + "ZEND_ASSIGN_OBJ_REF", + "ZEND_ASSIGN_STATIC_PROP", + "ZEND_ASSIGN_STATIC_PROP_REF", + "ZEND_PRE_INC_STATIC_PROP", + "ZEND_PRE_DEC_STATIC_PROP", + "ZEND_POST_INC_STATIC_PROP", + "ZEND_POST_DEC_STATIC_PROP", }; -static uint32_t zend_vm_opcodes_flags[200] = { +static uint32_t zend_vm_opcodes_flags[207] = { 0x00000000, 0x00000707, 0x00000707, @@ -249,17 +256,17 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00000707, 0x07000003, 0x00000003, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, - 0x04046751, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, + 0x04046753, 0x00000001, 0x00000001, 0x00000001, @@ -311,7 +318,7 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00040757, 0x00010107, 0x00006701, - 0x00040751, + 0x00640751, 0x00010107, 0x00006701, 0x00040751, @@ -320,7 +327,7 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00040757, 0x00010107, 0x00006703, - 0x00040753, + 0x00240753, 0x00010107, 0x00000701, 0x00040751, @@ -393,17 +400,17 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x0000a110, 0x00000000, 0x00000707, - 0x04046751, + 0x04046753, 0x00040301, 0x00002007, 0x00000707, 0x03000000, 0x03000303, 0x00047307, + 0x00647307, 0x00047307, 0x00047307, - 0x00047307, - 0x00047307, + 0x00247307, 0x00047307, 0x00047307, 0x00067307, @@ -426,6 +433,13 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00020101, 0x00000701, 0x00000707, + 0x0b040751, + 0x00040307, + 0x0b040307, + 0x00040307, + 0x00040307, + 0x00040307, + 0x00040307, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 922377b72b5..c4c9c1c5830 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -53,6 +53,8 @@ #define ZEND_VM_EXT_CACHE_SLOT 0x00040000 #define ZEND_VM_EXT_ARRAY_INIT 0x00080000 #define ZEND_VM_EXT_REF 0x00100000 +#define ZEND_VM_EXT_FETCH_REF 0x00200000 +#define ZEND_VM_EXT_DIM_OBJ_WRITE 0x00400000 #define ZEND_VM_EXT_MASK 0x0f000000 #define ZEND_VM_EXT_NUM 0x01000000 #define ZEND_VM_EXT_LAST_CATCH 0x02000000 @@ -270,7 +272,14 @@ END_EXTERN_C() #define ZEND_ISSET_ISEMPTY_CV 197 #define ZEND_FETCH_LIST_W 198 #define ZEND_ARRAY_KEY_EXISTS 199 +#define ZEND_ASSIGN_OBJ_REF 200 +#define ZEND_ASSIGN_STATIC_PROP 201 +#define ZEND_ASSIGN_STATIC_PROP_REF 202 +#define ZEND_PRE_INC_STATIC_PROP 203 +#define ZEND_PRE_DEC_STATIC_PROP 204 +#define ZEND_POST_INC_STATIC_PROP 205 +#define ZEND_POST_DEC_STATIC_PROP 206 -#define ZEND_VM_LAST_OPCODE 199 +#define ZEND_VM_LAST_OPCODE 206 #endif diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 9c58732e0b4..fd70a98ef7b 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -58,7 +58,7 @@ static zval *com_property_read(zval *object, zval *member, int type, void **cahc return rv; } -static void com_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *com_property_write(zval *object, zval *member, zval *value, void **cache_slot) { php_com_dotnet_object *obj; VARIANT v; @@ -76,6 +76,7 @@ static void com_property_write(zval *object, zval *member, zval *value, void **c } else { php_com_throw_exception(E_INVALIDARG, "this variant has no properties"); } + return value; } static zval *com_read_dimension(zval *object, zval *offset, int type, zval *rv) diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index e5b390bca6b..abdca043349 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -69,7 +69,7 @@ static inline void clone_indices(php_com_saproxy *dest, php_com_saproxy *src, in } } -static zval *saproxy_property_read(zval *object, zval *member, int type, void **cahce_slot, zval *rv) +static zval *saproxy_property_read(zval *object, zval *member, int type, void **cache_slot, zval *rv) { ZVAL_NULL(rv); diff --git a/ext/curl/multi.c b/ext/curl/multi.c index cacda1aef44..1a891a4ebc2 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -265,7 +265,7 @@ PHP_FUNCTION(curl_multi_exec) ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_RESOURCE(z_mh) - Z_PARAM_ZVAL_DEREF(z_still_running) + Z_PARAM_ZVAL(z_still_running) ZEND_PARSE_PARAMETERS_END(); if ((mh = (php_curlm *)zend_fetch_resource(Z_RES_P(z_mh), le_curl_multi_handle_name, le_curl_multi_handle)) == NULL) { @@ -290,8 +290,7 @@ PHP_FUNCTION(curl_multi_exec) still_running = zval_get_long(z_still_running); error = curl_multi_perform(mh->multi, &still_running); - zval_ptr_dtor(z_still_running); - ZVAL_LONG(z_still_running, still_running); + ZEND_TRY_ASSIGN_LONG(z_still_running, still_running); SAVE_CURLM_ERROR(mh, error); RETURN_LONG((zend_long) error); @@ -338,7 +337,7 @@ PHP_FUNCTION(curl_multi_info_read) ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_RESOURCE(z_mh) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(zmsgs_in_queue) + Z_PARAM_ZVAL(zmsgs_in_queue) ZEND_PARSE_PARAMETERS_END(); if ((mh = (php_curlm *)zend_fetch_resource(Z_RES_P(z_mh), le_curl_multi_handle_name, le_curl_multi_handle)) == NULL) { @@ -349,9 +348,9 @@ PHP_FUNCTION(curl_multi_info_read) if (tmp_msg == NULL) { RETURN_FALSE; } + if (zmsgs_in_queue) { - zval_ptr_dtor(zmsgs_in_queue); - ZVAL_LONG(zmsgs_in_queue, queued_msgs); + ZEND_TRY_ASSIGN_LONG(zmsgs_in_queue, queued_msgs); } array_init(return_value); diff --git a/ext/date/php_date.c b/ext/date/php_date.c index f40ec15e070..eb56deb5581 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -660,10 +660,10 @@ static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp static void php_timezone_to_string(php_timezone_obj *tzobj, zval *zv); zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); static zval *date_interval_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); /* {{{ Module struct */ zend_module_entry date_module_entry = { @@ -4211,7 +4211,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c /* }}} */ /* {{{ date_interval_write_property */ -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) { php_interval_obj *obj; zval tmp_member; @@ -4225,17 +4225,17 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void obj = Z_PHPINTERVAL_P(object); if (!obj->initialized) { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); if (member == &tmp_member) { zval_ptr_dtor_str(&tmp_member); } - return; + return value; } #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ obj->diff->n = zval_get_long(value); \ - break; \ + break; \ } do { @@ -4251,12 +4251,14 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void } SET_VALUE_FROM_STRUCT(invert, "invert"); /* didn't find any */ - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } while(0); if (member == &tmp_member) { zval_ptr_dtor_str(&tmp_member); } + + return value; } /* }}} */ @@ -5295,9 +5297,10 @@ static zval *date_period_read_property(zval *object, zval *member, int type, voi /* }}} */ /* {{{ date_period_write_property */ -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zend_throw_error(NULL, "Writing to DatePeriod properties is unsupported"); + return value; } /* }}} */ diff --git a/ext/date/tests/DateInterval_write_property_return.phpt b/ext/date/tests/DateInterval_write_property_return.phpt new file mode 100644 index 00000000000..9c2c5c9137b --- /dev/null +++ b/ext/date/tests/DateInterval_write_property_return.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test that return value handling for DateInterval property writes do not corrupt RHS +--FILE-- +f = $f); +var_dump($f); + +?> +--EXPECT-- +float(0.5) +float(0.5) diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 72ae3c3ffea..a25a185e012 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -356,7 +356,7 @@ zval *dom_read_property(zval *object, zval *member, int type, void **cache_slot, /* }}} */ /* {{{ dom_write_property */ -void dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) { dom_object *obj = Z_DOMOBJ_P(object); zend_string *member_str = zval_get_string(member); @@ -368,10 +368,12 @@ void dom_write_property(zval *object, zval *member, zval *value, void **cache_sl if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } zend_string_release_ex(member_str, 0); + + return value; } /* }}} */ diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 6b778092f93..595d41e9d45 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -711,13 +711,15 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z/", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z", &dict, &word, &wordlen, &sugg) == FAILURE) { RETURN_FALSE; } if (sugg) { - zval_ptr_dtor(sugg); - array_init(sugg); + sugg = zend_try_array_init(sugg); + if (!sugg) { + return; + } } PHP_ENCHANT_GET_DICT; diff --git a/ext/exif/exif.c b/ext/exif/exif.c index 48e93721619..d37a61f83da 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -4606,9 +4606,9 @@ PHP_FUNCTION(exif_thumbnail) ZEND_PARSE_PARAMETERS_START(1, 4) Z_PARAM_ZVAL(stream) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(z_width) - Z_PARAM_ZVAL_DEREF(z_height) - Z_PARAM_ZVAL_DEREF(z_imagetype) + Z_PARAM_ZVAL(z_width) + Z_PARAM_ZVAL(z_height) + Z_PARAM_ZVAL(z_imagetype) ZEND_PARSE_PARAMETERS_END(); memset(&ImageInfo, 0, sizeof(ImageInfo)); @@ -4653,14 +4653,11 @@ PHP_FUNCTION(exif_thumbnail) if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) { exif_scan_thumbnail(&ImageInfo); } - zval_ptr_dtor(z_width); - zval_ptr_dtor(z_height); - ZVAL_LONG(z_width, ImageInfo.Thumbnail.width); - ZVAL_LONG(z_height, ImageInfo.Thumbnail.height); + ZEND_TRY_ASSIGN_LONG(z_width, ImageInfo.Thumbnail.width); + ZEND_TRY_ASSIGN_LONG(z_height, ImageInfo.Thumbnail.height); } if (arg_c >= 4) { - zval_ptr_dtor(z_imagetype); - ZVAL_LONG(z_imagetype, ImageInfo.Thumbnail.filetype); + ZEND_TRY_ASSIGN_LONG(z_imagetype, ImageInfo.Thumbnail.filetype); } #ifdef EXIF_DEBUG diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 4b3a0fb3066..5be151cb59a 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -677,7 +677,7 @@ PHP_FUNCTION(ftp_alloc) zend_long size, ret; zend_string *response = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &z_ftp, &size, &zresponse) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &z_ftp, &size, &zresponse) == FAILURE) { RETURN_FALSE; } @@ -686,9 +686,9 @@ PHP_FUNCTION(ftp_alloc) } ret = ftp_alloc(ftp, size, zresponse ? &response : NULL); + if (response) { - zval_ptr_dtor(zresponse); - ZVAL_STR(zresponse, response); + ZEND_TRY_ASSIGN_STR(zresponse, response); } if (!ret) { diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index 347f929cbd5..4ee14b3ce36 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -51,7 +51,7 @@ PHP_FUNCTION( numfmt_parse ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz!", &object, NumberFormatter_ce_ptr, &str, &str_len, &type, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -60,6 +60,11 @@ PHP_FUNCTION( numfmt_parse ) RETURN_FALSE; } + if(zposition) { + position = (int32_t) zval_get_long(zposition); + position_p = &position; + } + /* Fetch the object. */ FORMATTER_METHOD_FETCH_OBJECT; @@ -67,12 +72,6 @@ PHP_FUNCTION( numfmt_parse ) intl_convert_utf8_to_utf16(&sstr, &sstr_len, str, str_len, &INTL_DATA_ERROR_CODE(nfo)); INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); - if(zposition) { - ZVAL_DEREF(zposition); - position = (int32_t)zval_get_long( zposition ); - position_p = &position; - } - #if ICU_LOCALE_BUG && defined(LC_NUMERIC) /* need to copy here since setlocale may change it later */ oldlocale = estrdup(setlocale(LC_NUMERIC, NULL)); @@ -106,8 +105,7 @@ PHP_FUNCTION( numfmt_parse ) efree(oldlocale); #endif if(zposition) { - zval_ptr_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { @@ -138,7 +136,7 @@ PHP_FUNCTION( numfmt_parse_currency ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z!", &object, NumberFormatter_ce_ptr, &str, &str_len, &zcurrency, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -155,15 +153,13 @@ PHP_FUNCTION( numfmt_parse_currency ) INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); if(zposition) { - ZVAL_DEREF(zposition); - position = (int32_t)zval_get_long( zposition ); + position = (int32_t) zval_get_long(zposition); position_p = &position; } number = unum_parseDoubleCurrency(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, currency, &INTL_DATA_ERROR_CODE(nfo)); if(zposition) { - zval_ptr_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { efree(sstr); diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 305a944cce2..d717d46ee20 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -259,7 +259,7 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_reset(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz", &domain, &option, &variant, &idna_info) == FAILURE) { php_intl_bad_args("bad arguments"); RETURN_NULL(); /* don't set FALSE because that's not the way it was before... */ @@ -291,8 +291,10 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) "4 arguments were provided, but INTL_IDNA_VARIANT_2003 only " "takes 3 - extra argument ignored"); } else { - zval_ptr_dtor(idna_info); - array_init(idna_info); + idna_info = zend_try_array_init(idna_info); + if (!idna_info) { + return; + } } } diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c index e06ebd5c259..0f5d8cbf21d 100644 --- a/ext/intl/transliterator/transliterator_class.c +++ b/ext/intl/transliterator/transliterator_class.c @@ -255,8 +255,7 @@ static zval *Transliterator_read_property( zval *object, zval *member, int type, /* }}} */ /* {{{ write_property handler */ -static void Transliterator_write_property( zval *object, zval *member, zval *value, - void **cache_slot ) +static zval *Transliterator_write_property( zval *object, zval *member, zval *value, void **cache_slot ) { zend_class_entry *scope; TRANSLITERATOR_PROPERTY_HANDLER_PROLOG; @@ -274,10 +273,12 @@ static void Transliterator_write_property( zval *object, zval *member, zval *val } else { - zend_std_write_property( object, member, value, cache_slot ); + value = zend_std_write_property( object, member, value, cache_slot ); } TRANSLITERATOR_PROPERTY_HANDLER_EPILOG; + + return value; } /* }}} */ diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 1ddf1a77ca7..0528ea08d77 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -576,7 +576,11 @@ static void _php_ldap_controls_to_array(LDAP *ld, LDAPControl** ctrls, zval* arr zval tmp1; LDAPControl **ctrlp; - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } + if (ctrls == NULL) { return; } @@ -2975,7 +2979,7 @@ PHP_FUNCTION(ldap_get_option) ldap_linkdata *ld; zend_long option; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/", &link, &option, &retval) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &link, &option, &retval) != SUCCESS) { return; } @@ -3017,8 +3021,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, option, &val)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, val); + ZEND_TRY_ASSIGN_LONG(retval, val); } break; #ifdef LDAP_OPT_NETWORK_TIMEOUT case LDAP_OPT_NETWORK_TIMEOUT: @@ -3034,8 +3037,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #elif defined(LDAP_X_OPT_CONNECT_TIMEOUT) @@ -3046,8 +3048,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, (timeout / 1000)); + ZEND_TRY_ASSIGN_LONG(retval, (timeout / 1000)); } break; #endif #ifdef LDAP_OPT_TIMEOUT @@ -3064,8 +3065,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #endif @@ -3112,8 +3112,7 @@ PHP_FUNCTION(ldap_get_option) } RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_STRING(retval, val); + ZEND_TRY_ASSIGN_STRING(retval, val); ldap_memfree(val); } break; case LDAP_OPT_SERVER_CONTROLS: @@ -3333,7 +3332,7 @@ PHP_FUNCTION(ldap_parse_result) char *lmatcheddn, *lerrmsg; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(myargcount, "rrz/|z/z/z/z/", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { + if (zend_parse_parameters(myargcount, "rrz|zzzz", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { return; } @@ -3356,16 +3355,17 @@ PHP_FUNCTION(ldap_parse_result) RETURN_FALSE; } - zval_ptr_dtor(errcode); - ZVAL_LONG(errcode, lerrcode); + ZEND_TRY_ASSIGN_LONG(errcode, lerrcode); /* Reverse -> fall through */ switch (myargcount) { case 7: _php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0); case 6: - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -3375,19 +3375,17 @@ PHP_FUNCTION(ldap_parse_result) ldap_memvfree((void**)lreferrals); } case 5: - zval_ptr_dtor(errmsg); if (lerrmsg == NULL) { - ZVAL_EMPTY_STRING(errmsg); + ZEND_TRY_ASSIGN_EMPTY_STRING(errmsg); } else { - ZVAL_STRING(errmsg, lerrmsg); + ZEND_TRY_ASSIGN_STRING(errmsg, lerrmsg); ldap_memfree(lerrmsg); } case 4: - zval_ptr_dtor(matcheddn); if (lmatcheddn == NULL) { - ZVAL_EMPTY_STRING(matcheddn); + ZEND_TRY_ASSIGN_EMPTY_STRING(matcheddn); } else { - ZVAL_STRING(matcheddn, lmatcheddn); + ZEND_TRY_ASSIGN_STRING(matcheddn, lmatcheddn); ldap_memfree(lmatcheddn); } } @@ -3398,7 +3396,7 @@ PHP_FUNCTION(ldap_parse_result) /* {{{ Extended operation response parsing, Pierangelo Masarati */ #ifdef HAVE_LDAP_PARSE_EXTENDED_RESULT -/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string retdata [, string retoid]]) +/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string &retdata [, string &retoid]]) Extract information from extended operation result */ PHP_FUNCTION(ldap_parse_exop) { @@ -3409,7 +3407,7 @@ PHP_FUNCTION(ldap_parse_exop) struct berval *lretdata; int rc, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(myargcount, "rr|z/z/", &link, &result, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(myargcount, "rr|zz", &link, &result, &retdata, &retoid) != SUCCESS) { WRONG_PARAM_COUNT; } @@ -3433,20 +3431,18 @@ PHP_FUNCTION(ldap_parse_exop) /* Reverse -> fall through */ switch (myargcount) { case 4: - zval_ptr_dtor(retoid); if (lretoid == NULL) { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } else { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } case 3: /* use arg #3 as the data returned by the server */ - zval_ptr_dtor(retdata); if (lretdata == NULL) { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } else { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } @@ -3524,7 +3520,7 @@ PHP_FUNCTION(ldap_next_reference) /* }}} */ #ifdef HAVE_LDAP_PARSE_REFERENCE -/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array referrals) +/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array &referrals) Extract information from reference entry */ PHP_FUNCTION(ldap_parse_reference) { @@ -3533,7 +3529,7 @@ PHP_FUNCTION(ldap_parse_reference) ldap_resultentry *resultentry; char **lreferrals, **refp; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz/", &link, &result_entry, &referrals) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz", &link, &result_entry, &referrals) != SUCCESS) { return; } @@ -3549,8 +3545,11 @@ PHP_FUNCTION(ldap_parse_reference) RETURN_FALSE; } - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } + if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -4015,7 +4014,7 @@ PHP_FUNCTION(ldap_control_paged_result_response) ber_tag_t tag; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(myargcount, "rr|z/z/", &link, &result, &cookie, &estimated) != SUCCESS) { + if (zend_parse_parameters(myargcount, "rr|zz", &link, &result, &cookie, &estimated) != SUCCESS) { return; } @@ -4082,15 +4081,13 @@ PHP_FUNCTION(ldap_control_paged_result_response) ldap_controls_free(lserverctrls); if (myargcount == 4) { - zval_ptr_dtor(estimated); - ZVAL_LONG(estimated, lestimated); + ZEND_TRY_ASSIGN_LONG(estimated, lestimated); } - zval_ptr_dtor(cookie); if (lcookie.bv_len == 0) { - ZVAL_EMPTY_STRING(cookie); + ZEND_TRY_ASSIGN_EMPTY_STRING(cookie); } else { - ZVAL_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); + ZEND_TRY_ASSIGN_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); } ldap_memfree(lcookie.bv_val); @@ -4115,7 +4112,7 @@ PHP_FUNCTION(ldap_exop) LDAPControl **lserverctrls = NULL; int rc, msgid; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!z/z/", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!zz", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { return; } @@ -4153,22 +4150,20 @@ PHP_FUNCTION(ldap_exop) } if (retoid) { - zval_ptr_dtor(retoid); if (lretoid) { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } else { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } } - zval_ptr_dtor(retdata); if (lretdata) { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } else { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } RETVAL_TRUE; @@ -4219,7 +4214,7 @@ PHP_FUNCTION(ldap_exop_passwd) int rc, myargcount = ZEND_NUM_ARGS(), msgid, err; char* errmsg; - if (zend_parse_parameters(myargcount, "r|zzzz/", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { + if (zend_parse_parameters(myargcount, "r|zzzz", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { WRONG_PARAM_COUNT; } diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index cdca12b00ee..264c6020cab 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2131,14 +2131,15 @@ PHP_FUNCTION(mb_parse_str) const mbfl_encoding *detected; track_vars_array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &encstr, &encstr_len, &track_vars_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &encstr, &encstr_len, &track_vars_array) == FAILURE) { return; } if (track_vars_array != NULL) { - /* Clear out the array */ - zval_ptr_dtor(track_vars_array); - array_init(track_vars_array); + track_vars_array = zend_try_array_init(track_vars_array); + if (!track_vars_array) { + return; + } } encstr = estrndup(encstr, encstr_len); diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index cc96e04f39f..d443999f743 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -863,13 +863,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z/", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } if (array != NULL) { - zval_ptr_dtor(array); - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } } if (!php_mb_check_encoding( diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index f3d5e823099..b33ee41336a 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -333,7 +333,7 @@ zval *mysqli_read_property(zval *object, zval *member, int type, void **cache_sl /* }}} */ /* {{{ mysqli_write_property */ -void mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; mysqli_object *obj; @@ -353,12 +353,14 @@ void mysqli_write_property(zval *object, zval *member, zval *value, void **cache if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_ptr_dtor_str(&tmp_member); } + + return value; } /* }}} */ diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 40c7d2982d3..e805da9fa79 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -967,17 +967,11 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) zval *result; /* it must be a reference, isn't it? */ if (Z_ISREF(stmt->result.vars[i])) { - result = Z_REFVAL(stmt->result.vars[i]); + result = stmt->result.vars[i]; } else { - result = &stmt->result.vars[i]; + continue; // but be safe ... } - /* - QQ: Isn't it quite better to call zval_dtor(). What if the user has - assigned a resource, or an array to the bound variable? We are going - to leak probably. zval_dtor() will handle also Unicode/Non-unicode mode. - */ /* Even if the string is of length zero there is one byte alloced so efree() in all cases */ - zval_ptr_dtor(result); if (!stmt->result.is_null[i]) { switch (stmt->result.buf[i].type) { case IS_LONG: @@ -998,16 +992,16 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) } while (--j > 0); tmp[10]= '\0'; /* unsigned int > INT_MAX is 10 digits - ALWAYS */ - ZVAL_STRINGL(result, tmp, 10); + ZEND_TRY_ASSIGN_STRINGL(result, tmp, 10); efree(tmp); break; } #endif } if (stmt->stmt->fields[i].flags & UNSIGNED_FLAG) { - ZVAL_LONG(result, *(unsigned int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(unsigned int *)stmt->result.buf[i].val); } else { - ZVAL_LONG(result, *(int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(int *)stmt->result.buf[i].val); } break; case IS_DOUBLE: @@ -1024,7 +1018,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) dval = *((double *)stmt->result.buf[i].val); } - ZVAL_DOUBLE(result, dval); + ZEND_TRY_ASSIGN_DOUBLE(result, dval); break; } case IS_STRING: @@ -1065,20 +1059,20 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) * use MYSQLI_LL_SPEC. */ snprintf(tmp, sizeof(tmp), (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval); - ZVAL_STRING(result, tmp); + ZEND_TRY_ASSIGN_STRING(result, tmp); } else { - ZVAL_LONG(result, llval); + ZEND_TRY_ASSIGN_LONG(result, llval); } } else { #if defined(MYSQL_DATA_TRUNCATED) && MYSQL_VERSION_ID > 50002 if (ret == MYSQL_DATA_TRUNCATED && *(stmt->stmt->bind[i].error) != 0) { /* result was truncated */ - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); } else { #else { #endif - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); } } break; @@ -1086,7 +1080,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) break; } } else { - ZVAL_NULL(result); + ZEND_TRY_ASSIGN_NULL(result); } } } else { diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index d8671b9da01..703c1f050a8 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -761,15 +761,11 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsign } for (i = 0; i < result->field_count; i++) { - zval *result = &stmt->result_bind[i].zv; - - ZVAL_DEREF(result); - /* Clean what we copied last time */ - zval_ptr_dtor(result); /* copy the type */ + zval *resultzv = &stmt->result_bind[i].zv; if (stmt->result_bind[i].bound == TRUE) { DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); - ZVAL_COPY(result, ¤t_row[i]); + ZEND_TRY_ASSIGN_COPY_EX(resultzv, ¤t_row[i], 0); } } } @@ -849,17 +845,15 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi } for (i = 0; i < field_count; i++) { + zval *resultzv = &stmt->result_bind[i].zv; if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; if (Z_TYPE_P(data) == IS_STRING && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ meta->fields[i].max_length = Z_STRLEN_P(data); } - ZVAL_DEREF(result); - zval_ptr_dtor(result); - ZVAL_COPY_VALUE(result, data); + ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } @@ -1025,12 +1019,10 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { + zval *resultzv = &stmt->result_bind[i].zv; if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - zval_ptr_dtor(result); DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, &stmt->result_bind[i].zv, Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? Z_REFCOUNT(stmt->result_bind[i].zv) : 0); @@ -1040,7 +1032,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned meta->fields[i].max_length = Z_STRLEN_P(data); } - ZVAL_COPY_VALUE(result, data); + ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } @@ -1120,28 +1112,6 @@ MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fe SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(conn->error_info); - DBG_INF_FMT("result_bind=%p separated_once=%u", &stmt->result_bind, stmt->result_zvals_separated_once); - /* - The user might have not bound any variables for result. - Do the binding once she does it. - */ - if (stmt->result_bind && !stmt->result_zvals_separated_once) { - unsigned int i; - /* - mysqlnd_stmt_store_result() has been called free the bind - variables to prevent leaking of their previous content. - */ - for (i = 0; i < stmt->result->field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - zval_ptr_dtor(result); - ZVAL_NULL(result); - } - } - stmt->result_zvals_separated_once = TRUE; - } - ret = stmt->result->m.fetch_row(stmt->result, (void*)s, 0, fetched_anything); DBG_RETURN(ret); } @@ -1537,7 +1507,6 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const s, } mysqlnd_stmt_separate_result_bind(s); - stmt->result_zvals_separated_once = FALSE; stmt->result_bind = result_bind; for (i = 0; i < stmt->field_count; i++) { /* Prevent from freeing */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 8a9018356e7..a5c13598531 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -1309,7 +1309,6 @@ struct st_mysqlnd_stmt_data unsigned char send_types_to_server; MYSQLND_PARAM_BIND *param_bind; MYSQLND_RESULT_BIND *result_bind; - zend_bool result_zvals_separated_once; MYSQLND_UPSERT_STATUS * upsert_status; MYSQLND_UPSERT_STATUS upsert_status_impl; diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 2e05afa5277..8eda816bd5e 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1473,7 +1473,7 @@ PHP_FUNCTION(oci_fetch_all) ZEND_PARSE_PARAMETERS_START(2, 5) Z_PARAM_RESOURCE(z_statement) - Z_PARAM_ZVAL_DEREF_EX(array, 0, 1) + Z_PARAM_ZVAL(array) Z_PARAM_OPTIONAL Z_PARAM_LONG(skip) Z_PARAM_LONG(maxrows) @@ -1482,20 +1482,21 @@ PHP_FUNCTION(oci_fetch_all) PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - zval_ptr_dtor(array); - while (skip--) { if (php_oci_statement_fetch(statement, nrows)) { - array_init(array); + zend_try_array_init(array); RETURN_LONG(0); } } if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) { /* Fetch by Row: array will contain one sub-array per query row */ - array_init(array); - columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); + array = zend_try_array_init(array); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); for (i = 0; i < statement->ncolumns; i++) { columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0); } @@ -1534,7 +1535,11 @@ PHP_FUNCTION(oci_fetch_all) } else { /* default to BY_COLUMN */ /* Fetch by columns: array will contain one sub-array per query column */ - array_init_size(array, statement->ncolumns); + array = zend_try_array_init_size(array, statement->ncolumns); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0); diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index b7b67562a49..9156347e830 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -1876,13 +1876,13 @@ PHP_FUNCTION(odbc_fetch_into) #endif /* HAVE_SQL_EXTENDED_FETCH */ #ifdef HAVE_SQL_EXTENDED_FETCH - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { return; } rownum = pv_row; #else - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/", &pv_res, &pv_res_arr) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &pv_res, &pv_res_arr) == FAILURE) { return; } #endif /* HAVE_SQL_EXTENDED_FETCH */ @@ -1896,8 +1896,9 @@ PHP_FUNCTION(odbc_fetch_into) RETURN_FALSE; } - if (Z_TYPE_P(pv_res_arr) != IS_ARRAY) { - array_init(pv_res_arr); + pv_res_arr = zend_try_array_init(pv_res_arr); + if (!pv_res_arr) { + return; } #ifdef HAVE_SQL_EXTENDED_FETCH diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 9e3a0ab9a18..397458365f9 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -108,7 +108,7 @@ static uint32_t add_static_slot(HashTable *hash, ret = Z_LVAL_P(pos); } else { ret = *cache_size; - *cache_size += 2 * sizeof(void *); + *cache_size += (kind == LITERAL_STATIC_PROPERTY ? 3 : 2) * sizeof(void *); ZVAL_LONG(&tmp, ret); zend_hash_add(hash, key, &tmp); } @@ -183,6 +183,8 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } LITERAL_INFO(opline->op2.constant, LITERAL_CLASS_CONST, 1); break; + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -191,6 +193,11 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: +literals_handle_static_prop: if (opline->op2_type == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2); } @@ -210,6 +217,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: @@ -238,6 +246,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto literals_handle_static_prop; + } if (opline->op2_type == IS_CONST) { if (opline->extended_value == ZEND_ASSIGN_OBJ) { LITERAL_INFO(opline->op2.constant, LITERAL_PROPERTY, 1); @@ -547,24 +558,48 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - if (opline->extended_value != ZEND_ASSIGN_OBJ) { - break; + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + if (opline->op1_type == IS_CONST) { + // op1 static property + if (opline->op2_type == IS_CONST) { + (opline+1)->extended_value = add_static_slot(&hash, op_array, + opline->op2.constant, + opline->op1.constant, + LITERAL_STATIC_PROPERTY, + &cache_size); + } else { + (opline+1)->extended_value = cache_size; + cache_size += 3 * sizeof(void *); + } + } else if (opline->op2_type == IS_CONST) { + // op2 class + if (class_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = class_slot[opline->op2.constant]; + } else { + (opline+1)->extended_value = cache_size; + class_slot[opline->op2.constant] = cache_size; + cache_size += sizeof(void *); + } + } } - if (opline->op2_type == IS_CONST) { - // op2 property - if (opline->op1_type == IS_UNUSED && - property_slot[opline->op2.constant] >= 0) { - (opline+1)->extended_value = property_slot[opline->op2.constant]; - } else { - (opline+1)->extended_value = cache_size; - cache_size += 2 * sizeof(void *); - if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = (opline+1)->extended_value; + if (opline->extended_value == ZEND_ASSIGN_OBJ) { + if (opline->op2_type == IS_CONST) { + // op2 property + if (opline->op1_type == IS_UNUSED && + property_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = property_slot[opline->op2.constant]; + } else { + (opline+1)->extended_value = cache_size; + cache_size += 3 * sizeof(void *); + if (opline->op1_type == IS_UNUSED) { + property_slot[opline->op2.constant] = (opline+1)->extended_value; + } } } } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: @@ -580,12 +615,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant]; + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size; - cache_size += 2 * sizeof(void *); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); + cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value; + property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS; } } } @@ -598,7 +633,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY); } else { opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); - cache_size += 2 * sizeof(void *); + cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY; } @@ -689,6 +724,8 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx cache_size += 2 * sizeof(void *); } break; + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -696,30 +733,11 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - if (opline->op1_type == IS_CONST) { - // op1 static property - if (opline->op2_type == IS_CONST) { - opline->extended_value = add_static_slot(&hash, op_array, - opline->op2.constant, - opline->op1.constant, - LITERAL_STATIC_PROPERTY, - &cache_size); - } else { - opline->extended_value = cache_size; - cache_size += 2 * sizeof(void *); - } - } else if (opline->op2_type == IS_CONST) { - // op2 class - if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant]; - } else { - opline->extended_value = cache_size; - cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value; - } - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: if (opline->op1_type == IS_CONST) { // op1 static property if (opline->op2_type == IS_CONST) { @@ -727,19 +745,19 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & ZEND_ISEMPTY); + &cache_size) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); - cache_size += 2 * sizeof(void *); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); + cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); + class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY; } } break; diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 89898393a7a..95755d559ff 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -330,6 +330,9 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z case ZEND_ASSIGN_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: diff --git a/ext/opcache/Optimizer/escape_analysis.c b/ext/opcache/Optimizer/escape_analysis.c index f88de6202a5..a92d773783e 100644 --- a/ext/opcache/Optimizer/escape_analysis.c +++ b/ext/opcache/Optimizer/escape_analysis.c @@ -217,6 +217,7 @@ static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, in break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: if (OP1_INFO() & (MAY_BE_UNDEF | MAY_BE_NULL | MAY_BE_FALSE)) { /* implicit object/array allocation */ return 1; @@ -259,6 +260,7 @@ static int is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var return 1; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: return 1; case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: @@ -328,6 +330,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va /* break missing intentionally */ case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: @@ -508,7 +511,8 @@ int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, if (opline->opcode == ZEND_OP_DATA && ((opline-1)->opcode == ZEND_ASSIGN_DIM || - (opline-1)->opcode == ZEND_ASSIGN_OBJ) && + (opline-1)->opcode == ZEND_ASSIGN_OBJ || + (opline-1)->opcode == ZEND_ASSIGN_OBJ_REF) && op->op1_use == i && (op-1)->op1_use >= 0) { enclosing_root = ees[(op-1)->op1_use]; diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 08e1584923a..69a3e81c6b6 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -203,6 +203,7 @@ static zend_bool can_replace_op1( case ZEND_ASSIGN_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: @@ -251,6 +252,9 @@ static zend_bool can_replace_op1( case ZEND_VERIFY_RETURN_TYPE: // TODO: This would require a non-local change ??? return 0; + case ZEND_OP_DATA: + return (opline - 1)->opcode != ZEND_ASSIGN_OBJ_REF && + (opline - 1)->opcode != ZEND_ASSIGN_STATIC_PROP_REF; default: if (ssa_op->op1_def != -1) { ZEND_ASSERT(0); @@ -1400,7 +1404,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o if (op2) { SKIP_IF_TOP(op2); } - if (!opline->extended_value) { + if (opline->extended_value == 0) { if (zend_optimizer_eval_binary_op(&zv, zend_compound_assign_to_binary_op(opline->opcode), op1, op2) == SUCCESS) { SET_RESULT(op1, &zv); SET_RESULT(result, &zv); @@ -1494,6 +1498,11 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o zval_ptr_dtor_nogc(&zv); } } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + SET_RESULT_BOT(result); + break; + } else { + ZEND_ASSERT(0 && "Invalid compound assignment kind"); } SET_RESULT_BOT(result); SET_RESULT_BOT(op1); diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index 4430f193a89..66dd15da002 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -52,8 +52,14 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg if (next < end && next->opcode == ZEND_OP_DATA) { if (next->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { var_num = EX_VAR_TO_NUM(next->op1.var); - if (!DFG_ISSET(def, set_size, j, var_num)) { + if (opline->opcode == ZEND_ASSIGN_OBJ_REF + || opline->opcode == ZEND_ASSIGN_STATIC_PROP_REF) { DFG_SET(use, set_size, j, var_num); + DFG_SET(def, set_size, j, var_num); + } else { + if (!DFG_ISSET(def, set_size, j, var_num)) { + DFG_SET(use, set_size, j, var_num); + } } } if (next->op2_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { @@ -92,6 +98,7 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg case ZEND_UNSET_CV: case ZEND_ASSIGN: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_BIND_GLOBAL: case ZEND_BIND_STATIC: case ZEND_SEND_VAR_EX: diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index 90107785b74..d5f6c4564ba 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -451,6 +451,8 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * fprintf(stderr, " (dim)"); } else if (opline->extended_value == ZEND_ASSIGN_OBJ) { fprintf(stderr, " (obj)"); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + fprintf(stderr, " (static prop)"); } } else if (ZEND_VM_EXT_TYPE == (flags & ZEND_VM_EXT_MASK)) { switch (opline->extended_value) { @@ -554,7 +556,7 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * } else if (ZEND_VM_EXT_SRC == (flags & ZEND_VM_EXT_MASK)) { if (opline->extended_value == ZEND_RETURNS_VALUE) { fprintf(stderr, " (value)"); - } else if (opline->extended_value == ZEND_RETURNS_FUNCTION) { + } else if (opline->extended_value & ZEND_RETURNS_FUNCTION) { fprintf(stderr, " (function)"); } } else { @@ -585,6 +587,16 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * fprintf(stderr, " (ref)"); } } + if ((ZEND_VM_EXT_DIM_OBJ_WRITE|ZEND_VM_EXT_FETCH_REF) & flags) { + uint32_t obj_flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS; + if (obj_flags == ZEND_FETCH_REF) { + fprintf(stderr, " (ref)"); + } else if (obj_flags == ZEND_FETCH_DIM_WRITE) { + fprintf(stderr, " (dim write)"); + } else if (obj_flags == ZEND_FETCH_OBJ_WRITE) { + fprintf(stderr, " (obj write)"); + } + } } if (opline->op1_type == IS_CONST) { diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 9f1dfdba201..980f3c5fea2 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2240,6 +2240,24 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_ return NULL; } +static uint32_t zend_convert_type_code_to_may_be(zend_uchar type_code) { + switch (type_code) { + case IS_VOID: + return MAY_BE_NULL; + case IS_CALLABLE: + return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ITERABLE: + return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ARRAY: + return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case _IS_BOOL: + return MAY_BE_TRUE|MAY_BE_FALSE; + default: + ZEND_ASSERT(type_code < IS_REFERENCE); + return 1 << type_code; + } +} + static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce) { uint32_t tmp = 0; @@ -2252,22 +2270,7 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar *pce = get_class_entry(script, lcname); zend_string_release_ex(lcname, 0); } else if (ZEND_TYPE_IS_CODE(arg_info->type)) { - zend_uchar type_hint = ZEND_TYPE_CODE(arg_info->type); - - if (type_hint == IS_VOID) { - tmp |= MAY_BE_NULL; - } else if (type_hint == IS_CALLABLE) { - tmp |= MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ITERABLE) { - tmp |= MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ARRAY) { - tmp |= MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == _IS_BOOL) { - tmp |= MAY_BE_TRUE|MAY_BE_FALSE; - } else { - ZEND_ASSERT(type_hint < IS_REFERENCE); - tmp |= 1 << type_hint; - } + tmp |= zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(arg_info->type)); } else { tmp |= MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; } @@ -2277,6 +2280,123 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } +static zend_property_info *lookup_prop_info(zend_class_entry *ce, zend_string *name, zend_class_entry *scope) { + zend_property_info *prop_info; + + /* If the class is linked, reuse the precise runtime logic. */ + if (ce->ce_flags & ZEND_ACC_LINKED) { + zend_class_entry *prev_scope = EG(fake_scope); + EG(fake_scope) = scope; + prop_info = zend_get_property_info(ce, name, 1); + EG(fake_scope) = prev_scope; + if (prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO) { + return prop_info; + } + return NULL; + } + + /* Otherwise, handle only some safe cases */ + prop_info = zend_hash_find_ptr(&ce->properties_info, name); + if (prop_info && + ((prop_info->ce == scope) || + (!scope && (prop_info->flags & ZEND_ACC_PUBLIC))) + ) { + return prop_info; + } + return NULL; +} + +static zend_property_info *zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i) +{ + zend_property_info *prop_info = NULL; + if (opline->op2_type == IS_CONST) { + zend_class_entry *ce = NULL; + + if (opline->op1_type == IS_UNUSED) { + ce = op_array->scope; + } else if (ssa->ops[i].op1_use >= 0) { + ce = ssa->var_info[ssa->ops[i].op1_use].ce; + } + if (ce) { + prop_info = lookup_prop_info(ce, + Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants)), + op_array->scope); + if (prop_info && (prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } + } + } + return prop_info; +} + +static zend_property_info *zend_fetch_static_prop_info(const zend_script *script, const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline) +{ + zend_property_info *prop_info = NULL; + if (opline->op1_type == IS_CONST) { + zend_class_entry *ce = NULL; + if (opline->op2_type == IS_UNUSED) { + int fetch_type = opline->op2.num & ZEND_FETCH_CLASS_MASK; + switch (fetch_type) { + case ZEND_FETCH_CLASS_SELF: + case ZEND_FETCH_CLASS_STATIC: + /* We enforce that static property types cannot change during inheritance, so + * handling static the same way as self here is legal. */ + ce = op_array->scope; + break; + case ZEND_FETCH_CLASS_PARENT: + if (op_array->scope) { + ce = op_array->scope->parent; + } + break; + } + } else if (opline->op2_type == IS_CONST) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); + ce = get_class_entry(script, Z_STR_P(zv + 1)); + } + + if (ce) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants); + prop_info = lookup_prop_info(ce, Z_STR_P(zv), op_array->scope); + if (prop_info && !(prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } + } + } + return prop_info; +} + +static uint32_t zend_fetch_prop_type(const zend_script *script, zend_property_info *prop_info, zend_class_entry **pce) +{ + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { + uint32_t type = ZEND_TYPE_IS_CLASS(prop_info->type) + ? MAY_BE_OBJECT + : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type)); + + if (ZEND_TYPE_ALLOW_NULL(prop_info->type)) { + type |= MAY_BE_NULL; + } + if (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + type |= MAY_BE_RC1 | MAY_BE_RCN; + } + if (pce) { + if (ZEND_TYPE_IS_CE(prop_info->type)) { + *pce = ZEND_TYPE_CE(prop_info->type); + } else if (ZEND_TYPE_IS_NAME(prop_info->type)) { + zend_string *lcname = zend_string_tolower(ZEND_TYPE_NAME(prop_info->type)); + *pce = get_class_entry(script, lcname); + zend_string_release(lcname); + } else { + *pce = NULL; + } + } + return type; + } + if (pce) { + *pce = NULL; + } + return MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN; +} + static int zend_update_type_info(const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, @@ -2474,13 +2594,14 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_CONCAT: { + zend_property_info *prop_info = NULL; orig = 0; tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { - tmp |= MAY_BE_REF; + prop_info = zend_fetch_prop_info(op_array, ssa, opline, i); orig = t1; - t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + t1 = zend_fetch_prop_type(script, prop_info, &ce); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2489,6 +2610,10 @@ static int zend_update_type_info(const zend_op_array *op_array, orig = t1; t1 = zend_array_element_type(t1, 1, 0); t2 = OP1_DATA_INFO(); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline); + t1 = zend_fetch_prop_type(script, prop_info, &ce); + t2 = OP1_DATA_INFO(); } else { if (t1 & MAY_BE_REF) { tmp |= MAY_BE_REF; @@ -2524,10 +2649,13 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(orig, ssa_ops[i].op1_def); COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* Nothing to do */ } else { UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { + ce = NULL; if (opline->extended_value == ZEND_ASSIGN_DIM) { if (opline->op2_type == IS_UNUSED) { /* When appending to an array and the LONG_MAX key is already used @@ -2549,10 +2677,25 @@ static int zend_update_type_info(const zend_op_array *op_array, * anything else results in a null return value. */ tmp |= MAY_BE_NULL; } + + /* The return value must also satisfy the property type */ + if (prop_info) { + tmp &= zend_fetch_prop_type(script, prop_info, NULL); + } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* The return value must also satisfy the property type */ + if (prop_info) { + tmp &= zend_fetch_prop_type(script, prop_info, NULL); + } } + tmp &= ~MAY_BE_REF; UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } break; + } case ZEND_PRE_INC: case ZEND_PRE_DEC: tmp = 0; @@ -2727,9 +2870,13 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - // TODO: ??? - tmp = MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + // TODO: If there is no __set we might do better + tmp = zend_fetch_prop_type(script, + zend_fetch_prop_info(op_array, ssa, opline, i), &ce); UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } if ((opline+1)->op1_type == IS_CV) { opline++; @@ -2827,6 +2974,42 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + tmp = t1; + if (t1 & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + tmp &= ~(MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE); + tmp |= MAY_BE_OBJECT | MAY_BE_RC1 | MAY_BE_RCN; + } + if (tmp & MAY_BE_OBJECT) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); + } + + t2 = OP1_DATA_INFO(); + if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION)) { + tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF; + } else { + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_ERROR|MAY_BE_RC1|MAY_BE_RCN); + } + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + if (ssa_ops[i].result_def >= 0) { + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + } + if ((opline+1)->op1_type == IS_CV) { + opline++; + i++; + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_RC1|MAY_BE_RCN); + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + } + break; case ZEND_BIND_GLOBAL: tmp = MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; @@ -3245,6 +3428,7 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_FETCH_OBJ_RW: case ZEND_FETCH_OBJ_FUNC_ARG: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: case ZEND_POST_INC_OBJ: @@ -3342,14 +3526,31 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - if (opline->result_type == IS_TMP_VAR) { - /* can't be REF because of ZVAL_COPY_DEREF() usage */ - tmp |= MAY_BE_RC1 | MAY_BE_RCN; - } else { - tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ERROR; + tmp = zend_fetch_prop_type(script, + zend_fetch_prop_info(op_array, ssa, opline, i), &ce); + if (opline->result_type != IS_TMP_VAR) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; } UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } + } + break; + case ZEND_FETCH_STATIC_PROP_R: + case ZEND_FETCH_STATIC_PROP_IS: + case ZEND_FETCH_STATIC_PROP_RW: + case ZEND_FETCH_STATIC_PROP_W: + case ZEND_FETCH_STATIC_PROP_UNSET: + case ZEND_FETCH_STATIC_PROP_FUNC_ARG: + tmp = zend_fetch_prop_type(script, + zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); + if (opline->result_type != IS_TMP_VAR) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); } break; case ZEND_DO_FCALL: @@ -4182,7 +4383,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { if (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)) { switch (opline->opcode) { case ZEND_CASE: @@ -4206,9 +4407,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } - if (opline->op2_type == IS_CV) { + if (opline->op2_type == IS_CV) { if (t2 & MAY_BE_UNDEF) { switch (opline->opcode) { case ZEND_ASSIGN_REF: @@ -4228,7 +4429,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } switch (opline->opcode) { case ZEND_NOP: @@ -4390,6 +4591,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return (t1 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)) || (t2 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)); case ZEND_ASSIGN: + if (t1 & MAY_BE_REF) { + return 1; + } case ZEND_UNSET_VAR: return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)); case ZEND_ASSIGN_DIM: diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index d13b8a000e1..42cd5eef8fc 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -256,6 +256,14 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, zval *val) { switch (opline->opcode) { + case ZEND_OP_DATA: + switch ((opline-1)->opcode) { + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP_REF: + return 0; + } + opline->op1.constant = zend_optimizer_add_literal(op_array, val); + break; case ZEND_FREE: case ZEND_CHECK_VAR: MAKE_NOP(opline); @@ -312,6 +320,23 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, } zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + if (opline->extended_value != ZEND_ASSIGN_STATIC_PROP) { + break; + } + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -319,21 +344,17 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - TO_STRING_NOWARN(val); - opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && opline->extended_value + sizeof(void*) == op_array->cache_size) { - op_array->cache_size += sizeof(void *); - } else { - opline->extended_value = alloc_cache_slots(op_array, 2); - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } break; case ZEND_SEND_VAR: @@ -405,6 +426,8 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); opline->result.num = alloc_cache_slots(op_array, 1); break; + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -412,21 +435,17 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: +handle_static_prop: REQUIRES_STRING(val); drop_leading_backslash(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1); - } - break; - case ZEND_ISSET_ISEMPTY_STATIC_PROP: - REQUIRES_STRING(val); - drop_leading_backslash(val); - opline->op2.constant = zend_optimizer_add_literal(op_array, val); - zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); - if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_ISEMPTY|ZEND_FETCH_OBJ_FLAGS)); } break; case ZEND_INIT_FCALL: @@ -477,6 +496,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: @@ -490,12 +510,12 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_POST_DEC_OBJ: TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); - opline->extended_value = alloc_cache_slots(op_array, 2); + opline->extended_value = alloc_cache_slots(op_array, 3); break; case ZEND_ISSET_ISEMPTY_PROP_OBJ: TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); - opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_ISEMPTY); break; case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: @@ -512,7 +532,9 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, if (opline->extended_value == ZEND_ASSIGN_OBJ) { TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); - (opline+1)->extended_value = alloc_cache_slots(op_array, 2); + (opline+1)->extended_value = alloc_cache_slots(op_array, 3); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto handle_static_prop; } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (Z_TYPE_P(val) == IS_STRING) { zend_ulong index; diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index ea387bb95fd..ad34e7f643c 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -642,6 +642,22 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, //NEW_SSA_VAR(next->op1.var) } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + ssa_ops[k].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(opline->op1.var) + } + /* break missing intentionally */ + case ZEND_ASSIGN_STATIC_PROP_REF: + if (next->op1_type == IS_CV) { + ssa_ops[k + 1].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(next->op1.var) + } + break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: case ZEND_POST_INC_OBJ: diff --git a/ext/opcache/tests/opt/prop_types.phpt b/ext/opcache/tests/opt/prop_types.phpt new file mode 100644 index 00000000000..7962b1b893d --- /dev/null +++ b/ext/opcache/tests/opt/prop_types.phpt @@ -0,0 +1,115 @@ +--TEST-- +Property types in inference +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +opcache.opt_debug_level=0x200000 +--SKIPIF-- + +--FILE-- +public, $this->protected, $this->private); + } + + public function inTestWithTest2(Test2 $test2) { + var_dump($test2->public, $test2->protected, $test2->private); + } +} + +class Test2 extends Test { + private array $private; + + public function inTest2() { + var_dump($this->public, $this->protected, $this->private); + } +} + +function noScope(Test $test) { + var_dump($test->public, $test->protected, $test->private); +} + +?> +--EXPECTF-- +$_main: ; (lines=1, args=0, vars=0, tmps=0, ssa_vars=0, no_loops) + ; (before dfa pass) + ; %s + ; return [long] RANGE[1..1] +BB0: start exit lines=[0-0] + ; level=0 + RETURN int(1) + +noScope: ; (lines=10, args=1, vars=1, tmps=1, ssa_vars=5, no_loops) + ; (before dfa pass) + ; %s + ; return [null] RANGE[0..0] + ; #0.CV0($test) NOVAL [undef] +BB0: start exit lines=[0-9] + ; level=0 + #1.CV0($test) [object (instanceof Test)] = RECV 1 + INIT_FCALL 3 128 string("var_dump") + #2.T1 [bool] = FETCH_OBJ_R #1.CV0($test) [object (instanceof Test)] string("public") + SEND_VAL #2.T1 [bool] 1 + #3.T1 [any] = FETCH_OBJ_R #1.CV0($test) [object (instanceof Test)] string("protected") + SEND_VAL #3.T1 [any] 2 + #4.T1 [any] = FETCH_OBJ_R #1.CV0($test) [object (instanceof Test)] string("private") + SEND_VAL #4.T1 [any] 3 + DO_ICALL + RETURN null + +Test::inTest: ; (lines=9, args=0, vars=0, tmps=1, ssa_vars=3, no_loops) + ; (before dfa pass) + ; %s + ; return [null] RANGE[0..0] +BB0: start exit lines=[0-8] + ; level=0 + INIT_FCALL 3 128 string("var_dump") + #0.T0 [bool] = FETCH_OBJ_R THIS string("public") + SEND_VAL #0.T0 [bool] 1 + #1.T0 [long] = FETCH_OBJ_R THIS string("protected") + SEND_VAL #1.T0 [long] 2 + #2.T0 [double] = FETCH_OBJ_R THIS string("private") + SEND_VAL #2.T0 [double] 3 + DO_ICALL + RETURN null + +Test::inTestWithTest2: ; (lines=10, args=1, vars=1, tmps=1, ssa_vars=5, no_loops) + ; (before dfa pass) + ; %s + ; return [null] RANGE[0..0] + ; #0.CV0($test2) NOVAL [undef] +BB0: start exit lines=[0-9] + ; level=0 + #1.CV0($test2) [object (instanceof Test2)] = RECV 1 + INIT_FCALL 3 128 string("var_dump") + #2.T1 [bool] = FETCH_OBJ_R #1.CV0($test2) [object (instanceof Test2)] string("public") + SEND_VAL #2.T1 [bool] 1 + #3.T1 [long] = FETCH_OBJ_R #1.CV0($test2) [object (instanceof Test2)] string("protected") + SEND_VAL #3.T1 [long] 2 + #4.T1 [double] = FETCH_OBJ_R #1.CV0($test2) [object (instanceof Test2)] string("private") + SEND_VAL #4.T1 [double] 3 + DO_ICALL + RETURN null + +Test2::inTest2: ; (lines=9, args=0, vars=0, tmps=1, ssa_vars=3, no_loops) + ; (before dfa pass) + ; %s + ; return [null] RANGE[0..0] +BB0: start exit lines=[0-8] + ; level=0 + INIT_FCALL 3 128 string("var_dump") + #0.T0 [bool] = FETCH_OBJ_R THIS string("public") + SEND_VAL #0.T0 [bool] 1 + #1.T0 [long] = FETCH_OBJ_R THIS string("protected") + SEND_VAL #1.T0 [long] 2 + #2.T0 [array of [any, ref]] = FETCH_OBJ_R THIS string("private") + SEND_VAL #2.T0 [array of [any, ref]] 3 + DO_ICALL + RETURN null diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index d22cc7ffd7c..7b04d0d2df4 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -232,6 +232,14 @@ static void zend_hash_clone_prop_info(HashTable *ht) if (IN_ARENA(prop_info->ce)) { prop_info->ce = ARENA_REALLOC(prop_info->ce); } + + if (ZEND_TYPE_IS_CE(prop_info->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop_info->type); + if (IN_ARENA(ce)) { + ce = ARENA_REALLOC(ce); + prop_info->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop_info->type)); + } + } } } } @@ -304,6 +312,16 @@ static void zend_class_copy_ctor(zend_class_entry **pce) /* constants table */ zend_hash_clone_constants(&ce->constants_table); + if (ce->properties_info_table) { + int i; + ce->properties_info_table = ARENA_REALLOC(ce->properties_info_table); + for (i = 0; i < ce->default_properties_count; i++) { + if (IN_ARENA(ce->properties_info_table[i])) { + ce->properties_info_table[i] = ARENA_REALLOC(ce->properties_info_table[i]); + } + } + } + if (ce->num_interfaces) { zend_class_name *interface_names; diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 86cb8a2e259..92a77ab7929 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -577,6 +577,17 @@ static void zend_file_cache_serialize_prop_info(zval *zv, SERIALIZE_STR(prop->doc_comment); } } + if (prop->type) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *name = ZEND_TYPE_NAME(prop->type); + SERIALIZE_STR(name); + prop->type = ZEND_TYPE_ENCODE_CLASS(name, ZEND_TYPE_ALLOW_NULL(prop->type)); + } else if (ZEND_TYPE_IS_CE(prop->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop->type); + SERIALIZE_PTR(ce); + prop->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop->type)); + } + } } } @@ -660,6 +671,19 @@ static void zend_file_cache_serialize_class(zval *zv, SERIALIZE_STR(ce->info.user.doc_comment); zend_file_cache_serialize_hash(&ce->properties_info, script, info, buf, zend_file_cache_serialize_prop_info); + if (ce->properties_info_table) { + uint32_t i; + zend_property_info **table; + + SERIALIZE_PTR(ce->properties_info_table); + table = ce->properties_info_table; + UNSERIALIZE_PTR(table); + + for (i = 0; i < ce->default_properties_count; i++) { + SERIALIZE_PTR(table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; zend_class_name *interface_names; @@ -1246,6 +1270,17 @@ static void zend_file_cache_unserialize_prop_info(zval *zv, UNSERIALIZE_STR(prop->doc_comment); } } + if (prop->type) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *name = ZEND_TYPE_NAME(prop->type); + UNSERIALIZE_STR(name); + prop->type = ZEND_TYPE_ENCODE_CLASS(name, ZEND_TYPE_ALLOW_NULL(prop->type)); + } else if (ZEND_TYPE_IS_CE(prop->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop->type); + UNSERIALIZE_PTR(ce); + prop->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop->type)); + } + } } } @@ -1325,6 +1360,15 @@ static void zend_file_cache_unserialize_class(zval *zv, zend_file_cache_unserialize_hash(&ce->properties_info, script, buf, zend_file_cache_unserialize_prop_info, NULL); + if (ce->properties_info_table) { + uint32_t i; + UNSERIALIZE_PTR(ce->properties_info_table); + + for (i = 0; i < ce->default_properties_count; i++) { + UNSERIALIZE_PTR(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index eba9dd23e4d..af9244bbf58 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -746,6 +746,16 @@ static void zend_persist_property_info(zval *zv) prop->doc_comment = NULL; } } + + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); + zend_accel_store_interned_string(class_name); + prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); + } else if (ZEND_TYPE_IS_CE(prop->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop->type); + ce = zend_shared_alloc_get_xlat_entry(ce); + prop->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop->type)); + } } static void zend_persist_class_constant(zval *zv) @@ -786,6 +796,16 @@ static void zend_persist_class_constant(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -793,6 +813,7 @@ static void zend_persist_class_entry(zval *zv) if (ce->type == ZEND_USER_CLASS) { if ((ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) + && !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted) { ZCG(is_immutable_class) = 1; ce = Z_PTR_P(zv) = zend_shared_memdup_put(ce, sizeof(zend_class_entry)); @@ -855,6 +876,19 @@ static void zend_persist_class_entry(zval *zv) zend_hash_persist(&ce->properties_info, zend_persist_property_info); HT_FLAGS(&ce->properties_info) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS); + if (ce->properties_info_table) { + int i; + + size_t size = sizeof(zend_property_info *) * ce->default_properties_count; + memcpy(ZCG(arena_mem), ce->properties_info_table, size); + ce->properties_info_table = ZCG(arena_mem); + ZCG(arena_mem) = (void*)((char*)ZCG(arena_mem) + ZEND_ALIGNED_SIZE(size)); + + for (i = 0; i < ce->default_properties_count; i++) { + ce->properties_info_table[i] = zend_shared_alloc_get_xlat_entry(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_LINKED)) { uint32_t i = 0; diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 5fd48a224e9..a17d7c4627f 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -306,6 +306,11 @@ static void zend_persist_property_info_calc(zval *zv) zend_shared_alloc_register_xlat_entry(prop, prop); ADD_SIZE_EX(sizeof(zend_property_info)); ADD_INTERNED_STRING(prop->name); + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); + ADD_INTERNED_STRING(class_name); + prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); + } if (ZCG(accel_directives).save_comments && prop->doc_comment) { ADD_STRING(prop->doc_comment); } @@ -326,6 +331,16 @@ static void zend_persist_class_constant_calc(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry_calc(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -334,6 +349,7 @@ static void zend_persist_class_entry_calc(zval *zv) ZCG(is_immutable_class) = (ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) && + !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted; ADD_SIZE_EX(sizeof(zend_class_entry)); @@ -371,6 +387,10 @@ static void zend_persist_class_entry_calc(zval *zv) zend_hash_persist_calc(&ce->properties_info, zend_persist_property_info_calc); + if (ce->properties_info_table) { + ADD_ARENA_SIZE(sizeof(zend_property_info *) * ce->default_properties_count); + } + if (ce->num_interfaces) { uint32_t i; diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index e97cd8fda60..115801a380c 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2101,7 +2101,7 @@ PHP_FUNCTION(openssl_x509_export) zend_bool notext = 1; BIO * bio_out; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|b", &zcert, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|b", &zcert, &zout, ¬ext) == FAILURE) { return; } RETVAL_FALSE; @@ -2123,9 +2123,8 @@ PHP_FUNCTION(openssl_x509_export) if (PEM_write_bio_X509(bio_out, cert)) { BUF_MEM *bio_buf; - zval_ptr_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -2925,7 +2924,7 @@ PHP_FUNCTION(openssl_pkcs12_export) zval * item; STACK_OF(X509) *ca = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/zs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzzs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) return; RETVAL_FALSE; @@ -2965,9 +2964,8 @@ PHP_FUNCTION(openssl_pkcs12_export) if (i2d_PKCS12_bio(bio_out, p12)) { BUF_MEM *bio_buf; - zval_ptr_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -3006,7 +3004,7 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_in = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/s", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szs", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) return; RETVAL_FALSE; @@ -3024,8 +3022,10 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_out; int cert_num; - zval_ptr_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto cleanup; + } if (cert) { bio_out = BIO_new(BIO_s_mem()); @@ -3380,7 +3380,7 @@ PHP_FUNCTION(openssl_csr_export) BIO * bio_out; zend_resource *csr_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|b", &zcsr, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|b", &zcsr, &zout, ¬ext) == FAILURE) { return; } @@ -3403,8 +3403,7 @@ PHP_FUNCTION(openssl_csr_export) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); - zval_ptr_dtor(zout); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -3573,7 +3572,7 @@ PHP_FUNCTION(openssl_csr_new) int we_made_the_key = 1; zend_resource *key_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "az/|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "az|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { return; } RETVAL_FALSE; @@ -3581,9 +3580,12 @@ PHP_FUNCTION(openssl_csr_new) PHP_SSL_REQ_INIT(&req); if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) { + zval *out_pkey_val = out_pkey; + ZVAL_DEREF(out_pkey_val); + /* Generate or use a private key */ - if (Z_TYPE_P(out_pkey) != IS_NULL) { - req.priv_key = php_openssl_evp_from_zval(out_pkey, 0, NULL, 0, 0, &key_resource); + if (Z_TYPE_P(out_pkey_val) != IS_NULL) { + req.priv_key = php_openssl_evp_from_zval(out_pkey_val, 0, NULL, 0, 0, &key_resource); if (req.priv_key != NULL) { we_made_the_key = 0; } @@ -3621,8 +3623,7 @@ PHP_FUNCTION(openssl_csr_new) if (we_made_the_key) { /* and a resource for the private key */ - zval_ptr_dtor(out_pkey); - ZVAL_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); + ZEND_TRY_ASSIGN_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ } else if (key_resource != NULL) { req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ @@ -4633,7 +4634,7 @@ PHP_FUNCTION(openssl_pkey_export) BIO * bio_out = NULL; const EVP_CIPHER * cipher; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { return; } RETVAL_FALSE; @@ -4685,8 +4686,7 @@ PHP_FUNCTION(openssl_pkey_export) RETVAL_TRUE; bio_mem_len = BIO_get_mem_data(bio_out, &bio_mem_ptr); - zval_ptr_dtor(out); - ZVAL_STRINGL(out, bio_mem_ptr, bio_mem_len); + ZEND_TRY_ASSIGN_STRINGL(out, bio_mem_ptr, bio_mem_len); } else { php_openssl_store_errors(); } @@ -5389,7 +5389,7 @@ PHP_FUNCTION(openssl_pkcs7_read) PKCS7 * p7 = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/", &p7b, &p7b_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &p7b, &p7b_len, &zout) == FAILURE) { return; } @@ -5431,8 +5431,10 @@ PHP_FUNCTION(openssl_pkcs7_read) break; } - zval_ptr_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto clean_exit; + } if (certs != NULL) { for (i = 0; i < sk_X509_num(certs); i++) { @@ -5686,7 +5688,7 @@ PHP_FUNCTION(openssl_private_encrypt) size_t data_len; zend_long padding = RSA_PKCS1_PADDING; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5717,9 +5719,8 @@ PHP_FUNCTION(openssl_private_encrypt) } if (successful) { - zval_ptr_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5749,7 +5750,7 @@ PHP_FUNCTION(openssl_private_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5786,9 +5787,8 @@ PHP_FUNCTION(openssl_private_decrypt) efree(crypttemp); if (successful) { - zval_ptr_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5818,7 +5818,7 @@ PHP_FUNCTION(openssl_public_encrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) return; RETVAL_FALSE; @@ -5848,9 +5848,8 @@ PHP_FUNCTION(openssl_public_encrypt) } if (successful) { - zval_ptr_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5880,7 +5879,7 @@ PHP_FUNCTION(openssl_public_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5919,9 +5918,8 @@ PHP_FUNCTION(openssl_public_decrypt) efree(crypttemp); if (successful) { - zval_ptr_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5982,7 +5980,7 @@ PHP_FUNCTION(openssl_sign) zend_long signature_algo = OPENSSL_ALGO_SHA1; const EVP_MD *mdtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|z", &data, &data_len, &signature, &key, &method) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|z", &data, &data_len, &signature, &key, &method) == FAILURE) { return; } pkey = php_openssl_evp_from_zval(key, 0, "", 0, 0, &keyresource); @@ -6015,10 +6013,9 @@ PHP_FUNCTION(openssl_sign) EVP_SignInit(md_ctx, mdtype) && EVP_SignUpdate(md_ctx, data, data_len) && EVP_SignFinal(md_ctx, (unsigned char*)ZSTR_VAL(sigbuf), &siglen, pkey)) { - zval_ptr_dtor(signature); ZSTR_VAL(sigbuf)[siglen] = '\0'; ZSTR_LEN(sigbuf) = siglen; - ZVAL_NEW_STR(signature, sigbuf); + ZEND_TRY_ASSIGN_NEW_STR(signature, sigbuf); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6110,7 +6107,7 @@ PHP_FUNCTION(openssl_seal) const EVP_CIPHER *cipher; EVP_CIPHER_CTX *ctx; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/a|sz/", &data, &data_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szza|sz", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len, &iv) == FAILURE) { return; } @@ -6184,12 +6181,15 @@ PHP_FUNCTION(openssl_seal) } if (len1 + len2 > 0) { - zval_ptr_dtor(sealdata); - ZVAL_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); - zval_ptr_dtor(ekeys); - array_init(ekeys); + ekeys = zend_try_array_init(ekeys); + if (!ekeys) { + EVP_CIPHER_CTX_free(ctx); + goto clean_exit; + } + for (i=0; i 0)) { - zval_ptr_dtor(opendata); buf[len1 + len2] = '\0'; - ZVAL_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6642,7 +6640,7 @@ PHP_FUNCTION(openssl_encrypt) zend_string *outbuf; zend_bool free_iv = 0, free_password = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lsz/sl", &data, &data_len, &method, &method_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lszsl", &data, &data_len, &method, &method_len, &password, &password_len, &options, &iv, &iv_len, &tag, &aad, &aad_len, &tag_len) == FAILURE) { return; } @@ -6689,10 +6687,9 @@ PHP_FUNCTION(openssl_encrypt) zend_string *tag_str = zend_string_alloc(tag_len, 0); if (EVP_CIPHER_CTX_ctrl(cipher_ctx, mode.aead_get_tag_flag, tag_len, ZSTR_VAL(tag_str)) == 1) { - zval_ptr_dtor(tag); ZSTR_VAL(tag_str)[tag_len] = '\0'; ZSTR_LEN(tag_str) = tag_len; - ZVAL_NEW_STR(tag, tag_str); + ZEND_TRY_ASSIGN_NEW_STR(tag, tag_str); } else { php_error_docref(NULL, E_WARNING, "Retrieving verification tag failed"); zend_string_release_ex(tag_str, 0); @@ -6700,8 +6697,7 @@ PHP_FUNCTION(openssl_encrypt) RETVAL_FALSE; } } else if (tag) { - zval_ptr_dtor(tag); - ZVAL_NULL(tag); + ZEND_TRY_ASSIGN_NULL(tag); php_error_docref(NULL, E_WARNING, "The authenticated tag cannot be provided for cipher that doesn not support AEAD"); } else if (mode.is_aead) { @@ -6848,13 +6844,12 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) zend_string *buffer = NULL; zval *zstrong_result_returned = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z/", &buffer_length, &zstrong_result_returned) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z", &buffer_length, &zstrong_result_returned) == FAILURE) { return; } if (zstrong_result_returned) { - zval_ptr_dtor(zstrong_result_returned); - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } if (buffer_length <= 0 @@ -6872,7 +6867,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (php_win32_get_random_bytes((unsigned char*)buffer->val, (size_t) buffer_length) == FAILURE){ zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } zend_throw_exception(zend_ce_exception, "Error reading from source device", 0); return; @@ -6885,7 +6880,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (RAND_bytes((unsigned char*)ZSTR_VAL(buffer), (int)buffer_length) <= 0) { zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } zend_throw_exception(zend_ce_exception, "Error reading from source device", 0); return; @@ -6898,7 +6893,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) RETVAL_NEW_STR(buffer); if (zstrong_result_returned) { - ZVAL_BOOL(zstrong_result_returned, 1); + ZEND_TRY_ASSIGN_TRUE(zstrong_result_returned); } } /* }}} */ diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index b243b220274..cf53edc7f69 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -663,7 +663,7 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/|lz/", &pid, &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lz", &pid, &z_status, &options, &z_rusage) == FAILURE) { return; } @@ -671,11 +671,9 @@ PHP_FUNCTION(pcntl_waitpid) #ifdef HAVE_WAIT4 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_ptr_dtor(z_rusage); - array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); + z_rusage = zend_try_array_init(z_rusage); + if (!z_rusage) { + return; } memset(&rusage, 0, sizeof(struct rusage)); @@ -697,8 +695,7 @@ PHP_FUNCTION(pcntl_waitpid) } #endif - zval_ptr_dtor(z_status); - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } @@ -716,18 +713,16 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/|lz/", &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lz", &z_status, &options, &z_rusage) == FAILURE) { return; } status = zval_get_long(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_ptr_dtor(z_rusage); - array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); + z_rusage = zend_try_array_init(z_rusage); + if (!z_rusage) { + return; } memset(&rusage, 0, sizeof(struct rusage)); @@ -750,8 +745,7 @@ PHP_FUNCTION(pcntl_wait) } #endif - zval_ptr_dtor(z_status); - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } @@ -1105,7 +1099,7 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|z/", &how, &user_set, &user_oldset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|z", &how, &user_set, &user_oldset) == FAILURE) { return; } @@ -1131,12 +1125,11 @@ PHP_FUNCTION(pcntl_sigprocmask) } if (user_oldset != NULL) { - if (Z_TYPE_P(user_oldset) != IS_ARRAY) { - zval_ptr_dtor(user_oldset); - array_init(user_oldset); - } else { - zend_hash_clean(Z_ARRVAL_P(user_oldset)); + user_oldset = zend_try_array_init(user_oldset); + if (!user_oldset) { + return; } + for (signo = 1; signo < NSIG; ++signo) { if (sigismember(&oldset, signo) != 1) { continue; @@ -1162,11 +1155,11 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|zll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/", &user_set, &user_siginfo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z", &user_set, &user_siginfo) == FAILURE) { return; } } @@ -1230,12 +1223,11 @@ PHP_FUNCTION(pcntl_sigtimedwait) static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_siginfo) /* {{{ */ { if (signo > 0 && user_siginfo) { - if (Z_TYPE_P(user_siginfo) != IS_ARRAY) { - zval_ptr_dtor(user_siginfo); - array_init(user_siginfo); - } else { - zend_hash_clean(Z_ARRVAL_P(user_siginfo)); + user_siginfo = zend_try_array_init(user_siginfo); + if (!user_siginfo) { + return; } + add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); add_assoc_long_ex(user_siginfo, "code", sizeof("code")-1, siginfo->si_code); diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 16ebedd7ac2..8622ea8c652 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -970,7 +970,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * Z_PARAM_STR(regex) Z_PARAM_STR(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(subpats) + Z_PARAM_ZVAL(subpats) Z_PARAM_LONG(flags) Z_PARAM_LONG(start_offset) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -1014,8 +1014,10 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, size_t sub /* Overwrite the passed-in value for subpatterns with an empty array. */ if (subpats != NULL) { - zval_ptr_dtor(subpats); - array_init(subpats); + subpats = zend_try_array_init(subpats); + if (!subpats) { + return; + } } subpats_order = global ? PREG_PATTERN_ORDER : 0; @@ -2239,7 +2241,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE_P(replace) != IS_ARRAY) { @@ -2305,8 +2307,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) } if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2336,7 +2337,7 @@ static PHP_FUNCTION(preg_replace_callback) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (!zend_is_callable_ex(replace, NULL, 0, NULL, &fcc, NULL)) { @@ -2353,8 +2354,7 @@ static PHP_FUNCTION(preg_replace_callback) replace_count = preg_replace_func_impl(return_value, regex, &fci, &fcc, subject, limit); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2376,7 +2376,7 @@ static PHP_FUNCTION(preg_replace_callback_array) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); fci.size = sizeof(fci); @@ -2421,8 +2421,7 @@ static PHP_FUNCTION(preg_replace_callback_array) } ZEND_HASH_FOREACH_END(); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 0b6fc902538..9355d3d3df8 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2176,7 +2176,7 @@ const zend_function_entry pdo_dbstmt_functions[] = { }; /* {{{ overloaded handlers for PDOStatement class */ -static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { pdo_stmt_t *stmt = Z_PDO_STMT_P(object); @@ -2184,8 +2184,9 @@ static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **ca if (strcmp(Z_STRVAL_P(member), "queryString") == 0) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "property queryString is read only"); + return value; } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } @@ -2499,9 +2500,10 @@ static zval *row_dim_read(zval *object, zval *member, int type, zval *rv) return row_prop_read(object, member, type, NULL, rv); } -static void row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { php_error_docref(NULL, E_WARNING, "This PDORow is not from a writable result set"); + return value; } static void row_dim_write(zval *object, zval *member, zval *value) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 105a87da8b3..323a4d2fa41 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2855,8 +2855,10 @@ ZEND_METHOD(reflection_type, isBuiltin) /* {{{ reflection_type_name */ static zend_string *reflection_type_name(type_reference *param) { - if (ZEND_TYPE_IS_CLASS(param->type)) { + if (ZEND_TYPE_IS_NAME(param->type)) { return zend_string_copy(ZEND_TYPE_NAME(param->type)); + } else if (ZEND_TYPE_IS_CE(param->type)) { + return zend_string_copy(ZEND_TYPE_CE(param->type)->name); } else { char *name = zend_get_type_by_const(ZEND_TYPE_CODE(param->type)); return zend_string_init(name, strlen(name), 0); @@ -3809,7 +3811,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, 1); + prop = zend_std_get_static_property(ce, name, BP_VAR_IS); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3830,6 +3832,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; + zend_property_info *prop_info; zend_string *name; zval *variable_ptr, *value; @@ -3842,15 +3845,30 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, 1); + variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); if (!variable_ptr) { + zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; } - ZVAL_DEREF(variable_ptr); + + if (Z_ISREF_P(variable_ptr)) { + zend_reference *ref = Z_REF_P(variable_ptr); + variable_ptr = Z_REFVAL_P(variable_ptr); + + if (!zend_verify_ref_assignable_zval(ref, value, 0)) { + return; + } + } + + if (prop_info->type && !zend_verify_property_type(prop_info, value, 0)) { + return; + } + zval_ptr_dtor(variable_ptr); ZVAL_COPY(variable_ptr, value); + } /* }}} */ @@ -5463,6 +5481,55 @@ ZEND_METHOD(reflection_property, setValue) } /* }}} */ +/* {{{ proto public mixed ReflectionProperty::isInitialized([stdclass object]) + Returns this property's value */ +ZEND_METHOD(reflection_property, isInitialized) +{ + reflection_object *intern; + property_reference *ref; + zval *object, *name; + zval *member_p = NULL; + + GET_REFLECTION_OBJECT_PTR(ref); + + if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) { + name = _default_load_name(getThis()); + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Cannot access non-public member %s::$%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name)); + return; + } + + if (ref->prop.flags & ZEND_ACC_STATIC) { + member_p = zend_read_static_property_ex(intern->ce, ref->unmangled_name, 1); + if (member_p) { + RETURN_BOOL(!Z_ISUNDEF_P(member_p)) + } + RETURN_FALSE; + } else { + zval name_zv; + zend_class_entry *old_scope; + int retval; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &object) == FAILURE) { + return; + } + + if (!instanceof_function(Z_OBJCE_P(object), ref->prop.ce)) { + _DO_THROW("Given object is not an instance of the class this property was declared in"); + /* Returns from this function */ + } + + old_scope = EG(fake_scope); + EG(fake_scope) = intern->ce; + ZVAL_STR(&name_zv, ref->unmangled_name); + retval = Z_OBJ_HT_P(object)->has_property(object, &name_zv, ZEND_PROPERTY_EXISTS, NULL); + EG(fake_scope) = old_scope; + + RETVAL_BOOL(retval); + } +} +/* }}} */ + /* {{{ proto public ReflectionClass ReflectionProperty::getDeclaringClass() Get the declaring class */ ZEND_METHOD(reflection_property, getDeclaringClass) @@ -5530,6 +5597,44 @@ ZEND_METHOD(reflection_property, setAccessible) } /* }}} */ +/* {{{ proto public ReflectionType ReflectionProperty::getType() + Returns the type associated with the property */ +ZEND_METHOD(reflection_property, getType) +{ + reflection_object *intern; + property_reference *ref; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + GET_REFLECTION_OBJECT_PTR(ref); + + if (!ZEND_TYPE_IS_SET(ref->prop.type)) { + RETURN_NULL(); + } + + reflection_type_factory(ref->prop.type, return_value); +} +/* }}} */ + +/* {{{ proto public bool ReflectionProperty::hasType() + Returns whether property has a type */ +ZEND_METHOD(reflection_property, hasType) +{ + reflection_object *intern; + property_reference *ref; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + GET_REFLECTION_OBJECT_PTR(ref); + + RETVAL_BOOL(ZEND_TYPE_IS_SET(ref->prop.type)); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionExtension::export(string name [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_extension, export) @@ -6367,6 +6472,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_setValue, 0, 0, 1) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_isInitialized, 0, 0, 0) + ZEND_ARG_INFO(0, object) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setAccessible, 0) ZEND_ARG_INFO(0, visible) ZEND_END_ARG_INFO() @@ -6378,6 +6487,7 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getName, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getValue, arginfo_reflection_property_getValue, 0) ZEND_ME(reflection_property, setValue, arginfo_reflection_property_setValue, 0) + ZEND_ME(reflection_property, isInitialized, arginfo_reflection_property_isInitialized, 0) ZEND_ME(reflection_property, isPublic, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isPrivate, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isProtected, arginfo_reflection__void, 0) @@ -6387,6 +6497,8 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getDeclaringClass, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getDocComment, arginfo_reflection__void, 0) ZEND_ME(reflection_property, setAccessible, arginfo_reflection_property_setAccessible, 0) + ZEND_ME(reflection_property, getType, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, hasType, arginfo_reflection__void, 0) PHP_FE_END }; @@ -6516,7 +6628,7 @@ static const zend_function_entry reflection_ext_functions[] = { /* {{{ */ }; /* }}} */ /* {{{ _reflection_write_property */ -static void _reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *_reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) { if ((Z_TYPE_P(member) == IS_STRING) && zend_hash_exists(&Z_OBJCE_P(object)->properties_info, Z_STR_P(member)) @@ -6525,10 +6637,11 @@ static void _reflection_write_property(zval *object, zval *member, zval *value, { zend_throw_exception_ex(reflection_exception_ptr, 0, "Cannot set read-only property %s::$%s", ZSTR_VAL(Z_OBJCE_P(object)->name), Z_STRVAL_P(member)); + return &EG(uninitialized_zval); } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } /* }}} */ diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt index 14e8382e410..fb472681ca4 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt @@ -1,5 +1,5 @@ --TEST-- -ReflectionClass::getStaticPropertyValue() - bad params +ReflectionClass::setStaticPropertyValue() - bad params --CREDITS-- Robin Fernandes Steve Seear diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt new file mode 100644 index 00000000000..a83900a1231 --- /dev/null +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt @@ -0,0 +1,39 @@ +--TEST-- +ReflectionClass::setStaticPropertyValue() - type constraints must be enforced +--FILE-- +setStaticPropertyValue("y", "foo"); +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("y", "21"); +var_dump(Test::$y); + + +Test::$x =& Test::$y; + +try { + $rc->setStaticPropertyValue("x", "foo"); +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("x", "42"); +var_dump(Test::$y); + +?> +--EXPECT-- +Typed property Test::$y must be int, string used +int(2) +int(21) +Cannot assign string to reference held by property Test::$y of type int +int(21) +int(42) diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt new file mode 100644 index 00000000000..f1f6e53ebd5 --- /dev/null +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -0,0 +1,113 @@ +--TEST-- +Test ReflectionProperty::isInitialized() +--FILE-- +isInitialized()); +var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); +var_dump((new ReflectionProperty(A::class, 's'))->isInitialized()); + +echo "Declared properties:\n"; +$a = new A; +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); + +echo "Declared properties after unset:\n"; +unset($a->iv); +unset($a->i); +unset($a->n); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); + +echo "Dynamic properties:\n"; +$a->d = null; +$rp = new ReflectionProperty($a, 'd'); +var_dump($rp->isInitialized($a)); +unset($a->d); +var_dump($rp->isInitialized($a)); + +echo "Visibility handling:\n"; +$rp = new ReflectionProperty('A', 'p'); +try { + var_dump($rp->isInitialized($a)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} +$rp->setAccessible(true); +var_dump($rp->isInitialized($a)); + +echo "Object type:\n"; +$rp = new ReflectionProperty('B', 'i'); +var_dump($rp->isInitialized($a)); + +try { + var_dump($rp->isInitialized(new stdClass)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} + +class WithMagic { + public $prop; + public int $intProp; + + public function __isset($name) { + echo "__isset($name)\n"; + return true; + } + + public function __get($name) { + echo "__get($name)\n"; + return "foobar"; + } +} + +echo "Class with __isset:\n"; +$obj = new WithMagic; +unset($obj->prop); +$rp = new ReflectionProperty('WithMagic', 'prop'); +var_dump($rp->isInitialized($obj)); +$rp = new ReflectionProperty('WithMagic', 'intProp'); +var_dump($rp->isInitialized($obj)); + +?> +--EXPECT-- +Static properties: +bool(true) +bool(false) +bool(true) +Declared properties: +bool(true) +bool(false) +bool(true) +Declared properties after unset: +bool(false) +bool(false) +bool(false) +Dynamic properties: +bool(true) +bool(false) +Visibility handling: +Cannot access non-public member A::$p +bool(false) +Object type: +bool(false) +Given object is not an instance of the class this property was declared in +Class with __isset: +bool(false) +bool(false) diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt new file mode 100644 index 00000000000..77f95d77ef0 --- /dev/null +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -0,0 +1,51 @@ +--TEST-- +ReflectionProperty::getValue() on typed static property +--FILE-- +getValue()); + +$rp = new ReflectionProperty('Test', 'y'); +try { + var_dump($rp->getValue()); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +$rp->setValue("24"); +var_dump($rp->getValue()); + +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + +Test::$z =& Test::$y; + +$rp = new ReflectionProperty('Test', 'z'); +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + + +?> +--EXPECT-- +int(42) +Typed static property Test::$y must not be accessed before initialization +int(24) +Typed property Test::$y must be int, string used +int(24) +Cannot assign string to reference held by property Test::$y of type int +int(24) diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index d949e18107e..e47a9615ba5 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -74,6 +74,32 @@ foreach ([ } } +echo "\n*** property types\n"; + +class PropTypeTest { + public int $int; + public string $string; + public array $arr; + public iterable $iterable; + public stdClass $std; + public OtherThing $other; + public $mixed; +} + +$reflector = new ReflectionClass(PropTypeTest::class); + +foreach ($reflector->getProperties() as $name => $property) { + if ($property->hasType()) { + printf("public %s $%s;\n", + $property->getType(), $property->getName()); + } else printf("public $%s;\n", $property->getName()); +} + +echo "*** resolved property types\n"; +$obj = new PropTypeTest; +$obj->std = new stdClass; +$r = (new ReflectionProperty($obj, 'std'))->getType(); +var_dump($r->getName()); ?> --EXPECT-- *** functions @@ -185,3 +211,14 @@ bool(true) bool(false) bool(false) string(4) "Test" + +*** property types +public int $int; +public string $string; +public array $arr; +public iterable $iterable; +public stdClass $std; +public OtherThing $other; +public $mixed; +*** resolved property types +string(8) "stdClass" diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 15618244ffb..49f2a8a7e64 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -415,7 +415,7 @@ static void change_node_zval(xmlNodePtr node, zval *value) /* {{{ sxe_property_write() */ -static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) +static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) { php_sxe_object *sxe; xmlNodePtr node; @@ -429,7 +429,6 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool int test = 0; int new_value = 0; zend_long cnt = 0; - int retval = SUCCESS; zval tmp_zv, zval_copy; zend_string *trim_str; @@ -442,7 +441,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } goto long_dim; } else { @@ -466,7 +465,7 @@ long_dim: if (member == &tmp_zv) { zval_ptr_dtor_str(&tmp_zv); } - return FAILURE; + return &EG(error_zval); } } } @@ -491,7 +490,7 @@ long_dim: * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } if (attribs && !node && sxe->iter.type == SXE_ITER_ELEMENT) { node = xmlNewChild(mynode, mynode->ns, sxe->iter.name, NULL); @@ -528,7 +527,7 @@ long_dim: zval_ptr_dtor_str(&tmp_zv); } zend_error(E_WARNING, "It is not yet possible to assign complex types to %s", attribs ? "attributes" : "properties"); - return FAILURE; + return &EG(error_zval); } } @@ -566,7 +565,7 @@ long_dim: if (new_value) { zval_ptr_dtor(value); } - return FAILURE; + return &EG(error_zval); } if (sxe->iter.type == SXE_ITER_NONE) { @@ -574,7 +573,7 @@ long_dim: ++counter; if (member && Z_LVAL_P(member) > 0) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only 0 such elements exist", mynode->name, Z_LVAL_P(member)); - retval = FAILURE; + value = &EG(error_zval); } } else if (member) { newnode = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, &cnt); @@ -611,7 +610,7 @@ next_iter: } } else if (counter > 1) { php_error_docref(NULL, E_WARNING, "Cannot assign to an array of nodes (duplicate subnodes or attr detected)"); - retval = FAILURE; + value = &EG(error_zval); } else if (elements) { if (!node) { if (!member || Z_TYPE_P(member) == IS_LONG) { @@ -622,14 +621,12 @@ next_iter: } else if (!member || Z_TYPE_P(member) == IS_LONG) { if (member && cnt < Z_LVAL_P(member)) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only " ZEND_LONG_FMT " such elements exist", mynode->name, Z_LVAL_P(member), cnt); - retval = FAILURE; } newnode = xmlNewTextChild(mynode->parent, mynode->ns, mynode->name, value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } } else if (attribs) { if (Z_TYPE_P(member) == IS_LONG) { php_error_docref(NULL, E_WARNING, "Cannot change attribute number " ZEND_LONG_FMT " when only %d attributes exist", Z_LVAL_P(member), nodendx); - retval = FAILURE; } else { newnode = (xmlNodePtr)xmlNewProp(node, (xmlChar *)Z_STRVAL_P(member), value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } @@ -645,15 +642,17 @@ next_iter: if (new_value) { zval_ptr_dtor(value); } - return retval; + return value; } /* }}} */ /* {{{ sxe_property_write() */ -static void sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) { - sxe_prop_dim_write(object, member, value, 1, 0, NULL); + zval *retval = sxe_prop_dim_write(object, member, value, 1, 0, NULL); + + return retval == &EG(error_zval) ? &EG(uninitialized_zval) : retval; } /* }}} */ @@ -682,7 +681,7 @@ static zval *sxe_property_get_adr(zval *object, zval *member, int fetch_type, vo if (node) { return NULL; } - if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) != SUCCESS) { + if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) == &EG(error_zval)) { return NULL; } type = SXE_ITER_NONE; diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 7ee8ce416a0..375d1556ad4 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -1949,7 +1949,7 @@ zval *php_snmp_read_property(zval *object, zval *member, int type, void **cache_ /* {{{ php_snmp_write_property(zval *object, zval *member, zval *value[, const zend_literal *key]) Generic object property writer */ -void php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; php_snmp_object *obj; @@ -1973,12 +1973,14 @@ void php_snmp_write_property(zval *object, zval *member, zval *value, void **cac } */ } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_ptr_dtor(member); } + + return value; } /* }}} */ diff --git a/ext/soap/soap.c b/ext/soap/soap.c index c661dbd7939..4888309d288 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2800,7 +2800,7 @@ static void verify_soap_headers_array(HashTable *ht) /* {{{ */ } /* }}} */ -/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array output_headers]]]) +/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array &output_headers]]]) Calls a SOAP function */ PHP_METHOD(SoapClient, __call) { @@ -2819,7 +2819,7 @@ PHP_METHOD(SoapClient, __call) zend_bool free_soap_headers = 0; zval *this_ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { return; } @@ -2891,14 +2891,18 @@ PHP_METHOD(SoapClient, __call) } ZEND_HASH_FOREACH_END(); } if (output_headers) { - zval_ptr_dtor(output_headers); - array_init(output_headers); + output_headers = zend_try_array_init(output_headers); + if (!output_headers) { + goto cleanup; + } } + do_soap_call(execute_data, this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers); + +cleanup: if (arg_count > 0) { efree(real_args); } - if (soap_headers && free_soap_headers) { zend_hash_destroy(soap_headers); efree(soap_headers); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 1f3a4cd4c7e..f80075d3d5e 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1313,7 +1313,7 @@ PHP_FUNCTION(socket_getsockname) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &addr, &port) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &addr, &port) == FAILURE) { return; } @@ -1337,12 +1337,10 @@ PHP_FUNCTION(socket_getsockname) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_ptr_dtor(addr); - ZVAL_STRING(addr, addr6); + ZEND_TRY_ASSIGN_STRING(addr, addr6); if (port != NULL) { - zval_ptr_dtor(port); - ZVAL_LONG(port, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin6->sin6_port)); } RETURN_TRUE; break; @@ -1354,12 +1352,10 @@ PHP_FUNCTION(socket_getsockname) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_ptr_dtor(addr); - ZVAL_STRING(addr, addr_string); + ZEND_TRY_ASSIGN_STRING(addr, addr_string); if (port != NULL) { - zval_ptr_dtor(port); - ZVAL_LONG(port, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin->sin_port)); } RETURN_TRUE; break; @@ -1367,8 +1363,7 @@ PHP_FUNCTION(socket_getsockname) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_ptr_dtor(addr); - ZVAL_STRING(addr, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(addr, s_un->sun_path); RETURN_TRUE; break; @@ -1396,7 +1391,7 @@ PHP_FUNCTION(socket_getpeername) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &arg2, &arg3) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &arg2, &arg3) == FAILURE) { return; } @@ -1416,12 +1411,11 @@ PHP_FUNCTION(socket_getpeername) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_ptr_dtor(arg2); - ZVAL_STRING(arg2, addr6); + + ZEND_TRY_ASSIGN_STRING(arg2, addr6); if (arg3 != NULL) { - zval_ptr_dtor(arg3); - ZVAL_LONG(arg3, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin6->sin6_port)); } RETURN_TRUE; @@ -1434,12 +1428,10 @@ PHP_FUNCTION(socket_getpeername) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_ptr_dtor(arg2); - ZVAL_STRING(arg2, addr_string); + ZEND_TRY_ASSIGN_STRING(arg2, addr_string); if (arg3 != NULL) { - zval_ptr_dtor(arg3); - ZVAL_LONG(arg3, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin->sin_port)); } RETURN_TRUE; @@ -1448,8 +1440,7 @@ PHP_FUNCTION(socket_getpeername) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_ptr_dtor(arg2); - ZVAL_STRING(arg2, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(arg2, s_un->sun_path); RETURN_TRUE; break; @@ -1703,7 +1694,7 @@ PHP_FUNCTION(socket_recv) int retval; zend_long len, flags; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/ll", &php_sock_res, &buf, &len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzll", &php_sock_res, &buf, &len, &flags) == FAILURE) { return; } @@ -1720,16 +1711,11 @@ PHP_FUNCTION(socket_recv) if ((retval = recv(php_sock->bsd_socket, ZSTR_VAL(recv_buf), len, flags)) < 1) { zend_string_efree(recv_buf); - - zval_ptr_dtor(buf); - ZVAL_NULL(buf); + ZEND_TRY_ASSIGN_NULL(buf); } else { ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - - /* Rebuild buffer zval */ - zval_ptr_dtor(buf); - ZVAL_NEW_STR(buf, recv_buf); + ZEND_TRY_ASSIGN_NEW_STR(buf, recv_buf); } if (retval == -1) { @@ -1793,7 +1779,7 @@ PHP_FUNCTION(socket_recvfrom) char *address; zend_string *recv_buf; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/llz/|z/", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzllz|z", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { return; } @@ -1824,11 +1810,8 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, s_un.sun_path); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, s_un.sun_path); break; case AF_INET: @@ -1851,15 +1834,11 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - address = inet_ntoa(sin.sin_addr); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, address ? address : "0.0.0.0"); - ZVAL_LONG(arg6, ntohs(sin.sin_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, address ? address : "0.0.0.0"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin.sin_port)); break; #if HAVE_IPV6 case AF_INET6: @@ -1882,16 +1861,12 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - memset(addr6, 0, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &sin6.sin6_addr, addr6, INET6_ADDRSTRLEN); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, addr6[0] ? addr6 : "::"); - ZVAL_LONG(arg6, ntohs(sin6.sin6_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, addr6[0] ? addr6 : "::"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin6.sin6_port)); break; #endif default: @@ -2253,7 +2228,7 @@ PHP_FUNCTION(socket_create_pair) PHP_SOCKET fds_array[2]; zend_long domain, type, protocol; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz/", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { return; } @@ -2282,8 +2257,12 @@ PHP_FUNCTION(socket_create_pair) RETURN_FALSE; } - zval_ptr_dtor(fds_array_zval); - array_init(fds_array_zval); + fds_array_zval = zend_try_array_init(fds_array_zval); + if (!fds_array_zval) { + efree(php_sock[0]); + efree(php_sock[1]); + return; + } php_sock[0]->bsd_socket = fds_array[0]; php_sock[1]->bsd_socket = fds_array[1]; diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 91dec7c09ec..748263984ab 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -878,16 +878,16 @@ static zval *spl_array_read_property(zval *object, zval *member, int type, void return zend_std_read_property(object, member, type, cache_slot, rv); } /* }}} */ -static void spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { spl_array_object *intern = Z_SPLARRAY_P(object); if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0 && !zend_std_has_property(object, member, ZEND_PROPERTY_EXISTS, NULL)) { spl_array_write_dimension(object, member, value); - return; + return value; } - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } /* }}} */ static zval *spl_array_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ diff --git a/ext/spl/tests/iterator_035.phpt b/ext/spl/tests/iterator_035.phpt index e6d68fbea67..06886354503 100644 --- a/ext/spl/tests/iterator_035.phpt +++ b/ext/spl/tests/iterator_035.phpt @@ -14,7 +14,7 @@ echo "Done\n"; --EXPECTF-- Notice: Indirect modification of overloaded element of ArrayIterator has no effect in %s on line %d -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/ext/standard/array.c b/ext/standard/array.c index 33ea028602e..8088c0da8af 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1786,9 +1786,11 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table zend_throw_error(NULL, "Cannot re-assign $this"); return -1; } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY_DEREF(orig_var, entry); + ZVAL_DEREF(entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + return -1; + } count++; } } ZEND_HASH_FOREACH_END(); @@ -1869,9 +1871,11 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table if (zend_string_equals_literal(var_name, "GLOBALS")) { continue; } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY_DEREF(orig_var, entry); + ZVAL_DEREF(entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + return -1; + } } else { ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); @@ -1971,9 +1975,11 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2097,9 +2103,11 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2202,9 +2210,11 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2309,9 +2319,11 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0); + if (UNEXPECTED(EG(exception))) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 9026cacc796..38949a60800 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4376,13 +4376,12 @@ PHP_FUNCTION(getopt) Z_PARAM_STRING(options, options_len) Z_PARAM_OPTIONAL Z_PARAM_ARRAY(p_longopts) - Z_PARAM_ZVAL_DEREF(zoptind) + Z_PARAM_ZVAL(zoptind) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); /* Init zoptind to 1 */ if (zoptind) { - zval_ptr_dtor(zoptind); - ZVAL_LONG(zoptind, 1); + ZEND_TRY_ASSIGN_LONG(zoptind, 1); } /* Get argv from the global symbol table. We calculate argc ourselves @@ -4530,7 +4529,7 @@ PHP_FUNCTION(getopt) /* Set zoptind to php_optind */ if (zoptind) { - ZVAL_LONG(zoptind, php_optind); + ZEND_TRY_ASSIGN_LONG(zoptind, php_optind); } free_longopts(orig_opts); diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 50f81153a5b..15005dce0ef 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -816,18 +816,22 @@ PHP_FUNCTION(dns_get_record) Z_PARAM_STRING(hostname, hostname_len) Z_PARAM_OPTIONAL Z_PARAM_LONG(type_param) - Z_PARAM_ZVAL_DEREF_EX(authns, 1, 0) - Z_PARAM_ZVAL_DEREF_EX(addtl, 1, 0) + Z_PARAM_ZVAL(authns) + Z_PARAM_ZVAL(addtl) Z_PARAM_BOOL(raw) ZEND_PARSE_PARAMETERS_END(); if (authns) { - zval_ptr_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_ptr_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { @@ -1049,17 +1053,21 @@ PHP_FUNCTION(dns_get_mx) ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STRING(hostname, hostname_len) - Z_PARAM_ZVAL_DEREF(mx_list) + Z_PARAM_ZVAL(mx_list) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(weight_list) + Z_PARAM_ZVAL(weight_list) ZEND_PARSE_PARAMETERS_END(); - zval_ptr_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + return; + } if (weight_list) { - zval_ptr_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + return; + } } #if defined(HAVE_DNS_SEARCH) diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index aa11a01f478..393b41d0e82 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -50,7 +50,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ DNS_STATUS status; /* Return value of DnsQuery_A() function */ PDNS_RECORD pResult, pRec; /* Pointer to DNS_RECORD structure */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|z/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } @@ -60,12 +60,16 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ RETURN_FALSE; } - zval_ptr_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + goto cleanup; + } if (weight_list) { - zval_ptr_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + goto cleanup; + } } for (pRec = pResult; pRec; pRec = pRec->pNext) { @@ -81,6 +85,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ } } +cleanup: /* Free memory allocated for DNS records. */ DnsRecordListFree(pResult, DnsFreeRecordListDeep); @@ -352,18 +357,22 @@ PHP_FUNCTION(dns_get_record) int type, type_to_fetch, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/!z/!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } if (authns) { - zval_ptr_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_ptr_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 5b885c554d8..bfad4173a74 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -216,9 +216,9 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ Z_PARAM_STRING(cmd, cmd_len) Z_PARAM_OPTIONAL if (!mode) { - Z_PARAM_ZVAL_DEREF(ret_array) + Z_PARAM_ZVAL(ret_array) } - Z_PARAM_ZVAL_DEREF(ret_code) + Z_PARAM_ZVAL(ret_code) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); if (!cmd_len) { @@ -233,18 +233,20 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ if (!ret_array) { ret = php_exec(mode, cmd, NULL, return_value); } else { - if (Z_TYPE_P(ret_array) != IS_ARRAY) { - zval_ptr_dtor(ret_array); - array_init(ret_array); - } else if (Z_REFCOUNT_P(ret_array) > 1) { - zval_ptr_dtor(ret_array); - ZVAL_ARR(ret_array, zend_array_dup(Z_ARR_P(ret_array))); + if (Z_TYPE_P(Z_REFVAL_P(ret_array)) == IS_ARRAY) { + ZVAL_DEREF(ret_array); + SEPARATE_ARRAY(ret_array); + } else { + ret_array = zend_try_array_init(ret_array); + if (!ret_array) { + return; + } } + ret = php_exec(2, cmd, ret_array, return_value); } if (ret_code) { - zval_ptr_dtor(ret_code); - ZVAL_LONG(ret_code, ret); + ZEND_TRY_ASSIGN_LONG(ret_code, ret); } } /* }}} */ diff --git a/ext/standard/file.c b/ext/standard/file.c index c962ba4824c..93b58e9a94d 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -343,7 +343,7 @@ PHP_FUNCTION(flock) Z_PARAM_RESOURCE(res) Z_PARAM_LONG(operation) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(wouldblock) + Z_PARAM_ZVAL(wouldblock) ZEND_PARSE_PARAMETERS_END(); PHP_STREAM_TO_ZVAL(stream, res); @@ -355,15 +355,14 @@ PHP_FUNCTION(flock) } if (wouldblock) { - zval_ptr_dtor(wouldblock); - ZVAL_LONG(wouldblock, 0); + ZEND_TRY_ASSIGN_LONG(wouldblock, 0); } /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */ act = flock_values[act - 1] | (operation & PHP_LOCK_NB ? LOCK_NB : 0); if (php_stream_lock(stream, act)) { if (operation && errno == EWOULDBLOCK && wouldblock) { - ZVAL_LONG(wouldblock, 1); + ZEND_TRY_ASSIGN_LONG(wouldblock, 1); } RETURN_FALSE; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 6fc7143cd6e..32e651d1e48 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -53,8 +53,8 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) Z_PARAM_STRING(host, host_len) Z_PARAM_OPTIONAL Z_PARAM_LONG(port) - Z_PARAM_ZVAL_DEREF(zerrno) - Z_PARAM_ZVAL_DEREF(zerrstr) + Z_PARAM_ZVAL(zerrno) + Z_PARAM_ZVAL(zerrstr) Z_PARAM_DOUBLE(timeout) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -79,15 +79,6 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif tv.tv_usec = conv % 1000000; - if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, 0); - } - if (zerrstr) { - zval_ptr_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); - } - stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err); @@ -102,22 +93,27 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } - if (zerrstr && errstr) { - /* no need to dup; we need to efree buf anyway */ - zval_ptr_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); - } else if (!zerrstr && errstr) { - zend_string_release_ex(errstr, 0); + if (errstr) { + if (zerrstr) { + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); + } + zend_string_release(errstr); } RETURN_FALSE; } + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); + } + if (zerrstr) { + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); + } + if (errstr) { zend_string_release_ex(errstr, 0); } diff --git a/ext/standard/head.c b/ext/standard/head.c index 302599f02ba..be2b2668f05 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -358,8 +358,8 @@ PHP_FUNCTION(headers_sent) ZEND_PARSE_PARAMETERS_START(0, 2) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(arg1) - Z_PARAM_ZVAL_DEREF(arg2) + Z_PARAM_ZVAL(arg1) + Z_PARAM_ZVAL(arg2) ZEND_PARSE_PARAMETERS_END(); if (SG(headers_sent)) { @@ -369,14 +369,12 @@ PHP_FUNCTION(headers_sent) switch(ZEND_NUM_ARGS()) { case 2: - zval_ptr_dtor(arg2); - ZVAL_LONG(arg2, line); + ZEND_TRY_ASSIGN_LONG(arg2, line); case 1: - zval_ptr_dtor(arg1); if (file) { - ZVAL_STRING(arg1, file); + ZEND_TRY_ASSIGN_STRING(arg1, file); } else { - ZVAL_EMPTY_STRING(arg1); + ZEND_TRY_ASSIGN_EMPTY_STRING(arg1); } break; } diff --git a/ext/standard/image.c b/ext/standard/image.c index d32d1499f34..cf9ba12be8f 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1493,12 +1493,14 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(input, input_len) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(info) + Z_PARAM_ZVAL(info) ZEND_PARSE_PARAMETERS_END(); if (argc == 2) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if (mode == FROM_PATH) { diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c index 943dafaa430..87a17ab7f60 100644 --- a/ext/standard/incomplete_class.c +++ b/ext/standard/incomplete_class.c @@ -60,9 +60,10 @@ static zval *incomplete_class_get_property(zval *object, zval *member, int type, } /* }}} */ -static void incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { incomplete_class_message(object, E_NOTICE); + return value; } /* }}} */ diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 612cdf0f88c..8347ea78645 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -447,7 +447,7 @@ PHP_FUNCTION(proc_open) ZEND_PARSE_PARAMETERS_START(3, 6) Z_PARAM_STRING(command, command_len) Z_PARAM_ARRAY(descriptorspec) - Z_PARAM_ZVAL_DEREF(pipes) + Z_PARAM_ZVAL(pipes) Z_PARAM_OPTIONAL Z_PARAM_STRING_EX(cwd, cwd_len, 1, 0) Z_PARAM_ARRAY_EX(environment, 1, 0) @@ -862,6 +862,11 @@ PHP_FUNCTION(proc_open) #endif /* we forked/spawned and this is the parent */ + pipes = zend_try_array_init(pipes); + if (!pipes) { + goto exit_fail; + } + proc = (struct php_process_handle*)pemalloc(sizeof(struct php_process_handle), is_persistent); proc->is_persistent = is_persistent; proc->command = command; @@ -873,9 +878,6 @@ PHP_FUNCTION(proc_open) #endif proc->env = env; - zval_ptr_dtor(pipes); - array_init(pipes); - #if PHP_CAN_DO_PTS if (dev_ptmx >= 0) { close(dev_ptmx); diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 37cce100ce4..6c7544004bf 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -739,9 +739,8 @@ literal: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, (zend_long)(string - baseString) ); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, (zend_long) (string - baseString)); } else { add_index_long(return_value, objIndex++, string - baseString); } @@ -858,9 +857,8 @@ literal: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -899,9 +897,8 @@ literal: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -1052,10 +1049,9 @@ addToInt: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - /* change passed value type to string */ - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRING(current, buf); + /* change passed value type to string */ + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRING(current, buf); } else { add_index_string(return_value, objIndex++, buf); } @@ -1063,9 +1059,8 @@ addToInt: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, value); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, value); } else { add_index_long(return_value, objIndex++, value); } @@ -1168,9 +1163,8 @@ addToFloat: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_DOUBLE(current, dvalue); + current = args + objIndex++; + ZEND_TRY_ASSIGN_DOUBLE(current, dvalue); } else { add_index_double(return_value, objIndex++, dvalue ); } diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 442091ad46c..8f67b8b3fcb 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -107,8 +107,8 @@ PHP_FUNCTION(stream_socket_client) ZEND_PARSE_PARAMETERS_START(1, 6) Z_PARAM_STR(host) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(zerrno) - Z_PARAM_ZVAL_DEREF(zerrstr) + Z_PARAM_ZVAL(zerrno) + Z_PARAM_ZVAL(zerrstr) Z_PARAM_DOUBLE(timeout) Z_PARAM_LONG(flags) Z_PARAM_RESOURCE(zcontext) @@ -129,13 +129,11 @@ PHP_FUNCTION(stream_socket_client) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_ptr_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(ZSTR_VAL(host), ZSTR_LEN(host), REPORT_ERRORS, @@ -156,14 +154,12 @@ PHP_FUNCTION(stream_socket_client) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_ptr_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release_ex(errstr, 0); } @@ -197,8 +193,8 @@ PHP_FUNCTION(stream_socket_server) ZEND_PARSE_PARAMETERS_START(1, 5) Z_PARAM_STRING(host, host_len) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(zerrno) - Z_PARAM_ZVAL_DEREF(zerrstr) + Z_PARAM_ZVAL(zerrno) + Z_PARAM_ZVAL(zerrstr) Z_PARAM_LONG(flags) Z_PARAM_RESOURCE(zcontext) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -209,13 +205,11 @@ PHP_FUNCTION(stream_socket_server) GC_ADDREF(context->res); } - if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_ptr_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(host, host_len, REPORT_ERRORS, @@ -226,14 +220,12 @@ PHP_FUNCTION(stream_socket_server) php_error_docref(NULL, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : ZSTR_VAL(errstr)); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_ptr_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_ptr_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release_ex(errstr, 0); } @@ -265,7 +257,7 @@ PHP_FUNCTION(stream_socket_accept) Z_PARAM_RESOURCE(zstream) Z_PARAM_OPTIONAL Z_PARAM_DOUBLE(timeout) - Z_PARAM_ZVAL_DEREF(zpeername) + Z_PARAM_ZVAL(zpeername) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); php_stream_from_zval(stream, zstream); @@ -279,10 +271,6 @@ PHP_FUNCTION(stream_socket_accept) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zpeername) { - zval_ptr_dtor(zpeername); - ZVAL_NULL(zpeername); - } if (0 == php_stream_xport_accept(stream, &clistream, zpeername ? &peername : NULL, @@ -291,7 +279,7 @@ PHP_FUNCTION(stream_socket_accept) ) && clistream) { if (peername) { - ZVAL_STR(zpeername, peername); + ZEND_TRY_ASSIGN_STR(zpeername, peername); } php_stream_to_zval(clistream, return_value); } else { @@ -387,14 +375,13 @@ PHP_FUNCTION(stream_socket_recvfrom) Z_PARAM_LONG(to_read) Z_PARAM_OPTIONAL Z_PARAM_LONG(flags) - Z_PARAM_ZVAL_DEREF(zremote) + Z_PARAM_ZVAL(zremote) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); php_stream_from_zval(stream, zstream); if (zremote) { - zval_ptr_dtor(zremote); - ZVAL_NULL(zremote); + ZEND_TRY_ASSIGN_NULL(zremote); } if (to_read <= 0) { @@ -410,7 +397,7 @@ PHP_FUNCTION(stream_socket_recvfrom) if (recvd >= 0) { if (zremote && remote_addr) { - ZVAL_STR(zremote, remote_addr); + ZEND_TRY_ASSIGN_STR(zremote, remote_addr); } ZSTR_VAL(read_buf)[recvd] = '\0'; ZSTR_LEN(read_buf) = recvd; diff --git a/ext/standard/string.c b/ext/standard/string.c index 26144eb166d..3839512eccc 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3655,16 +3655,12 @@ PHP_FUNCTION(similar_text) Z_PARAM_STR(t1) Z_PARAM_STR(t2) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(percent) + Z_PARAM_ZVAL(percent) ZEND_PARSE_PARAMETERS_END(); - if (ac > 2) { - convert_to_double_ex(percent); - } - if (ZSTR_LEN(t1) + ZSTR_LEN(t2) == 0) { if (ac > 2) { - Z_DVAL_P(percent) = 0; + ZEND_TRY_ASSIGN_DOUBLE(percent, 0); } RETURN_LONG(0); @@ -3673,7 +3669,7 @@ PHP_FUNCTION(similar_text) sim = php_similar_char(ZSTR_VAL(t1), ZSTR_LEN(t1), ZSTR_VAL(t2), ZSTR_LEN(t2)); if (ac > 2) { - Z_DVAL_P(percent) = sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2)); + ZEND_TRY_ASSIGN_DOUBLE(percent, sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2))); } RETURN_LONG(sim); @@ -4442,7 +4438,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit Z_PARAM_ZVAL(replace) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); /* Make sure we're dealing with strings and do the replacement. */ @@ -4479,8 +4475,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit count = php_str_replace_in_subject(search, replace, subject, return_value, case_sensitivity); } if (argc > 3) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, count); + ZEND_TRY_ASSIGN_LONG(zcount, count); } } /* }}} */ @@ -4906,7 +4901,7 @@ PHP_FUNCTION(parse_str) ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(arg, arglen) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(arrayArg) + Z_PARAM_ZVAL(arrayArg) ZEND_PARSE_PARAMETERS_END(); res = estrndup(arg, arglen); @@ -4928,9 +4923,11 @@ PHP_FUNCTION(parse_str) zend_throw_error(NULL, "Cannot re-assign $this"); } } else { - /* Clear out the array that was passed in. */ - zval_ptr_dtor(arrayArg); - array_init(arrayArg); + arrayArg = zend_try_array_init(arrayArg); + if (!arrayArg) { + return; + } + sapi_module.treat_data(PARSE_STRING, res, arrayArg); } } diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt new file mode 100644 index 00000000000..8b697d5ccb2 --- /dev/null +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -0,0 +1,23 @@ +--TEST-- +extract() into typed references must respect their type +--FILE-- +i; +$s =& $test->s; +try { + extract(['i' => 'foo', 's' => 42]); +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } +var_dump($test->i, $test->s); + +?> +--EXPECT-- +Cannot assign string to reference held by property Test::$i of type int +int(0) +string(0) "" diff --git a/ext/standard/tests/general_functions/settype_typed_property.phpt b/ext/standard/tests/general_functions/settype_typed_property.phpt new file mode 100644 index 00000000000..a206a4ba41b --- /dev/null +++ b/ext/standard/tests/general_functions/settype_typed_property.phpt @@ -0,0 +1,28 @@ +--TEST-- +Using settype() on a typed property +--FILE-- +x = 42; +settype($test->x, 'string'); +// Same as $test->x = (string) $test->x. +// Leaves value unchanged due to coercion +var_dump($test->x); + +try { + settype($test->x, 'array'); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->x); + +?> +--EXPECT-- +int(42) +Cannot assign array to reference held by property Test::$x of type int +int(42) diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt new file mode 100644 index 00000000000..9475e8a7833 --- /dev/null +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -0,0 +1,73 @@ +--TEST-- +unserialize with references to typed properties shall skip the references or fail +--FILE-- +getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"D":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +object(A)#1 (2) { + ["a"]=> + &int(1) + ["b"]=> + &int(1) +} +object(B)#1 (2) { + ["a"]=> + &int(1) + ["b"]=> + &int(1) +} +Typed property A::$a must be int, null used +Typed property B::$b must be int, null used +Typed property C::$b must be string, int used +Typed property C::$a must be int, string used +Reference with value of type int held by property D::$a of type int is not compatible with property D::$b of type float diff --git a/ext/standard/type.c b/ext/standard/type.c index 1a26e0eaa36..bc1233e35d0 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -45,40 +45,46 @@ PHP_FUNCTION(settype) { zval *var; char *type; - size_t type_len = 0; + size_t type_len; + zval tmp; ZEND_PARSE_PARAMETERS_START(2, 2) - Z_PARAM_ZVAL_DEREF(var) + Z_PARAM_ZVAL(var) Z_PARAM_STRING(type, type_len) ZEND_PARSE_PARAMETERS_END(); + ZVAL_COPY(&tmp, var); if (!strcasecmp(type, "integer")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "int")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "float")) { - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "double")) { /* deprecated */ - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "string")) { - convert_to_string(var); + convert_to_string(&tmp); } else if (!strcasecmp(type, "array")) { - convert_to_array(var); + convert_to_array(&tmp); } else if (!strcasecmp(type, "object")) { - convert_to_object(var); + convert_to_object(&tmp); } else if (!strcasecmp(type, "bool")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "boolean")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "null")) { - convert_to_null(var); + convert_to_null(&tmp); } else if (!strcasecmp(type, "resource")) { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Cannot convert to resource type"); RETURN_FALSE; } else { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Invalid type"); RETURN_FALSE; } + + zend_try_assign(var, &tmp); RETVAL_TRUE; } /* }}} */ @@ -357,7 +363,7 @@ PHP_FUNCTION(is_callable) Z_PARAM_ZVAL(var) Z_PARAM_OPTIONAL Z_PARAM_BOOL(syntax_only) - Z_PARAM_ZVAL_DEREF(callable_name) + Z_PARAM_ZVAL(callable_name) ZEND_PARSE_PARAMETERS_END(); if (syntax_only) { @@ -365,8 +371,7 @@ PHP_FUNCTION(is_callable) } if (ZEND_NUM_ARGS() > 2) { retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); - zval_ptr_dtor(callable_name); - ZVAL_STR(callable_name, name); + ZEND_TRY_ASSIGN_STR(callable_name, name); } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); } diff --git a/ext/standard/var.c b/ext/standard/var.c index 108bafca8bb..27ec44f9910 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -51,7 +51,7 @@ static void php_array_element_dump(zval *zv, zend_ulong index, zend_string *key, } /* }}} */ -static void php_object_property_dump(zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ +static void php_object_property_dump(zend_property_info *prop_info, zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ { const char *prop_name, *class_name; @@ -74,7 +74,18 @@ static void php_object_property_dump(zval *zv, zend_ulong index, zend_string *ke } ZEND_PUTS("]=>\n"); } - php_var_dump(zv, level + 2); + + if (Z_TYPE_P(zv) == IS_UNDEF) { + ZEND_ASSERT(prop_info->type); + php_printf("%*cuninitialized(%s%s)\n", + level + 1, ' ', + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop_info->type) ? + ZSTR_VAL(ZEND_TYPE_IS_CE(prop_info->type) ? ZEND_TYPE_CE(prop_info->type)->name : ZEND_TYPE_NAME(prop_info->type)) : + zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type))); + } else { + php_var_dump(zv, level + 2); + } } /* }}} */ @@ -154,8 +165,19 @@ again: zend_string *key; zval *val; - ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { - php_object_property_dump(val, num, key, level); + ZEND_HASH_FOREACH_KEY_VAL(myht, num, key, val) { + zend_property_info *prop_info = NULL; + + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + if (key) { + prop_info = zend_get_typed_property_info_for_slot(Z_OBJ_P(struc), val); + } + } + + if (!Z_ISUNDEF_P(val) || prop_info) { + php_object_property_dump(prop_info, val, num, key, level); + } } ZEND_HASH_FOREACH_END(); zend_release_properties(myht); } @@ -216,7 +238,7 @@ static void zval_array_element_dump(zval *zv, zend_ulong index, zend_string *key } /* }}} */ -static void zval_object_property_dump(zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ +static void zval_object_property_dump(zend_property_info *prop_info, zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ { const char *prop_name, *class_name; @@ -237,7 +259,17 @@ static void zval_object_property_dump(zval *zv, zend_ulong index, zend_string *k } ZEND_PUTS("]=>\n"); } - php_debug_zval_dump(zv, level + 2); + if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { + ZEND_ASSERT(prop_info->type); + php_printf("%*cuninitialized(%s%s)\n", + level + 1, ' ', + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop_info->type) ? + ZSTR_VAL(ZEND_TYPE_IS_CE(prop_info->type) ? ZEND_TYPE_CE(prop_info->type)->name : ZEND_TYPE_NAME(prop_info->type)) : + zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type))); + } else { + php_debug_zval_dump(zv, level + 2); + } } /* }}} */ @@ -313,8 +345,19 @@ again: php_printf("%sobject(%s)#%d (%d) refcount(%u){\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0, Z_REFCOUNT_P(struc)); zend_string_release_ex(class_name, 0); if (myht) { - ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) { - zval_object_property_dump(val, index, key, level); + ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, val) { + zend_property_info *prop_info = NULL; + + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + if (key) { + prop_info = zend_get_typed_property_info_for_slot(Z_OBJ_P(struc), val); + } + } + + if (!Z_ISUNDEF_P(val) || prop_info) { + zval_object_property_dump(prop_info, val, index, key, level); + } } ZEND_HASH_FOREACH_END(); GC_UNPROTECT_RECURSION(myht); zend_release_properties(myht); diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index d07d6577199..8dad71450e9 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -46,6 +46,7 @@ struct php_unserialize_data { var_dtor_entries *first_dtor; var_dtor_entries *last_dtor; HashTable *allowed_classes; + HashTable *ref_props; var_entries entries; }; @@ -57,6 +58,7 @@ PHPAPI php_unserialize_data_t php_var_unserialize_init() { d->last = &d->entries; d->first_dtor = d->last_dtor = NULL; d->allowed_classes = NULL; + d->ref_props = NULL; d->entries.used_slots = 0; d->entries.next = NULL; if (!BG(serialize_lock)) { @@ -239,6 +241,11 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) } zval_ptr_dtor_nogc(&wakeup_name); + + if ((*var_hashx)->ref_props) { + zend_hash_destroy((*var_hashx)->ref_props); + FREE_HASHTABLE((*var_hashx)->ref_props); + } } /* }}} */ @@ -395,11 +402,12 @@ static inline size_t parse_uiv(const unsigned char *p) static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key); -static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, int objprops) +static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_object *obj) { while (elements-- > 0) { zval key, *data, d, *old_data; zend_ulong idx; + zend_property_info *info = NULL; ZVAL_UNDEF(&key); @@ -411,7 +419,7 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab data = NULL; ZVAL_UNDEF(&d); - if (!objprops) { + if (!obj) { if (Z_TYPE(key) == IS_LONG) { idx = Z_LVAL(key); numeric_key: @@ -440,8 +448,7 @@ numeric_key: } else { if (EXPECTED(Z_TYPE(key) == IS_STRING)) { string_key: - if (Z_TYPE_P(rval) == IS_OBJECT - && zend_hash_num_elements(&Z_OBJCE_P(rval)->properties_info) > 0) { + if (obj && zend_hash_num_elements(&obj->ce->properties_info) > 0) { zend_property_info *existing_propinfo; zend_string *new_key; const char *unmangled_class = NULL; @@ -456,8 +463,8 @@ string_key: unmangled = zend_string_init(unmangled_prop, unmangled_prop_len, 0); - existing_propinfo = zend_hash_find_ptr(&Z_OBJCE_P(rval)->properties_info, unmangled); - if ((unmangled_class == NULL || !strcmp(unmangled_class, "*") || !strcasecmp(unmangled_class, ZSTR_VAL(Z_OBJCE_P(rval)->name))) + existing_propinfo = zend_hash_find_ptr(&obj->ce->properties_info, unmangled); + if ((unmangled_class == NULL || !strcmp(unmangled_class, "*") || !strcasecmp(unmangled_class, ZSTR_VAL(obj->ce->name))) && (existing_propinfo != NULL) && (existing_propinfo->flags & ZEND_ACC_PPP_MASK)) { if (existing_propinfo->flags & ZEND_ACC_PROTECTED) { @@ -491,9 +498,24 @@ string_key: if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) { if (Z_TYPE_P(old_data) == IS_INDIRECT) { old_data = Z_INDIRECT_P(old_data); + info = zend_get_typed_property_info_for_slot(obj, old_data); + var_push_dtor(var_hash, old_data); + data = zend_hash_update_ind(ht, Z_STR(key), &d); + + if (UNEXPECTED(info)) { + /* Remember to which property this slot belongs, so we can add a + * type source if it is turned into a reference lateron. */ + if (!(*var_hash)->ref_props) { + (*var_hash)->ref_props = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->ref_props, 8, NULL, NULL, 0); + } + zend_hash_index_update_ptr( + (*var_hash)->ref_props, (zend_uintptr_t) data, info); + } + } else { + var_push_dtor(var_hash, old_data); + data = zend_hash_update_ind(ht, Z_STR(key), &d); } - var_push_dtor(var_hash, old_data); - data = zend_hash_update_ind(ht, Z_STR(key), &d); } else { data = zend_hash_add_new(ht, Z_STR(key), &d); } @@ -512,6 +534,18 @@ string_key: return 0; } + if (UNEXPECTED(info)) { + if (!zend_verify_prop_assignable_by_ref(info, data, /* strict */ 1)) { + zval_ptr_dtor(data); + ZVAL_UNDEF(data); + zval_dtor(&key); + return 0; + } + if (Z_ISREF_P(data)) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info); + } + } + if (BG(unserialize).level > 1) { var_push_dtor(var_hash, data); } @@ -613,7 +647,7 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) } zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, HT_FLAGS(ht) & HASH_FLAG_PACKED); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { + if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJ_P(rval))) { if (has_wakeup) { ZVAL_DEREF(rval); GC_ADD_FLAGS(Z_OBJ_P(rval), IS_OBJ_DESTRUCTOR_CALLED); @@ -697,13 +731,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 0; } - if (Z_ISREF_P(rval_ref)) { - ZVAL_COPY(rval, rval_ref); - } else { + if (!Z_ISREF_P(rval_ref)) { + zend_property_info *info = NULL; + if ((*var_hash)->ref_props) { + info = zend_hash_index_find_ptr((*var_hash)->ref_props, (zend_uintptr_t) rval_ref); + } ZVAL_NEW_REF(rval_ref, rval_ref); - ZVAL_COPY(rval, rval_ref); + if (info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(rval_ref), info); + } } + ZVAL_COPY(rval, rval_ref); + return 1; } @@ -901,7 +941,7 @@ use_double: * prohibit "r:" references to non-objects, as we only generate them for objects. */ HT_ALLOW_COW_VIOLATION(Z_ARRVAL_P(rval)); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) { + if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, NULL)) { return 0; } diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index a00b73ee8a4..0f7726f334b 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -318,7 +318,7 @@ PHP_FUNCTION(msg_remove_queue) } /* }}} */ -/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]]) +/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed &message [, bool unserialize=true [, int flags=0 [, int &errorcode]]]) Send a message of type msgtype (must be > 0) to a message queue */ PHP_FUNCTION(msg_receive) { @@ -332,7 +332,7 @@ PHP_FUNCTION(msg_receive) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/lz/|blz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlzlz|blz", &queue, &desiredmsgtype, &out_msgtype, &maxsize, &out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) { return; @@ -368,19 +368,12 @@ PHP_FUNCTION(msg_receive) result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags); - zval_ptr_dtor(out_msgtype); - zval_ptr_dtor(out_message); - ZVAL_LONG(out_msgtype, 0); - ZVAL_FALSE(out_message); - - if (zerrcode) { - zval_ptr_dtor(zerrcode); - ZVAL_LONG(zerrcode, 0); - } - if (result >= 0) { /* got it! */ - ZVAL_LONG(out_msgtype, messagebuffer->mtype); + ZEND_TRY_ASSIGN_LONG(out_msgtype, messagebuffer->mtype); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, 0); + } RETVAL_TRUE; if (do_unserialize) { @@ -391,16 +384,21 @@ PHP_FUNCTION(msg_receive) PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(&tmp, &p, p + result, &var_hash)) { php_error_docref(NULL, E_WARNING, "message corrupted"); + ZEND_TRY_ASSIGN_FALSE(out_message); RETVAL_FALSE; } else { - ZVAL_COPY_VALUE(out_message, &tmp); + ZEND_TRY_ASSIGN_VALUE(out_message, &tmp); } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } else { - ZVAL_STRINGL(out_message, messagebuffer->mtext, result); + ZEND_TRY_ASSIGN_STRINGL(out_message, messagebuffer->mtext, result); + } + } else { + ZEND_TRY_ASSIGN_LONG(out_msgtype, 0); + ZEND_TRY_ASSIGN_FALSE(out_message); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, errno); } - } else if (zerrcode) { - ZVAL_LONG(zerrcode, errno); } efree(messagebuffer); } @@ -420,7 +418,7 @@ PHP_FUNCTION(msg_send) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz", &queue, &msgtype, &message, &do_serialize, &blocking, &zerror) == FAILURE) { return; } @@ -486,8 +484,7 @@ PHP_FUNCTION(msg_send) if (result == -1) { php_error_docref(NULL, E_WARNING, "msgsnd failed: %s", strerror(errno)); if (zerror) { - zval_ptr_dtor(zerror); - ZVAL_LONG(zerror, errno); + ZEND_TRY_ASSIGN_LONG(zerror, errno); } } else { RETVAL_TRUE; diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 9868c5e3c4c..d5f2a51312a 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1434,21 +1434,25 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz/|z/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz|z", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } if (info) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if ((parser = (xml_parser *)zend_fetch_resource(Z_RES_P(pind), "XML Parser", le_xml_parser)) == NULL) { RETURN_FALSE; } - zval_ptr_dtor(xdata); - array_init(xdata); + xdata = zend_try_array_init(xdata); + if (!xdata) { + return; + } ZVAL_COPY_VALUE(&parser->data, xdata); diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index ba5c854aee2..2710be98c65 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -181,7 +181,7 @@ zval *xmlreader_read_property(zval *object, zval *member, int type, void **cache /* }}} */ /* {{{ xmlreader_write_property */ -void xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) { xmlreader_object *obj; zval tmp_member; @@ -200,12 +200,14 @@ void xmlreader_write_property(zval *object, zval *member, zval *value, void **ca if (hnd != NULL) { php_error_docref(NULL, E_WARNING, "Cannot write to read-only property"); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_ptr_dtor_str(&tmp_member); } + + return value; } /* }}} */ diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 737a3f84a51..937f7b1b0f5 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -764,11 +764,9 @@ void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval if (method_name_out) { method_name = XMLRPC_RequestGetMethodName(response); if (method_name) { - zval_ptr_dtor(method_name_out); - ZVAL_STRING(method_name_out, method_name); + ZEND_TRY_ASSIGN_STRING(method_name_out, method_name); } else { - zval_ptr_dtor(retval); - ZVAL_NULL(retval); + ZEND_TRY_ASSIGN_NULL(retval); } } } @@ -787,7 +785,7 @@ PHP_FUNCTION(xmlrpc_decode_request) zval *method; size_t xml_len, encoding_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { return; } @@ -1389,15 +1387,19 @@ PHP_FUNCTION(xmlrpc_set_type) size_t type_len; XMLRPC_VALUE_TYPE vtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/s", &arg, &type, &type_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs", &arg, &type, &type_len) == FAILURE) { return; } vtype = xmlrpc_str_as_type(type); if (vtype != xmlrpc_none) { - if (set_zval_xmlrpc_type(arg, vtype) == SUCCESS) { + zval tmp; + ZVAL_COPY(&tmp, Z_REFVAL_P(arg)); + if (set_zval_xmlrpc_type(&tmp, vtype) == SUCCESS) { + ZEND_TRY_ASSIGN_VALUE(arg, &tmp); RETURN_TRUE; } + Z_TRY_DELREF(tmp); } else { zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", type); } diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 31455daab86..8d533b79073 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -137,6 +137,7 @@ ZEND_FUNCTION(zend_leak_variable) static zend_object *zend_test_class_new(zend_class_entry *class_type) /* {{{ */ { zend_object *obj = zend_objects_new(class_type); + object_properties_init(obj, class_type); obj->handlers = &zend_test_class_handlers; return obj; } @@ -203,6 +204,36 @@ PHP_MINIT_FUNCTION(zend_test) zend_declare_property_null(zend_test_class, "_StaticProp", sizeof("_StaticProp") - 1, ZEND_ACC_STATIC); + { + zend_string *name = zend_string_init("intProp", sizeof("intProp") - 1, 1); + zval val; + ZVAL_LONG(&val, 123); + zend_declare_typed_property( + zend_test_class, name, &val, ZEND_ACC_PUBLIC, NULL, ZEND_TYPE_ENCODE(IS_LONG, 0)); + zend_string_release(name); + } + + { + zend_string *name = zend_string_init("classProp", sizeof("classProp") - 1, 1); + zend_string *class_name = zend_string_init("stdClass", sizeof("stdClass") - 1, 1); + zval val; + ZVAL_NULL(&val); + zend_declare_typed_property( + zend_test_class, name, &val, ZEND_ACC_PUBLIC, NULL, + ZEND_TYPE_ENCODE_CLASS(class_name, 1)); + zend_string_release(name); + } + + { + zend_string *name = zend_string_init("staticIntProp", sizeof("staticIntProp") - 1, 1); + zval val; + ZVAL_LONG(&val, 123); + zend_declare_typed_property( + zend_test_class, name, &val, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC, NULL, + ZEND_TYPE_ENCODE(IS_LONG, 0)); + zend_string_release(name); + } + INIT_CLASS_ENTRY(class_entry, "_ZendTestChildClass", NULL); zend_test_child_class = zend_register_internal_class_ex(&class_entry, zend_test_class); diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 5aa17fb6691..dbc6c1603ee 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2133,7 +2133,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &name, &name_len, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2150,10 +2150,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_ptr_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_ptr_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ @@ -2171,7 +2169,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lzz|l", &index, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2181,10 +2179,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_ptr_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_ptr_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ diff --git a/tests/classes/array_access_012.phpt b/tests/classes/array_access_012.phpt index ba3d6780f1d..3cd3dceb8a4 100644 --- a/tests/classes/array_access_012.phpt +++ b/tests/classes/array_access_012.phpt @@ -32,7 +32,7 @@ $data['element'] = &$test; --EXPECTF-- Notice: Indirect modification of overloaded element of ArrayAccessImpl has no effect in %sarray_access_012.php on line 24 -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %sarray_access_012.php:24 +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %sarray_access_012.php:24 Stack trace: #0 {main} thrown in %sarray_access_012.php on line 24