summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
Diffstat (limited to 'Zend')
-rw-r--r--Zend/Makefile.am2
-rw-r--r--Zend/OBJECTS2_HOWTO195
-rw-r--r--Zend/README.ZEND_VM5
-rw-r--r--Zend/Zend.m477
-rw-r--r--Zend/ZendCore.dep258
-rw-r--r--Zend/acinclude.m447
-rw-r--r--Zend/bench.php14
-rw-r--r--Zend/build.mk2
-rw-r--r--Zend/configure.ac4
-rw-r--r--Zend/header2
-rw-r--r--Zend/micro_bench.php12
-rw-r--r--Zend/tests/008.phpt8
-rw-r--r--Zend/tests/010.phpt2
-rw-r--r--Zend/tests/ErrorException_getSeverity.phpt2
-rw-r--r--Zend/tests/abstract-static.phpt2
-rw-r--r--Zend/tests/access_modifiers_011.phpt2
-rw-r--r--Zend/tests/access_modifiers_012.phpt2
-rw-r--r--Zend/tests/add_001.phpt2
-rw-r--r--Zend/tests/add_002.phpt4
-rw-r--r--Zend/tests/add_003.phpt4
-rw-r--r--Zend/tests/add_005.phpt2
-rw-r--r--Zend/tests/and_001.phpt2
-rw-r--r--Zend/tests/anon/002.phpt2
-rw-r--r--Zend/tests/anon/013.phpt2
-rw-r--r--Zend/tests/anon/014.phpt2
-rw-r--r--Zend/tests/arg_unpack/by_ref.phpt2
-rw-r--r--Zend/tests/arg_unpack/non_integer_keys.phpt21
-rw-r--r--Zend/tests/arg_unpack/string_keys.phpt2
-rw-r--r--Zend/tests/argument_restriction_004.phpt2
-rw-r--r--Zend/tests/assert/expect_001.phpt2
-rw-r--r--Zend/tests/assert/expect_019.phpt2
-rw-r--r--Zend/tests/assert/expect_empty_stmt_bug.phpt2
-rw-r--r--Zend/tests/assert/indirect_var_access_misoptimization.phpt2
-rw-r--r--Zend/tests/assign_ref_error_var_handling.phpt25
-rw-r--r--Zend/tests/assign_ref_to_overloaded_prop.phpt23
-rw-r--r--Zend/tests/assign_to_var_001.phpt2
-rw-r--r--Zend/tests/assign_to_var_002.phpt2
-rw-r--r--Zend/tests/assign_to_var_003.phpt2
-rw-r--r--Zend/tests/assign_to_var_004.phpt2
-rw-r--r--Zend/tests/break_error_001.phpt4
-rw-r--r--Zend/tests/break_error_002.phpt4
-rw-r--r--Zend/tests/bug21478.phpt4
-rw-r--r--Zend/tests/bug22836.phpt2
-rw-r--r--Zend/tests/bug26229.phpt2
-rw-r--r--Zend/tests/bug26697.phpt2
-rw-r--r--Zend/tests/bug27669.phpt3
-rw-r--r--Zend/tests/bug28442.phpt2
-rw-r--r--Zend/tests/bug29210.phpt2
-rw-r--r--Zend/tests/bug29368.phpt2
-rw-r--r--Zend/tests/bug29883.phpt14
-rw-r--r--Zend/tests/bug32290.phpt2
-rw-r--r--Zend/tests/bug33771.phpt2
-rw-r--r--Zend/tests/bug36214.phpt2
-rw-r--r--Zend/tests/bug36568.phpt4
-rw-r--r--Zend/tests/bug37811.phpt2
-rw-r--r--Zend/tests/bug40809.phpt1
-rw-r--r--Zend/tests/bug40815.phpt2
-rw-r--r--Zend/tests/bug41026.phpt2
-rw-r--r--Zend/tests/bug41075.phpt2
-rw-r--r--Zend/tests/bug42819.phpt2
-rw-r--r--Zend/tests/bug43027.phpt2
-rw-r--r--Zend/tests/bug43200_2.phpt2
-rw-r--r--Zend/tests/bug43344_3.phpt6
-rw-r--r--Zend/tests/bug43344_4.phpt6
-rw-r--r--Zend/tests/bug43344_5.phpt6
-rw-r--r--Zend/tests/bug43450.phpt3
-rw-r--r--Zend/tests/bug45805.phpt4
-rw-r--r--Zend/tests/bug46196.phpt2
-rw-r--r--Zend/tests/bug46304.phpt15
-rw-r--r--Zend/tests/bug46665.phpt2
-rw-r--r--Zend/tests/bug46811.phpt2
-rw-r--r--Zend/tests/bug47353.phpt2
-rw-r--r--Zend/tests/bug47981.phpt2
-rw-r--r--Zend/tests/bug48215.phpt2
-rw-r--r--Zend/tests/bug48770.phpt2
-rw-r--r--Zend/tests/bug50174.phpt2
-rw-r--r--Zend/tests/bug53632.phpt2
-rw-r--r--Zend/tests/bug53748.phpt2
-rw-r--r--Zend/tests/bug54043.phpt20
-rw-r--r--Zend/tests/bug54624.phpt2
-rw-r--r--Zend/tests/bug55135.phpt2
-rw-r--r--Zend/tests/bug55137.phpt26
-rw-r--r--Zend/tests/bug55156.phpt2
-rw-r--r--Zend/tests/bug55445.phpt2
-rw-r--r--Zend/tests/bug60536_002.phpt1
-rw-r--r--Zend/tests/bug60536_003.phpt1
-rw-r--r--Zend/tests/bug60536_004.phpt3
-rw-r--r--Zend/tests/bug60536_005.phpt3
-rw-r--r--Zend/tests/bug61761.phpt2
-rw-r--r--Zend/tests/bug62892.phpt2
-rw-r--r--Zend/tests/bug63055.phpt2
-rw-r--r--Zend/tests/bug63217.phpt123
-rw-r--r--Zend/tests/bug63982.phpt2
-rw-r--r--Zend/tests/bug64354.phpt2
-rw-r--r--Zend/tests/bug64578.phpt2
-rw-r--r--Zend/tests/bug65419.phpt2
-rw-r--r--Zend/tests/bug66015.phpt2
-rw-r--r--Zend/tests/bug66218.phpt2
-rw-r--r--Zend/tests/bug66811.phpt2
-rw-r--r--Zend/tests/bug67368.phpt2
-rw-r--r--Zend/tests/bug67436/bug67436_nohandler.phpt2
-rw-r--r--Zend/tests/bug69221.phpt2
-rw-r--r--Zend/tests/bug69388.phpt1
-rw-r--r--Zend/tests/bug69388_2.phpt1
-rw-r--r--Zend/tests/bug69955.phpt2
-rw-r--r--Zend/tests/bug70089.phpt2
-rw-r--r--Zend/tests/bug70958.phpt2
-rw-r--r--Zend/tests/bug70987.phpt2
-rw-r--r--Zend/tests/bug71756.phpt2
-rw-r--r--Zend/tests/bug72101.phpt2
-rw-r--r--Zend/tests/bug72221.phpt11
-rw-r--r--Zend/tests/bug72543_5.phpt9
-rw-r--r--Zend/tests/bug72594.phpt2
-rw-r--r--Zend/tests/bug72911.phpt2
-rw-r--r--Zend/tests/bug73337.phpt4
-rw-r--r--Zend/tests/bug73753.phpt2
-rw-r--r--Zend/tests/bug73954.phpt2
-rw-r--r--Zend/tests/bug74408.phpt4
-rw-r--r--Zend/tests/bug74603.phpt4
-rw-r--r--Zend/tests/bug74947.phpt2
-rw-r--r--Zend/tests/bug75218.phpt24
-rw-r--r--Zend/tests/bug76337.phpt12
-rw-r--r--Zend/tests/bug76439.phpt68
-rw-r--r--Zend/tests/bug76439_2.phpt15
-rw-r--r--Zend/tests/bug76667.phpt38
-rw-r--r--Zend/tests/bug76752.phpt11
-rw-r--r--Zend/tests/bug76869.phpt23
-rw-r--r--Zend/tests/bug77291.phpt42
-rw-r--r--Zend/tests/bug77345_gc_1.phpt42
-rw-r--r--Zend/tests/bug77345_gc_2.phpt48
-rw-r--r--Zend/tests/bug77376.phpt12
-rw-r--r--Zend/tests/bug77922.phpt20
-rw-r--r--Zend/tests/bug78010.phpt32
-rw-r--r--Zend/tests/bug78271.phpt27
-rw-r--r--Zend/tests/bug78363.phptbin0 -> 201 bytes
-rw-r--r--Zend/tests/call_static_002.phpt2
-rw-r--r--Zend/tests/call_user_func_001.phpt2
-rw-r--r--Zend/tests/call_user_func_005.phpt2
-rw-r--r--Zend/tests/case_insensitive_constant_deprecation.phpt127
-rw-r--r--Zend/tests/cast_to_bool.phpt2
-rw-r--r--Zend/tests/class_alias_015.phpt18
-rw-r--r--Zend/tests/class_alias_017.phpt2
-rw-r--r--Zend/tests/class_constants_002.phpt6
-rw-r--r--Zend/tests/class_constants_003.phpt2
-rw-r--r--Zend/tests/class_constants_005.phpt12
-rw-r--r--Zend/tests/class_name_as_scalar.phpt2
-rw-r--r--Zend/tests/class_properties_dynamic.phpt2
-rw-r--r--Zend/tests/clone_004.phpt2
-rw-r--r--Zend/tests/closure_024.phpt2
-rw-r--r--Zend/tests/closure_036.phpt2
-rw-r--r--Zend/tests/closure_037.phpt2
-rw-r--r--Zend/tests/closure_042.phpt3
-rw-r--r--Zend/tests/closure_044.phpt2
-rw-r--r--Zend/tests/closure_045.phpt2
-rw-r--r--Zend/tests/closure_046.phpt2
-rw-r--r--Zend/tests/closures/closure_from_callable_reflection.phpt2
-rw-r--r--Zend/tests/compare_002.phpt2
-rw-r--r--Zend/tests/compound_assign_with_numeric_strings.phpt2
-rw-r--r--Zend/tests/constant_arrays.phpt2
-rw-r--r--Zend/tests/constants_002.phpt2
-rw-r--r--Zend/tests/continue_targeting_switch_warning.phpt49
-rw-r--r--Zend/tests/custom_assert_deprecation.phpt12
-rw-r--r--Zend/tests/declare_005.phpt3
-rw-r--r--Zend/tests/div_001.phpt2
-rw-r--r--Zend/tests/double_to_string_64bit.phpt2
-rw-r--r--Zend/tests/empty_str_offset.phpt24
-rw-r--r--Zend/tests/errmsg_024.phpt2
-rw-r--r--Zend/tests/errmsg_040.phpt2
-rw-r--r--Zend/tests/errmsg_041.phpt11
-rw-r--r--Zend/tests/error_reporting06.phpt2
-rw-r--r--Zend/tests/error_reporting07.phpt2
-rw-r--r--Zend/tests/error_reporting10.phpt2
-rw-r--r--Zend/tests/exception_handler_001.phpt2
-rw-r--r--Zend/tests/exception_handler_003.phpt2
-rw-r--r--Zend/tests/exception_handler_005.phpt2
-rw-r--r--Zend/tests/exception_handler_006.phpt2
-rw-r--r--Zend/tests/flexible-heredoc-complex-test1.phpt27
-rw-r--r--Zend/tests/flexible-heredoc-complex-test2.phpt27
-rw-r--r--Zend/tests/flexible-heredoc-complex-test3.phpt27
-rw-r--r--Zend/tests/flexible-heredoc-complex-test4.phpt35
-rw-r--r--Zend/tests/flexible-heredoc-error1.phpt14
-rw-r--r--Zend/tests/flexible-heredoc-error10.phpt13
-rw-r--r--Zend/tests/flexible-heredoc-error11.phpt13
-rw-r--r--Zend/tests/flexible-heredoc-error12.phpt13
-rw-r--r--Zend/tests/flexible-heredoc-error13.phpt13
-rw-r--r--Zend/tests/flexible-heredoc-error2.phpt14
-rw-r--r--Zend/tests/flexible-heredoc-error3.phpt14
-rw-r--r--Zend/tests/flexible-heredoc-error4.phpt14
-rw-r--r--Zend/tests/flexible-heredoc-error5.phpt11
-rw-r--r--Zend/tests/flexible-heredoc-error6.phpt10
-rw-r--r--Zend/tests/flexible-heredoc-error7.phpt11
-rw-r--r--Zend/tests/flexible-heredoc-error8.phpt12
-rw-r--r--Zend/tests/flexible-heredoc-error9.phpt14
-rw-r--r--Zend/tests/flexible-heredoc-nowdoc-lineno.phpt30
-rw-r--r--Zend/tests/flexible-heredoc-nowdoc.phpt128
-rw-r--r--Zend/tests/flexible-nowdoc-error1.phpt14
-rw-r--r--Zend/tests/flexible-nowdoc-error2.phpt14
-rw-r--r--Zend/tests/flexible-nowdoc-error3.phpt14
-rw-r--r--Zend/tests/flexible-nowdoc-error4.phpt14
-rw-r--r--Zend/tests/flexible-nowdoc-error5.phpt11
-rw-r--r--Zend/tests/flexible-nowdoc-error6.phpt10
-rw-r--r--Zend/tests/flexible-nowdoc-error7.phpt11
-rw-r--r--Zend/tests/flexible-nowdoc-error8.phpt11
-rw-r--r--Zend/tests/foreach_by_ref_repacking_insert.phpt18
-rw-r--r--Zend/tests/foreach_list_002.phpt2
-rw-r--r--Zend/tests/foreach_reference.phpt2
-rw-r--r--Zend/tests/foreach_unset_globals.phpt2
-rw-r--r--Zend/tests/function_arguments/argument_count_incorrect_userland_strict.phpt4
-rw-r--r--Zend/tests/function_arguments/call_with_leading_comma_error.phpt8
-rw-r--r--Zend/tests/function_arguments/call_with_multi_inner_comma_error.phpt8
-rw-r--r--Zend/tests/function_arguments/call_with_multi_trailing_comma_error.phpt8
-rw-r--r--Zend/tests/function_arguments/call_with_only_comma_error.phpt8
-rw-r--r--Zend/tests/function_arguments/call_with_trailing_comma_basic.phpt97
-rw-r--r--Zend/tests/gc_016.phpt4
-rw-r--r--Zend/tests/gc_024.phpt2
-rw-r--r--Zend/tests/gc_029.phpt2
-rw-r--r--Zend/tests/gc_029_zts.phpt37
-rw-r--r--Zend/tests/gc_031.phpt2
-rw-r--r--Zend/tests/gc_032.phpt28
-rw-r--r--Zend/tests/gc_036.phpt19
-rw-r--r--Zend/tests/gc_037.phpt34
-rw-r--r--Zend/tests/gc_038.phpt132
-rw-r--r--Zend/tests/gc_039.phpt15
-rw-r--r--Zend/tests/gc_042.phpt14
-rw-r--r--Zend/tests/generators/bug74157.phpt2
-rw-r--r--Zend/tests/generators/bug76427.phpt24
-rw-r--r--Zend/tests/generators/errors/serialize_unserialize_error.phpt2
-rw-r--r--Zend/tests/generators/finally/return_return.phpt2
-rw-r--r--Zend/tests/generators/generator_with_type_check.phpt2
-rw-r--r--Zend/tests/generators/generator_with_type_check_2.phpt4
-rw-r--r--Zend/tests/generators/get_return.phpt2
-rw-r--r--Zend/tests/get_class_methods_001.phpt2
-rw-r--r--Zend/tests/get_class_methods_002.phpt2
-rw-r--r--Zend/tests/get_defined_vars.phpt4
-rw-r--r--Zend/tests/get_required_files.phpt2
-rw-r--r--Zend/tests/grammar/bug78441.phpt24
-rw-r--r--Zend/tests/grammar/regression_001.phpt2
-rw-r--r--Zend/tests/grammar/regression_002.phpt2
-rw-r--r--Zend/tests/grammar/regression_006.phpt2
-rw-r--r--Zend/tests/grammar/regression_007.phpt2
-rw-r--r--Zend/tests/grammar/regression_008.phpt2
-rw-r--r--Zend/tests/grammar/regression_009.phpt2
-rw-r--r--Zend/tests/grammar/regression_010.phpt2
-rw-r--r--Zend/tests/grammar/regression_013.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_001.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_002.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_003.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_004.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_005.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_006.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_007.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_008.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_009.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_010.phpt2
-rw-r--r--Zend/tests/heredoc_009.phpt42
-rw-r--r--Zend/tests/heredoc_010.phpt32
-rw-r--r--Zend/tests/heredoc_017.phpt17
-rw-r--r--Zend/tests/heredoc_018.phpt17
-rw-r--r--Zend/tests/indirect_call_array_004.phpt2
-rw-r--r--Zend/tests/inherit_internal_static.phpt18
-rw-r--r--Zend/tests/instanceof_const.phpt10
-rw-r--r--Zend/tests/int_overflow_32bit.phpt2
-rw-r--r--Zend/tests/int_underflow_64bit.phpt2
-rw-r--r--Zend/tests/inter_04.phpt2
-rw-r--r--Zend/tests/isset_str_offset.phpt24
-rw-r--r--Zend/tests/jump12.phpt2
-rw-r--r--Zend/tests/list/list_reference_001.phpt88
-rw-r--r--Zend/tests/list/list_reference_002.phpt20
-rw-r--r--Zend/tests/list/list_reference_003.phpt73
-rw-r--r--Zend/tests/list/list_reference_004.phpt28
-rw-r--r--Zend/tests/list/list_reference_005.phpt73
-rw-r--r--Zend/tests/list/list_reference_006.phpt58
-rw-r--r--Zend/tests/list/list_reference_007.phpt75
-rw-r--r--Zend/tests/list/list_reference_008.phpt68
-rw-r--r--Zend/tests/list/list_reference_009.phpt47
-rw-r--r--Zend/tests/list/list_reference_010.phpt8
-rw-r--r--Zend/tests/list/list_reference_011.phpt9
-rw-r--r--Zend/tests/list_009.phpt14
-rw-r--r--Zend/tests/list_keyed_non_literals.phpt2
-rw-r--r--Zend/tests/list_self_assign.phpt2
-rw-r--r--Zend/tests/lsb_001.phpt2
-rw-r--r--Zend/tests/lsb_002.phpt2
-rw-r--r--Zend/tests/lsb_003.phpt2
-rw-r--r--Zend/tests/lsb_004.phpt2
-rw-r--r--Zend/tests/lsb_005.phpt2
-rw-r--r--Zend/tests/lsb_010.phpt2
-rw-r--r--Zend/tests/lsb_015.phpt2
-rw-r--r--Zend/tests/lsb_016.phpt2
-rw-r--r--Zend/tests/lsb_019.phpt2
-rw-r--r--Zend/tests/lsb_020.phpt2
-rw-r--r--Zend/tests/lsb_021.phpt2
-rw-r--r--Zend/tests/methods-on-non-objects-usort.phpt2
-rw-r--r--Zend/tests/not_001.phpt2
-rw-r--r--Zend/tests/nowdoc_009.phpt39
-rw-r--r--Zend/tests/nowdoc_010.phpt32
-rw-r--r--Zend/tests/nowdoc_011.phpt2
-rw-r--r--Zend/tests/ns_035.phpt2
-rw-r--r--Zend/tests/ns_036.phpt2
-rw-r--r--Zend/tests/ns_054.phpt2
-rw-r--r--Zend/tests/ns_056.phpt2
-rw-r--r--Zend/tests/ns_059.phpt2
-rw-r--r--Zend/tests/ns_077_6.phpt16
-rw-r--r--Zend/tests/ns_089.phpt2
-rw-r--r--Zend/tests/ns_090.phpt2
-rw-r--r--Zend/tests/ns_091.phpt2
-rw-r--r--Zend/tests/ns_093.phpt2
-rw-r--r--Zend/tests/ns_095.phpt2
-rw-r--r--Zend/tests/object_types/return_type_in_class.phpt2
-rw-r--r--Zend/tests/object_types/return_type_in_function.phpt2
-rw-r--r--Zend/tests/object_types/return_type_inheritance_in_class.phpt2
-rw-r--r--Zend/tests/object_types/return_type_inheritance_in_interface.phpt2
-rw-r--r--Zend/tests/object_types/return_type_reflection.phpt2
-rw-r--r--Zend/tests/object_types/type_hint_in_class_method.phpt2
-rw-r--r--Zend/tests/object_types/type_hint_in_function.phpt2
-rw-r--r--Zend/tests/object_types/type_hint_reflection.phpt2
-rw-r--r--Zend/tests/objects_010.phpt2
-rw-r--r--Zend/tests/objects_018.phpt2
-rw-r--r--Zend/tests/objects_032.phpt2
-rw-r--r--Zend/tests/objects_033.phpt27
-rw-r--r--Zend/tests/oct_overflow.phpt (renamed from Zend/tests/oct_overflow_32bit.phpt)2
-rw-r--r--Zend/tests/offset_bool.phpt2
-rw-r--r--Zend/tests/offset_long.phpt2
-rw-r--r--Zend/tests/offset_null.phpt2
-rw-r--r--Zend/tests/or_001.phpt2
-rw-r--r--Zend/tests/overloaded_func_001.phpt2
-rw-r--r--Zend/tests/overloaded_func_002.phpt2
-rw-r--r--Zend/tests/overloaded_prop_assign_op_refs.phpt47
-rw-r--r--Zend/tests/return_types/003.phpt2
-rw-r--r--Zend/tests/return_types/014.phpt2
-rw-r--r--Zend/tests/return_types/018.phpt2
-rw-r--r--Zend/tests/return_types/019.phpt2
-rw-r--r--Zend/tests/return_types/022.phpt2
-rw-r--r--Zend/tests/return_types/023.phpt2
-rw-r--r--Zend/tests/return_types/030.phpt2
-rw-r--r--Zend/tests/return_types/bug70557.phpt2
-rw-r--r--Zend/tests/return_types/internal_functions001.phpt2
-rw-r--r--Zend/tests/return_types/internal_functions002.phpt2
-rw-r--r--Zend/tests/return_types/internal_functions003.phpt11
-rw-r--r--Zend/tests/return_types/reflection001.phpt5
-rw-r--r--Zend/tests/return_types/return_reference_separation.phpt2
-rw-r--r--Zend/tests/return_types/rfc001.phpt2
-rw-r--r--Zend/tests/return_types/rfc002.phpt2
-rw-r--r--Zend/tests/settype_bool.phpt2
-rw-r--r--Zend/tests/settype_null.phpt2
-rw-r--r--Zend/tests/this_in_extract.phpt18
-rw-r--r--Zend/tests/traits/bug55554c.phpt2
-rw-r--r--Zend/tests/traits/bug60217a.phpt2
-rw-r--r--Zend/tests/traits/bug61998.phpt2
-rw-r--r--Zend/tests/traits/bug63911.phpt26
-rw-r--r--Zend/tests/traits/bug65576a.phpt4
-rw-r--r--Zend/tests/traits/bug65576b.phpt4
-rw-r--r--Zend/tests/traits/bug69579.phpt2
-rw-r--r--Zend/tests/traits/bug74922.phpt16
-rw-r--r--Zend/tests/traits/bug74922a.phpt16
-rw-r--r--Zend/tests/traits/bug74922b.inc9
-rw-r--r--Zend/tests/traits/bug74922b.phpt15
-rw-r--r--Zend/tests/traits/bug74922c.phpt20
-rw-r--r--Zend/tests/traits/bug75607.phpt2
-rw-r--r--Zend/tests/traits/bug75607a.phpt2
-rw-r--r--Zend/tests/traits/bug76539.phpt26
-rw-r--r--Zend/tests/traits/bug76700.phpt30
-rw-r--r--Zend/tests/traits/bug76773.phpt32
-rw-r--r--Zend/tests/traits/bugs/abstract-methods02.phpt2
-rw-r--r--Zend/tests/traits/bugs/abstract-methods03.phpt2
-rw-r--r--Zend/tests/traits/bugs/abstract-methods04.phpt2
-rw-r--r--Zend/tests/traits/bugs/alias-semantics.phpt2
-rw-r--r--Zend/tests/traits/bugs/alias-semantics02.phpt2
-rw-r--r--Zend/tests/traits/bugs/overridding-conflicting-methods.phpt2
-rw-r--r--Zend/tests/traits/conflict002.phpt2
-rw-r--r--Zend/tests/traits/flattening001.phpt2
-rw-r--r--Zend/tests/traits/flattening002.phpt2
-rw-r--r--Zend/tests/traits/flattening003.phpt2
-rw-r--r--Zend/tests/traits/inheritance001.phpt2
-rw-r--r--Zend/tests/traits/inheritance002.phpt2
-rw-r--r--Zend/tests/traits/language001.phpt2
-rw-r--r--Zend/tests/traits/language002.phpt2
-rw-r--r--Zend/tests/traits/language003.phpt2
-rw-r--r--Zend/tests/traits/language004.phpt2
-rw-r--r--Zend/tests/traits/language005.phpt2
-rw-r--r--Zend/tests/traits/language006.phpt2
-rw-r--r--Zend/tests/traits/language007.phpt2
-rw-r--r--Zend/tests/traits/language009.phpt2
-rw-r--r--Zend/tests/traits/language012.phpt2
-rw-r--r--Zend/tests/traits/language013.phpt2
-rw-r--r--Zend/tests/traits/property001.phpt7
-rw-r--r--Zend/tests/traits/property002.phpt3
-rw-r--r--Zend/tests/traits/property003.phpt1
-rw-r--r--Zend/tests/traits/property004.phpt1
-rw-r--r--Zend/tests/traits/property005.phpt3
-rw-r--r--Zend/tests/traits/property006.phpt5
-rw-r--r--Zend/tests/traits/property007.phpt5
-rw-r--r--Zend/tests/traits/property008.phpt3
-rw-r--r--Zend/tests/traits/property009.phpt3
-rw-r--r--Zend/tests/try/catch_finally_001.phpt2
-rw-r--r--Zend/tests/try/catch_finally_002.phpt2
-rw-r--r--Zend/tests/try/catch_finally_003.phpt2
-rw-r--r--Zend/tests/try/catch_finally_005.phpt2
-rw-r--r--Zend/tests/try/finally_goto_003.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_001.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_002.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_003.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_004.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_005.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_006.phpt2
-rw-r--r--Zend/tests/try/try_catch_finally_007.phpt2
-rw-r--r--Zend/tests/try/try_finally_006.phpt2
-rw-r--r--Zend/tests/type_declarations/array_001.phpt2
-rw-r--r--Zend/tests/type_declarations/default_boolean_hint_values.phpt2
-rw-r--r--Zend/tests/type_declarations/explicit_weak_include_strict.phpt2
-rw-r--r--Zend/tests/type_declarations/internal_function_strict_mode.phpt4
-rw-r--r--Zend/tests/type_declarations/iterable_001.phpt2
-rw-r--r--Zend/tests/type_declarations/iterable_003.phpt2
-rw-r--r--Zend/tests/type_declarations/scalar_basic.phpt26
-rw-r--r--Zend/tests/type_declarations/scalar_constant_defaults.phpt2
-rw-r--r--Zend/tests/type_declarations/scalar_constant_defaults_error.phpt2
-rw-r--r--Zend/tests/type_declarations/scalar_null.phpt4
-rw-r--r--Zend/tests/type_declarations/scalar_return_basic.phpt26
-rw-r--r--Zend/tests/type_declarations/scalar_return_basic_64bit.phpt26
-rw-r--r--Zend/tests/type_declarations/scalar_strict.phpt68
-rw-r--r--Zend/tests/type_declarations/scalar_strict_64bit.phpt68
-rw-r--r--Zend/tests/type_declarations/scalar_strict_basic.phpt40
-rw-r--r--Zend/tests/type_declarations/scalar_strict_declaration_placement_005.phpt2
-rw-r--r--Zend/tests/type_declarations/scalar_strict_declaration_placement_006.phpt2
-rw-r--r--Zend/tests/type_declarations/scalar_strict_declaration_placement_007.phpt2
-rw-r--r--Zend/tests/type_declarations/strict_call_weak.phpt2
-rw-r--r--Zend/tests/type_declarations/strict_call_weak_explicit.phpt2
-rw-r--r--Zend/tests/type_declarations/strict_include_explicit_weak.phpt2
-rw-r--r--Zend/tests/type_declarations/strict_include_weak.phpt2
-rw-r--r--Zend/tests/type_declarations/weak_include_strict.phpt2
-rw-r--r--Zend/tests/typehints/bug76198.phpt13
-rw-r--r--Zend/tests/typehints/fully_qualified_scalar.phpt2
-rw-r--r--Zend/tests/typehints/namespace_relative_scalar.phpt2
-rw-r--r--Zend/tests/typehints/or_null.phpt26
-rw-r--r--Zend/tests/unexpected_ref_bug.phpt2
-rw-r--r--Zend/tests/unset_cv08.phpt2
-rw-r--r--Zend/tests/unset_cv10.phpt2
-rw-r--r--Zend/tests/use_const/shadow_core.phpt2
-rw-r--r--Zend/tests/variadic/typehint_error.phpt2
-rw-r--r--Zend/tests/variadic/typehint_suppressed_error.phpt2
-rw-r--r--Zend/tests/xor_001.phpt2
-rw-r--r--Zend/tests/xor_002.phpt2
-rw-r--r--Zend/tests/xor_003.phpt2
-rw-r--r--Zend/tests/zend_operators.phpt2
-rw-r--r--Zend/tests/zend_signed_multiply-32bit.phpt2
-rw-r--r--Zend/tests/zend_signed_multiply-64bit-2.phpt2
-rw-r--r--Zend/tests/zend_signed_multiply-64bit.phpt2
-rw-r--r--Zend/tests/zend_strtod.phpt2
-rw-r--r--Zend/zend.c200
-rw-r--r--Zend/zend.h45
-rw-r--r--Zend/zend_API.c757
-rw-r--r--Zend/zend_API.h138
-rw-r--r--Zend/zend_alloc.c304
-rw-r--r--Zend/zend_alloc.h8
-rw-r--r--Zend/zend_alloc_sizes.h2
-rw-r--r--Zend/zend_arena.h15
-rw-r--r--Zend/zend_ast.c565
-rw-r--r--Zend/zend_ast.h112
-rw-r--r--Zend/zend_bitset.h6
-rw-r--r--Zend/zend_builtin_functions.c201
-rw-r--r--Zend/zend_builtin_functions.h6
-rw-r--r--Zend/zend_closures.c91
-rw-r--r--Zend/zend_closures.h9
-rw-r--r--Zend/zend_compile.c1200
-rw-r--r--Zend/zend_compile.h396
-rw-r--r--Zend/zend_config.nw.h6
-rw-r--r--Zend/zend_config.w32.h15
-rw-r--r--Zend/zend_constants.c234
-rw-r--r--Zend/zend_constants.h28
-rw-r--r--Zend/zend_cpuinfo.c117
-rw-r--r--Zend/zend_cpuinfo.h213
-rw-r--r--Zend/zend_default_classes.c2
-rw-r--r--Zend/zend_dtrace.c2
-rw-r--r--Zend/zend_dtrace.d2
-rw-r--r--Zend/zend_dtrace.h2
-rw-r--r--Zend/zend_errors.h6
-rw-r--r--Zend/zend_exceptions.c76
-rw-r--r--Zend/zend_exceptions.h7
-rw-r--r--Zend/zend_execute.c1457
-rw-r--r--Zend/zend_execute.h83
-rw-r--r--Zend/zend_execute_API.c255
-rw-r--r--Zend/zend_extensions.c14
-rw-r--r--Zend/zend_extensions.h8
-rw-r--r--Zend/zend_float.c2
-rw-r--r--Zend/zend_float.h2
-rw-r--r--Zend/zend_gc.c1342
-rw-r--r--Zend/zend_gc.h129
-rw-r--r--Zend/zend_generators.c153
-rw-r--r--Zend/zend_generators.h10
-rw-r--r--Zend/zend_globals.h14
-rw-r--r--Zend/zend_globals_macros.h6
-rw-r--r--Zend/zend_hash.c975
-rw-r--r--Zend/zend_hash.h304
-rw-r--r--Zend/zend_highlight.c18
-rw-r--r--Zend/zend_highlight.h6
-rw-r--r--Zend/zend_inheritance.c528
-rw-r--r--Zend/zend_inheritance.h4
-rw-r--r--Zend/zend_ini.c92
-rw-r--r--Zend/zend_ini.h30
-rw-r--r--Zend/zend_ini_parser.y35
-rw-r--r--Zend/zend_ini_scanner.c3567
-rw-r--r--Zend/zend_ini_scanner.h6
-rw-r--r--Zend/zend_ini_scanner.l4
-rw-r--r--Zend/zend_ini_scanner_defs.h2
-rw-r--r--Zend/zend_interfaces.c96
-rw-r--r--Zend/zend_interfaces.h2
-rw-r--r--Zend/zend_istdiostream.h6
-rw-r--r--Zend/zend_iterators.c6
-rw-r--r--Zend/zend_iterators.h5
-rw-r--r--Zend/zend_language_parser.y45
-rw-r--r--Zend/zend_language_scanner.c1428
-rw-r--r--Zend/zend_language_scanner.h8
-rw-r--r--Zend/zend_language_scanner.l698
-rw-r--r--Zend/zend_language_scanner_defs.h2
-rw-r--r--Zend/zend_list.c39
-rw-r--r--Zend/zend_list.h17
-rw-r--r--Zend/zend_llist.c8
-rw-r--r--Zend/zend_llist.h6
-rw-r--r--Zend/zend_long.h3
-rw-r--r--Zend/zend_modules.h8
-rw-r--r--Zend/zend_multibyte.c2
-rw-r--r--Zend/zend_multibyte.h2
-rw-r--r--Zend/zend_multiply.h34
-rw-r--r--Zend/zend_object_handlers.c919
-rw-r--r--Zend/zend_object_handlers.h58
-rw-r--r--Zend/zend_objects.c92
-rw-r--r--Zend/zend_objects.h13
-rw-r--r--Zend/zend_objects_API.c125
-rw-r--r--Zend/zend_objects_API.h40
-rw-r--r--Zend/zend_opcode.c241
-rw-r--r--Zend/zend_operators.c1082
-rw-r--r--Zend/zend_operators.h389
-rw-r--r--Zend/zend_portability.h161
-rw-r--r--Zend/zend_ptr_stack.c15
-rw-r--r--Zend/zend_ptr_stack.h7
-rw-r--r--Zend/zend_signal.c2
-rw-r--r--Zend/zend_signal.h2
-rw-r--r--Zend/zend_smart_str.c93
-rw-r--r--Zend/zend_smart_str.h17
-rw-r--r--Zend/zend_smart_string.h50
-rw-r--r--Zend/zend_smart_string_public.h2
-rw-r--r--Zend/zend_sort.c2
-rw-r--r--Zend/zend_sort.h2
-rw-r--r--Zend/zend_sprintf.c6
-rw-r--r--Zend/zend_stack.c6
-rw-r--r--Zend/zend_stack.h6
-rw-r--r--Zend/zend_stream.c5
-rw-r--r--Zend/zend_stream.h2
-rw-r--r--Zend/zend_string.c305
-rw-r--r--Zend/zend_string.h115
-rw-r--r--Zend/zend_strtod.h2
-rw-r--r--Zend/zend_ts_hash.c50
-rw-r--r--Zend/zend_ts_hash.h34
-rw-r--r--Zend/zend_type_info.h4
-rw-r--r--Zend/zend_types.h489
-rw-r--r--Zend/zend_variables.c249
-rw-r--r--Zend/zend_variables.h98
-rw-r--r--Zend/zend_virtual_cwd.c164
-rw-r--r--Zend/zend_virtual_cwd.h25
-rw-r--r--Zend/zend_vm.h20
-rw-r--r--Zend/zend_vm_def.h2926
-rw-r--r--Zend/zend_vm_execute.h51543
-rw-r--r--Zend/zend_vm_execute.skl12
-rw-r--r--Zend/zend_vm_gen.php820
-rw-r--r--Zend/zend_vm_handlers.h2059
-rw-r--r--Zend/zend_vm_opcodes.c187
-rw-r--r--Zend/zend_vm_opcodes.h26
-rw-r--r--Zend/zend_vm_trace_handlers.h112
-rw-r--r--Zend/zend_vm_trace_map.h81
568 files changed, 43827 insertions, 39749 deletions
diff --git a/Zend/Makefile.am b/Zend/Makefile.am
index fcf3495e30..537deb26f9 100644
--- a/Zend/Makefile.am
+++ b/Zend/Makefile.am
@@ -18,7 +18,7 @@ libZend_la_SOURCES=\
zend_default_classes.c \
zend_iterators.c zend_interfaces.c zend_exceptions.c \
zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \
- zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c
+ zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c zend_cpuinfo.c
libZend_la_CFLAGS = -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
libZend_la_LDFLAGS =
diff --git a/Zend/OBJECTS2_HOWTO b/Zend/OBJECTS2_HOWTO
deleted file mode 100644
index 302d1e9087..0000000000
--- a/Zend/OBJECTS2_HOWTO
+++ /dev/null
@@ -1,195 +0,0 @@
-Creating an object
-------------------
-
-Object can be created in the following ways:
-
-1. As a result of a function call. E.g.:
-
-$foo = create_new_foo("parameter");
-$foo->run();
-
-The function should create a new zval, create new object and get the
-handle for it, set handle and handler table as needed. Note that the
-handle is the only ID of the object, so it should be enough to
-identify it.
-
-2. Overriding create_object handler for class. E.g.:
-
-$foo = new Java("some.Class.here", "parameter");
-$foo->run();
-
-The create_object handler function should create a new zval, create
-new object and get the handle for it, set handle and handler table as
-needed, and also provide constructor method that would handle
-constructor call. The get_constructor handler table entry should be
-used for that. Do not rely class entry's constructor, unless you refer
-to it from get_constructor handler.
-
-Object maintenance
-------------------
-
-The handlers add_ref and del_ref are called when a new zval referring
-to the object is created. This does not create a new object - both
-zvals still refer to the same object.
-
-clone_obj handler should create a new object, identical to an old one,
-but being a separate entity.
-
-delete_obj should destroy an object, all references to it become
-invalid.
-
-Object access - read
---------------------
-
-read_property is used to read object's property. This value is not
-meant to be changed. The handler returns zval * with the value.
-
-Object access - write
----------------------
-
-write_property is used to directly write object's property by
-name. This handler is used to assign property variables or to change them
-in operations like += or ++ (unless get_property_zval_ptr is also set).
-
-get_property_zval_ptr is used to obtain pointer to modifiable zval for
-operations like += or ++. This should be used only if your object model
-stores properties as real zval's that can be modified from outside.
-Otherwise this handler should be NULL and the engine will use
-read_property and write_property instead.
-
-get_property_ptr is used to obtain zval ** for future writing to
-it. If your object properties are stored as zval*, return real place
-where the property is stored. If the aren't, the best way is to create
-proxy object and handle it via get and set methods (see below).
-This method is meant to be used for send-by-reference and assign-by-reference
-use of object properties. If you don;t want to implement property
-referencing for your objects, you can set this handler to NULL.
-
-get and set handlers are used when engine needs to access the object
-as a value. E.g., in the following situation:
-
-$foo =& $obj->bar;
-$foo = 1;
-
-if $foo is an object (e.g., proxy object from get_property_ptr) it
-would be accessed using write handler.
-
-Object access - method call
----------------------------
-
-get_method handler is used to find method description by name. It
-should set right type, function name and parameter mask for the
-method. If the type is ZEND_OVERLOADED_FUNCTION, the method would be
-called via call_method handler, otherwise it would be called with
-standard Zend means.
-
-get_constructor performs the same function as get_method, but for the
-object constructor.
-
-call_method handler is used to perform method call. Parameters are
-passed like to any other Zend internal function.
-
-Object - comparison
--------------------
-
-Objects can be compared via compare_objects handler. This is used with
-== operation, === compares objects by handles, i.e., return true if
-and only if it's really the same object. Note that objects from
-different object types (i.e., having different handlers) can not be
-compared.
-
-Objects - reflection
---------------------
-
-get_class_name is used to retrieve class name of the object.
-get_class_entry returns class entry (zend_class_entry) for the object,
-in case there exists PHP class for it.
-No other reflection functions are currently implemented.
-
-Objects - data structures and handlers
----------------------------------------
-
-The object is represented by the following structure:
-
-struct _zend_object_value {
- zend_object_handle handle;
- zend_object_handlers *handlers;
-};
-
-handle is an ID of the object among the objects of the same type (not
-class!). The type of the object and how it behaves is determined by
-the handler table.
-
-typedef struct _zend_object_handlers {
- zend_object_add_ref_t add_ref;
- zend_object_del_ref_t del_ref;
- zend_object_delete_obj_t delete_obj;
- zend_object_clone_obj_t clone_obj;
- zend_object_read_property_t read_property;
- zend_object_write_property_t write_property;
- zend_object_get_property_ptr_t get_property_ptr;
- zend_object_get_property_zval_ptr_t get_property_zval_ptr;
- zend_object_get_t get;
- zend_object_set_t set;
- zend_object_has_property_t has_property;
- zend_object_unset_property_t unset_property;
- zend_object_get_properties_t get_properties;
- zend_object_get_method_t get_method;
- zend_object_call_method_t call_method;
- zend_object_get_constructor_t get_constructor;
- zend_object_get_class_entry_t get_class_entry;
- zend_object_get_class_name_t get_class_name;
- zend_object_compare_t compare_objects;
-} zend_object_handlers;
-
-See zend_object_handlers.h for prototypes. All objects are passed as zval's.
-
-Handlers explained:
-
-add_ref - called when a copy of the object handle is created.
-
-del_ref - called when a copy of the object handle is destroyed.
-
-delete_obj - called when an object needs to be destroyed.
-
-clone_obj - called when a new object identical to an old one should be
-created (unlike Zend Engine 1, this never happens unless explicitly
-asked for).
-
-read_property - returns zval *, containing the value of the
-property. Is used when value of the property should be retrieved for
-reading.
-
-write_property - assigns value to certain property of the object.
-
-get_property_zval_ptr - retrieves zval** for being directly modified by
-the engine. If your properties are not zval's, don't define it.
-
-get_property_ptr - retrieves zval** for the property of the value, to
-be used for read and write. If object properties are not zval's
-natively, this method should create and return proxy object for use
-with get and set methods.
-
-get - retrieves zval* for object contents. To be used mainly with
-proxy objects from get_property_ptr, but also may be used for
-convert_to_* functions.
-
-set - sets value for object contents. To be used mainly with
-proxy objects from get_property_ptr.
-
-has_property - checks if the object has certain property set.
-
-unset_property - removes value for the property of the object
-
-get_method - retrieves description of the method
-
-call_method - calls the method (parameters should be put on stack like
-for any other PHP internal function).
-
-get_constructor - get description for the object constructor method
-
-get_class_entry - should return the class entry for the object
-
-get_class_name - get the name of the class the object belongs to
-
-compare_objects - compares if two objects are equal
diff --git a/Zend/README.ZEND_VM b/Zend/README.ZEND_VM
index da29b49b17..b05b7ccc9a 100644
--- a/Zend/README.ZEND_VM
+++ b/Zend/README.ZEND_VM
@@ -100,8 +100,3 @@ zend_vm_execute.h. Debugging with original file requires --with-lines
option. By default ZE2 uses the following command to generate executor:
$ php zend_vm_gen.php --with-vm-kind=CALL
-
-Zend Engine II currently includes two executors during the build process, one
-is the specialized version and the other is the old one non-specialized with
-function handlers. By default Zend Engine II uses the specialized one but you
-can switch to the old executor at runtime by calling zend_vm_use_old_executor().
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index cd55e600ab..67cea95a91 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -1,12 +1,10 @@
dnl
-dnl $Id$
-dnl
dnl This file contains Zend specific autoconf functions.
dnl
AC_DEFUN([LIBZEND_CHECK_INT_TYPE],[
AC_MSG_CHECKING(for $1)
-AC_TRY_COMPILE([
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@@ -14,16 +12,16 @@ AC_TRY_COMPILE([
#include <inttypes.h>
#elif HAVE_STDINT_H
#include <stdint.h>
-#endif],
-[if (($1 *) 0)
+#endif]],
+[[if (($1 *) 0)
return 0;
if (sizeof ($1))
return 0;
-],[
+]])],[
AC_DEFINE_UNQUOTED([HAVE_]translit($1,a-z_-,A-Z__), 1,[Define if $1 type is present. ])
AC_MSG_RESULT(yes)
-], AC_MSG_RESULT(no)
-)dnl
+], [AC_MSG_RESULT(no)
+])dnl
])
AC_DEFUN([LIBZEND_BASIC_CHECKS],[
@@ -60,10 +58,10 @@ sys/time.h \
signal.h \
unix.h \
stdlib.h \
+cpuid.h \
dlfcn.h)
AC_TYPE_SIZE_T
-AC_TYPE_SIGNAL
AC_DEFUN([LIBZEND_LIBDL_CHECKS],[
AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"])
@@ -109,7 +107,7 @@ ZEND_CHECK_FLOAT_PRECISION
dnl test whether double cast to long preserves least significant bits
AC_MSG_CHECKING(whether double cast to long preserves least significant bits)
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <limits.h>
int main()
@@ -129,7 +127,7 @@ int main()
}
exit(1);
}
-], [
+]])], [
AC_DEFINE([ZEND_DVAL_TO_LVAL_CAST_OK], 1, [Define if double cast to long preserves least significant bits])
AC_MSG_RESULT(yes)
], [
@@ -195,7 +193,6 @@ test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
AC_DEFINE(ZTS,1,[ ])
CFLAGS="$CFLAGS -DZTS"
- LIBZEND_CPLUSPLUS_CHECKS
fi
changequote({,})
@@ -222,7 +219,7 @@ dnl test and set the alignment define for ZEND_MM
dnl this also does the logarithmic test for ZEND_MM.
AC_MSG_CHECKING(for MM alignment and log values)
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
typedef union _mm_align_test {
@@ -254,7 +251,7 @@ int main()
exit(0);
}
-], [
+]])], [
LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1`
LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2`
AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ])
@@ -269,7 +266,7 @@ AC_MSG_RESULT(done)
dnl test for memory allocation using mmap(MAP_ANON)
AC_MSG_CHECKING(for memory allocation using mmap(MAP_ANON))
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -301,7 +298,7 @@ int main()
}
return 0;
}
-], [
+]])], [
AC_DEFINE([HAVE_MEM_MMAP_ANON], 1, [Define if the target system has support for memory allocation using mmap(MAP_ANON)])
AC_MSG_RESULT(yes)
], [
@@ -314,7 +311,7 @@ int main()
dnl test for memory allocation using mmap("/dev/zero")
AC_MSG_CHECKING(for memory allocation using mmap("/dev/zero"))
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -356,7 +353,7 @@ int main()
}
return 0;
}
-], [
+]])], [
AC_DEFINE([HAVE_MEM_MMAP_ZERO], 1, [Define if the target system has support for memory allocation using mmap("/dev/zero")])
AC_MSG_RESULT(yes)
], [
@@ -391,10 +388,6 @@ AC_MSG_RESULT($ZEND_SIGNALS)
])
-AC_DEFUN([LIBZEND_CPLUSPLUS_CHECKS],[
-
-])
-
AC_MSG_CHECKING(whether /dev/urandom exists)
if test -r "/dev/urandom" && test -c "/dev/urandom"; then
AC_DEFINE([HAVE_DEV_URANDOM], 1, [Define if the target system has /dev/urandom device])
@@ -420,7 +413,7 @@ AC_ARG_ENABLE(gcc-global-regs,
])
AC_MSG_CHECKING(for global register variables support)
if test "$ZEND_GCC_GLOBAL_REGS" != "no"; then
- AC_TRY_COMPILE([
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#if defined(__GNUC__)
# define ZEND_GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
#else
@@ -453,8 +446,8 @@ int emu(const opcode_handler_t *ip, void *fp) {
FP = orig_fp;
IP = orig_ip;
}
- ], [
- ], [
+ ]], [[
+ ]])], [
ZEND_GCC_GLOBAL_REGS=yes
], [
ZEND_GCC_GLOBAL_REGS=no
@@ -471,7 +464,7 @@ dnl
dnl Check if atof() accepts NAN
dnl
AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
#include <stdlib.h>
@@ -487,7 +480,7 @@ int main(int argc, char** argv)
{
return zend_isnan(atof("NAN")) ? 0 : 1;
}
-],[
+]])],[
ac_cv_atof_accept_nan=yes
],[
ac_cv_atof_accept_nan=no
@@ -502,7 +495,7 @@ dnl
dnl Check if atof() accepts INF
dnl
AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
#include <stdlib.h>
@@ -521,7 +514,7 @@ int main(int argc, char** argv)
{
return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1;
}
-],[
+]])],[
ac_cv_atof_accept_inf=yes
],[
ac_cv_atof_accept_inf=no
@@ -536,7 +529,7 @@ dnl
dnl Check if HUGE_VAL == INF
dnl
AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_inf,[
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
#include <stdlib.h>
@@ -555,7 +548,7 @@ int main(int argc, char** argv)
{
return zend_isinf(HUGE_VAL) ? 0 : 1;
}
-],[
+]])],[
ac_cv_huge_val_inf=yes
],[
ac_cv_huge_val_inf=no
@@ -571,7 +564,7 @@ dnl
dnl Check if HUGE_VAL + -HUGEVAL == NAN
dnl
AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
-AC_TRY_RUN([
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
#include <stdlib.h>
@@ -592,7 +585,7 @@ int main(int argc, char** argv)
return zend_isnan(HUGE_VAL + -HUGE_VAL) ? 0 : 1;
#endif
}
-],[
+]])],[
ac_cv_huge_val_nan=yes
],[
ac_cv_huge_val_nan=no
@@ -603,3 +596,21 @@ dnl This is the most probable fallback so we assume yes in case of cross compile
if test "$ac_cv_huge_val_nan" = "yes"; then
AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
fi
+
+dnl
+dnl Check whether __cpuid_count is available
+dnl
+AC_CACHE_CHECK(whether __cpuid_count is available, ac_cv_cpuid_count_available, [
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #include <cpuid.h>
+]], [[
+ unsigned eax, ebx, ecx, edx;
+ __cpuid_count(0, 0, eax, ebx, ecx, edx);
+]])], [
+ ac_cv_cpuid_count_available=yes
+], [
+ ac_cv_cpuid_count_available=no
+])])
+if test "$ac_cv_cpuid_count_available" = "yes"; then
+ AC_DEFINE([HAVE_CPUID_COUNT], 1, [whether __cpuid_count is available])
+fi
diff --git a/Zend/ZendCore.dep b/Zend/ZendCore.dep
deleted file mode 100644
index 39a5c0fb0b..0000000000
--- a/Zend/ZendCore.dep
+++ /dev/null
@@ -1,258 +0,0 @@
-# Microsoft Developer Studio Generated Dependency File, included by ZendCore.mak
-
-.\zend_alloc.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
-
-
-.\alloca.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_config.w32.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_compile.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_modules.h"\
- ".\zend_operators.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_API.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
-
-
-.\zend_constants.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend_constants.h"\
- ".\zend_operators.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_execute.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_constants.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_modules.h"\
- ".\zend_operators.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_API.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
-
-
-.\zend_highlight.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_execute.h"\
- ".\zend_highlight.h"\
- ".\zend_llist.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_language_parser.tab.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
-
-
-.\zend_llist.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend_llist.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_opcode.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_modules.h"\
- ".\zend_operators.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_API.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
-
-
-.\zend_operators.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_operators.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
-
-
-.\zend_ptr_stack.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend_ptr_stack.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_stack.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend_stack.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_variables.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_constants.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_modules.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_API.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
- ".\zend_list.h"\
-
-
-.\zend.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend_operators.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_API.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_compile.h"\
- ".\zend_config.w32.h"\
- ".\zend_constants.h"\
- ".\zend_execute.h"\
- ".\zend_llist.h"\
- ".\zend_modules.h"\
- ".\zend_operators.h"\
- ".\zend_ptr_stack.h"\
- ".\zend_stack.h"\
- ".\zend_variables.h"\
- ".\zend.h"\
- ".\zend_API.h"\
- ".\zend_errors.h"\
- ".\zend_globals.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
- ".\zend_list.h"\
-
-
-.\zend_hash.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_config.w32.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
-
-
-.\zend_ini.c : \
- "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
- ".\zend_alloc.h"\
- ".\zend_config.w32.h"\
- ".\zend.h"\
- ".\zend_errors.h"\
- ".\zend_hash.h"\
- ".\zend_ini.h"\
-
-
-!IF "$(CFG)" == "ZendCore - Win32 Release"
-
-!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
-
-!ENDIF
-
-!IF "$(CFG)" == "ZendCore - Win32 Release"
-
-!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
-
-!ENDIF
-
-!IF "$(CFG)" == "ZendCore - Win32 Release"
-
-!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
-
-!ENDIF
-
-!IF "$(CFG)" == "ZendCore - Win32 Release"
-
-!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
-
-!ENDIF
-
diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4
index a8a4828e5a..f45a7a7c13 100644
--- a/Zend/acinclude.m4
+++ b/Zend/acinclude.m4
@@ -1,5 +1,3 @@
-dnl $Id$
-dnl
dnl This file contains local autoconf functions.
AC_DEFUN([LIBZEND_BISON_CHECK],[
@@ -46,16 +44,14 @@ AC_DEFUN([LIBZEND_BISON_CHECK],[
AC_DEFUN([ZEND_FP_EXCEPT],[
AC_CACHE_CHECK(whether fp_except is defined, ac_cv_type_fp_except,[
- AC_TRY_COMPILE([
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <floatingpoint.h>
-],[
+]],[[
fp_except x = (fp_except) 0;
-],[
+]])],[
ac_cv_type_fp_except=yes
],[
ac_cv_type_fp_except=no
-],[
- ac_cv_type_fp_except=no
])])
if test "$ac_cv_type_fp_except" = "yes"; then
AC_DEFINE(HAVE_FP_EXCEPT, 1, [whether floatingpoint.h defines fp_except])
@@ -67,7 +63,7 @@ dnl Check for broken sprintf()
dnl
AC_DEFUN([AC_ZEND_BROKEN_SPRINTF],[
AC_CACHE_CHECK(whether sprintf is broken, ac_cv_broken_sprintf,[
- AC_TRY_RUN([main() {char buf[20];exit(sprintf(buf,"testing 123")!=11); }],[
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[main() {char buf[20];exit(sprintf(buf,"testing 123")!=11); }]])],[
ac_cv_broken_sprintf=no
],[
ac_cv_broken_sprintf=yes
@@ -91,8 +87,7 @@ AC_DEFUN([AC_ZEND_C_BIGENDIAN],
[AC_CACHE_CHECK([whether byte ordering is bigendian], ac_cv_c_bigendian_php,
[
ac_cv_c_bigendian_php=unknown
- AC_TRY_RUN(
- [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
int main(void)
{
short one = 1;
@@ -104,7 +99,7 @@ int main(void)
return(1);
}
}
- ], [ac_cv_c_bigendian_php=yes], [ac_cv_c_bigendian_php=no], [ac_cv_c_bigendian_php=unknown])
+ ]])], [ac_cv_c_bigendian_php=yes], [ac_cv_c_bigendian_php=no], [ac_cv_c_bigendian_php=unknown])
])
if test $ac_cv_c_bigendian_php = yes; then
AC_DEFINE(WORDS_BIGENDIAN, 1, [Define if processor uses big-endian word])
@@ -119,9 +114,9 @@ dnl x87 floating point internal precision control checks
dnl See: http://wiki.php.net/rfc/rounding
AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
AC_MSG_CHECKING([for usable _FPU_SETCW])
- AC_TRY_LINK([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <fpu_control.h>
- ],[
+ ]],[[
fpu_control_t fpu_oldcw, fpu_cw;
volatile double result;
double a = 2877.0;
@@ -132,7 +127,7 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
_FPU_SETCW(fpu_cw);
result = a / b;
_FPU_SETCW(fpu_oldcw);
- ], [ac_cfp_have__fpu_setcw=yes], [ac_cfp_have__fpu_setcw=no])
+ ]])],[ac_cfp_have__fpu_setcw=yes],[ac_cfp_have__fpu_setcw=no])
if test "$ac_cfp_have__fpu_setcw" = "yes" ; then
AC_DEFINE(HAVE__FPU_SETCW, 1, [whether _FPU_SETCW is present and usable])
AC_MSG_RESULT(yes)
@@ -141,9 +136,9 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
fi
AC_MSG_CHECKING([for usable fpsetprec])
- AC_TRY_LINK([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <machine/ieeefp.h>
- ],[
+ ]],[[
fp_prec_t fpu_oldprec;
volatile double result;
double a = 2877.0;
@@ -153,7 +148,7 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
fpsetprec(FP_PD);
result = a / b;
fpsetprec(fpu_oldprec);
- ], [ac_cfp_have_fpsetprec=yes], [ac_cfp_have_fpsetprec=no])
+ ]])], [ac_cfp_have_fpsetprec=yes], [ac_cfp_have_fpsetprec=no])
if test "$ac_cfp_have_fpsetprec" = "yes" ; then
AC_DEFINE(HAVE_FPSETPREC, 1, [whether fpsetprec is present and usable])
AC_MSG_RESULT(yes)
@@ -162,9 +157,9 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
fi
AC_MSG_CHECKING([for usable _controlfp])
- AC_TRY_LINK([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <float.h>
- ],[
+ ]],[[
unsigned int fpu_oldcw;
volatile double result;
double a = 2877.0;
@@ -174,7 +169,7 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
_controlfp(_PC_53, _MCW_PC);
result = a / b;
_controlfp(fpu_oldcw, _MCW_PC);
- ], [ac_cfp_have__controlfp=yes], [ac_cfp_have__controlfp=no])
+ ]])], [ac_cfp_have__controlfp=yes], [ac_cfp_have__controlfp=no])
if test "$ac_cfp_have__controlfp" = "yes" ; then
AC_DEFINE(HAVE__CONTROLFP, 1, [whether _controlfp is present usable])
AC_MSG_RESULT(yes)
@@ -183,9 +178,9 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
fi
AC_MSG_CHECKING([for usable _controlfp_s])
- AC_TRY_LINK([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <float.h>
- ],[
+ ]],[[
unsigned int fpu_oldcw, fpu_cw;
volatile double result;
double a = 2877.0;
@@ -196,7 +191,7 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
_controlfp_s(&fpu_cw, _PC_53, _MCW_PC);
result = a / b;
_controlfp_s(&fpu_cw, fpu_oldcw, _MCW_PC);
- ], [ac_cfp_have__controlfp_s=yes], [ac_cfp_have__controlfp_s=no])
+ ]])], [ac_cfp_have__controlfp_s=yes], [ac_cfp_have__controlfp_s=no])
if test "$ac_cfp_have__controlfp_s" = "yes" ; then
AC_DEFINE(HAVE__CONTROLFP_S, 1, [whether _controlfp_s is present and usable])
AC_MSG_RESULT(yes)
@@ -205,9 +200,9 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
fi
AC_MSG_CHECKING([whether FPU control word can be manipulated by inline assembler])
- AC_TRY_LINK([
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
/* nothing */
- ],[
+ ]],[[
unsigned int oldcw, cw;
volatile double result;
double a = 2877.0;
@@ -220,7 +215,7 @@ AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
result = a / b;
__asm__ __volatile__ ("fldcw %0" : : "m" (*&oldcw));
- ], [ac_cfp_have_fpu_inline_asm_x86=yes], [ac_cfp_have_fpu_inline_asm_x86=no])
+ ]])], [ac_cfp_have_fpu_inline_asm_x86=yes], [ac_cfp_have_fpu_inline_asm_x86=no])
if test "$ac_cfp_have_fpu_inline_asm_x86" = "yes" ; then
AC_DEFINE(HAVE_FPU_INLINE_ASM_X86, 1, [whether FPU control word can be manipulated by inline assembler])
AC_MSG_RESULT(yes)
diff --git a/Zend/bench.php b/Zend/bench.php
index c694361870..a6c0c6daed 100644
--- a/Zend/bench.php
+++ b/Zend/bench.php
@@ -345,22 +345,22 @@ function strcat($n) {
/*****/
-function getmicrotime()
+function gethrtime()
{
- $t = gettimeofday();
- return ($t['sec'] + $t['usec'] / 1000000);
+ $hrtime = hrtime();
+ return (($hrtime[0]*1000000000 + $hrtime[1]) / 1000000000);
}
function start_test()
{
ob_start();
- return getmicrotime();
+ return gethrtime();
}
function end_test($start, $name)
{
global $total;
- $end = getmicrotime();
+ $end = gethrtime();
ob_end_clean();
$total += $end-$start;
$num = number_format($end-$start,3);
@@ -368,7 +368,7 @@ function end_test($start, $name)
echo $name.$pad.$num."\n";
ob_start();
- return getmicrotime();
+ return gethrtime();
}
function total()
@@ -418,5 +418,5 @@ sieve(30);
$t = end_test($t, "sieve(30)");
strcat(200000);
$t = end_test($t, "strcat(200000)");
-total($t0, "Total");
+total();
?>
diff --git a/Zend/build.mk b/Zend/build.mk
index b3313a2de9..ef14b65e65 100644
--- a/Zend/build.mk
+++ b/Zend/build.mk
@@ -4,8 +4,6 @@
# make -f build.mk
#
# Written by Sascha Schumann
-#
-# $Id$
LT_TARGETS = ltmain.sh ltconfig
diff --git a/Zend/configure.ac b/Zend/configure.ac
index b95c1360b8..73a001a7df 100644
--- a/Zend/configure.ac
+++ b/Zend/configure.ac
@@ -1,4 +1,3 @@
-dnl $Id$
dnl Process this file with autoconf to produce a configure script.
AC_INIT(zend.c)
@@ -126,7 +125,8 @@ LIBZEND_OTHER_CHECKS
ZEND_EXTRA_LIBS="$LIBS"
LIBS=""
AC_SUBST(ZEND_EXTRA_LIBS)
-AC_OUTPUT(Makefile)
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
# Local Variables:
# tab-width: 4
diff --git a/Zend/header b/Zend/header
index f18d8e04ee..83353ee051 100644
--- a/Zend/header
+++ b/Zend/header
@@ -15,5 +15,3 @@
| Authors: |
+----------------------------------------------------------------------+
*/
-
-/* $Id$ */
diff --git a/Zend/micro_bench.php b/Zend/micro_bench.php
index ef6dd4f7b2..42f1110c88 100644
--- a/Zend/micro_bench.php
+++ b/Zend/micro_bench.php
@@ -238,23 +238,23 @@ function empty_loop($n) {
}
}
-function getmicrotime()
+function gethrtime()
{
- $t = gettimeofday();
- return ($t['sec'] + $t['usec'] / 1000000);
+ $hrtime = hrtime();
+ return (($hrtime[0]*1000000000 + $hrtime[1]) / 1000000000);
}
function start_test()
{
ob_start();
- return getmicrotime();
+ return gethrtime();
}
function end_test($start, $name, $overhead = null)
{
global $total;
global $last_time;
- $end = getmicrotime();
+ $end = gethrtime();
ob_end_clean();
$last_time = $end-$start;
$total += $last_time;
@@ -267,7 +267,7 @@ function end_test($start, $name, $overhead = null)
echo $name.$pad.$num." ".$num2."\n";
}
ob_start();
- return getmicrotime();
+ return gethrtime();
}
function total()
diff --git a/Zend/tests/008.phpt b/Zend/tests/008.phpt
index 5addbbdecb..0766c3e1a4 100644
--- a/Zend/tests/008.phpt
+++ b/Zend/tests/008.phpt
@@ -14,7 +14,8 @@ var_dump(define("[[[", 2));
var_dump(define("test const", 3));
var_dump(define("test const", 3));
var_dump(define("test", array(1)));
-var_dump(define("test1", new stdclass));
+var_dump(define("test1", fopen(__FILE__, 'r')));
+var_dump(define("test2", new stdclass));
var_dump(constant(" "));
var_dump(constant("[[["));
@@ -30,7 +31,7 @@ Warning: define() expects at least 2 parameters, 1 given in %s on line %d
NULL
bool(true)
-Warning: define() expects parameter 3 to be boolean, array given in %s on line %d
+Warning: define() expects parameter 3 to be bool, array given in %s on line %d
NULL
Warning: define() expects parameter 1 to be string, array given in %s on line %d
@@ -42,8 +43,9 @@ bool(true)
Notice: Constant test const already defined in %s on line %d
bool(false)
bool(true)
+bool(true)
-Warning: Constants may only evaluate to scalar values or arrays in %s on line %d
+Warning: Constants may only evaluate to scalar values, arrays or resources in %s on line %d
bool(false)
int(1)
int(2)
diff --git a/Zend/tests/010.phpt b/Zend/tests/010.phpt
index d38f8adda5..eef3bc594f 100644
--- a/Zend/tests/010.phpt
+++ b/Zend/tests/010.phpt
@@ -41,7 +41,7 @@ var_dump(get_parent_class(1));
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
bool(false)
bool(false)
string(3) "foo"
diff --git a/Zend/tests/ErrorException_getSeverity.phpt b/Zend/tests/ErrorException_getSeverity.phpt
index 873ea68f6f..2673065a87 100644
--- a/Zend/tests/ErrorException_getSeverity.phpt
+++ b/Zend/tests/ErrorException_getSeverity.phpt
@@ -862,7 +862,7 @@ try {
}
?>
---EXPECTF--
+--EXPECT--
This exception severity is: 1bool(true)
bool(true)
bool(true)
diff --git a/Zend/tests/abstract-static.phpt b/Zend/tests/abstract-static.phpt
index 997661e71f..2f9bc9a1fd 100644
--- a/Zend/tests/abstract-static.phpt
+++ b/Zend/tests/abstract-static.phpt
@@ -8,5 +8,5 @@ abstract class TestClass
}
?>
===DONE===
---EXPECTF--
+--EXPECT--
===DONE===
diff --git a/Zend/tests/access_modifiers_011.phpt b/Zend/tests/access_modifiers_011.phpt
index 634aa50414..23846fc040 100644
--- a/Zend/tests/access_modifiers_011.phpt
+++ b/Zend/tests/access_modifiers_011.phpt
@@ -32,7 +32,7 @@ echo $a->func1(),"\n";
echo $a->func2(),"\n";
?>
---EXPECTF--
+--EXPECT--
var1 value
var2 value
in func1
diff --git a/Zend/tests/access_modifiers_012.phpt b/Zend/tests/access_modifiers_012.phpt
index ac4d72ce1d..86f678634b 100644
--- a/Zend/tests/access_modifiers_012.phpt
+++ b/Zend/tests/access_modifiers_012.phpt
@@ -15,7 +15,7 @@ call_user_func(array($c, 'none'));
call_user_func(array($c, 'prot'));
call_user_func(array($c, 'priv'));
?>
---EXPECTF--
+--EXPECT--
In __call() for method none()
In __call() for method prot()
In __call() for method priv()
diff --git a/Zend/tests/add_001.phpt b/Zend/tests/add_001.phpt
index 5286bc5b3c..af22e0df43 100644
--- a/Zend/tests/add_001.phpt
+++ b/Zend/tests/add_001.phpt
@@ -29,7 +29,7 @@ var_dump($c);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
array(3) {
[0]=>
int(1)
diff --git a/Zend/tests/add_002.phpt b/Zend/tests/add_002.phpt
index ec3843fae0..de0a3e8a63 100644
--- a/Zend/tests/add_002.phpt
+++ b/Zend/tests/add_002.phpt
@@ -20,11 +20,11 @@ var_dump($c);
echo "Done\n";
?>
--EXPECTF--
-Notice: Object of class stdClass could not be converted to int in %sadd_002.php on line %d
+Notice: Object of class stdClass could not be converted to number in %sadd_002.php on line %d
Exception: Unsupported operand types
-Notice: Object of class stdClass could not be converted to int in %s on line %d
+Notice: Object of class stdClass could not be converted to number in %s on line %d
Fatal error: Uncaught Error: Unsupported operand types in %s:%d
Stack trace:
diff --git a/Zend/tests/add_003.phpt b/Zend/tests/add_003.phpt
index 5f3c328c01..f0066ee3cd 100644
--- a/Zend/tests/add_003.phpt
+++ b/Zend/tests/add_003.phpt
@@ -20,11 +20,11 @@ var_dump($c);
echo "Done\n";
?>
--EXPECTF--
-Notice: Object of class stdClass could not be converted to int in %sadd_003.php on line %d
+Notice: Object of class stdClass could not be converted to number in %sadd_003.php on line %d
Exception: Unsupported operand types
-Notice: Object of class stdClass could not be converted to int in %s on line %d
+Notice: Object of class stdClass could not be converted to number in %s on line %d
Fatal error: Uncaught Error: Unsupported operand types in %s:%d
Stack trace:
diff --git a/Zend/tests/add_005.phpt b/Zend/tests/add_005.phpt
index af84c01da9..f5c20124cc 100644
--- a/Zend/tests/add_005.phpt
+++ b/Zend/tests/add_005.phpt
@@ -16,7 +16,7 @@ var_dump($c);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
float(2834756759.1231)
float(2834756759.1231)
Done
diff --git a/Zend/tests/and_001.phpt b/Zend/tests/and_001.phpt
index 0ebbc25fec..c49af66a20 100644
--- a/Zend/tests/and_001.phpt
+++ b/Zend/tests/and_001.phpt
@@ -30,7 +30,7 @@ var_dump($s);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(3) "020"
string(4) "pead"
string(4) "pead"
diff --git a/Zend/tests/anon/002.phpt b/Zend/tests/anon/002.phpt
index cbd2ac6d89..80a91eed78 100644
--- a/Zend/tests/anon/002.phpt
+++ b/Zend/tests/anon/002.phpt
@@ -15,6 +15,6 @@ $a = new class extends A implements B {
};
var_dump($a instanceof A, $a instanceof B);
---EXPECTF--
+--EXPECT--
bool(true)
bool(true)
diff --git a/Zend/tests/anon/013.phpt b/Zend/tests/anon/013.phpt
index 72ba3d61b7..b66be660d7 100644
--- a/Zend/tests/anon/013.phpt
+++ b/Zend/tests/anon/013.phpt
@@ -10,6 +10,6 @@ $foo = function() {
$closure = Closure::bind($foo, $class, $class);
var_dump($closure());
?>
---EXPECTF--
+--EXPECT--
object(class@anonymous)#1 (0) {
}
diff --git a/Zend/tests/anon/014.phpt b/Zend/tests/anon/014.phpt
index cacac47857..195a6054b2 100644
--- a/Zend/tests/anon/014.phpt
+++ b/Zend/tests/anon/014.phpt
@@ -12,5 +12,5 @@ $class = new class() {
};
var_dump($class->run());
?>
---EXPECTF--
+--EXPECT--
string(10) "Running..."
diff --git a/Zend/tests/arg_unpack/by_ref.phpt b/Zend/tests/arg_unpack/by_ref.phpt
index 7c8a86be48..66685a78d9 100644
--- a/Zend/tests/arg_unpack/by_ref.phpt
+++ b/Zend/tests/arg_unpack/by_ref.phpt
@@ -50,7 +50,7 @@ test2($a, $b, $c, $d, ...$array);
var_dump($a, $b, $c, $d, $array);
?>
---EXPECTF--
+--EXPECT--
array(3) {
[0]=>
int(2)
diff --git a/Zend/tests/arg_unpack/non_integer_keys.phpt b/Zend/tests/arg_unpack/non_integer_keys.phpt
new file mode 100644
index 0000000000..19ed61f2ee
--- /dev/null
+++ b/Zend/tests/arg_unpack/non_integer_keys.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Argument unpacking does not work with non-integer keys
+--FILE--
+<?php
+function foo(...$args) {
+ var_dump($args);
+}
+function gen() {
+ yield 1.23 => 123;
+ yield "2.34" => 234;
+}
+
+try {
+ foo(...gen());
+} catch (Error $ex) {
+ echo "Exception: " . $ex->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Exception: Cannot unpack Traversable with non-integer keys
diff --git a/Zend/tests/arg_unpack/string_keys.phpt b/Zend/tests/arg_unpack/string_keys.phpt
index e448a417f6..c2913db5b4 100644
--- a/Zend/tests/arg_unpack/string_keys.phpt
+++ b/Zend/tests/arg_unpack/string_keys.phpt
@@ -19,6 +19,6 @@ try {
}
?>
---EXPECTF--
+--EXPECT--
string(36) "Cannot unpack array with string keys"
string(42) "Cannot unpack Traversable with string keys"
diff --git a/Zend/tests/argument_restriction_004.phpt b/Zend/tests/argument_restriction_004.phpt
index fab5227764..8313d6908c 100644
--- a/Zend/tests/argument_restriction_004.phpt
+++ b/Zend/tests/argument_restriction_004.phpt
@@ -14,4 +14,4 @@ class Sub extends Base {
}
}
?>
---EXPECTF--
+--EXPECT--
diff --git a/Zend/tests/assert/expect_001.phpt b/Zend/tests/assert/expect_001.phpt
index 667c55b4fc..73c685d2c8 100644
--- a/Zend/tests/assert/expect_001.phpt
+++ b/Zend/tests/assert/expect_001.phpt
@@ -8,5 +8,5 @@ assert.exception=1
assert(true);
var_dump(true);
?>
---EXPECTF--
+--EXPECT--
bool(true)
diff --git a/Zend/tests/assert/expect_019.phpt b/Zend/tests/assert/expect_019.phpt
index 38e9a39c33..97dd6ce86c 100644
--- a/Zend/tests/assert/expect_019.phpt
+++ b/Zend/tests/assert/expect_019.phpt
@@ -12,7 +12,7 @@ var_dump(\assert(true));
var_dump(assert(false));
var_dump(assert(true));
?>
---EXPECTF--
+--EXPECT--
bool(true)
bool(true)
bool(true)
diff --git a/Zend/tests/assert/expect_empty_stmt_bug.phpt b/Zend/tests/assert/expect_empty_stmt_bug.phpt
index f5dcff3ba5..853a5ccaf3 100644
--- a/Zend/tests/assert/expect_empty_stmt_bug.phpt
+++ b/Zend/tests/assert/expect_empty_stmt_bug.phpt
@@ -3,7 +3,7 @@ Empty statement in assert() shouldn't segfault
--FILE--
<?php
-assert((function () { return true;; })());
+assert((function () { return true; })());
echo "ok";
?>
diff --git a/Zend/tests/assert/indirect_var_access_misoptimization.phpt b/Zend/tests/assert/indirect_var_access_misoptimization.phpt
index 6c05a8c607..02327f30c0 100644
--- a/Zend/tests/assert/indirect_var_access_misoptimization.phpt
+++ b/Zend/tests/assert/indirect_var_access_misoptimization.phpt
@@ -17,5 +17,5 @@ test();
--EXPECTF--
Deprecated: assert(): Calling assert() with a string argument is deprecated in %s on line %d
-Notice: Object of class stdClass could not be converted to int in %s on line %d
+Notice: Object of class stdClass could not be converted to number in %s on line %d
int(2)
diff --git a/Zend/tests/assign_ref_error_var_handling.phpt b/Zend/tests/assign_ref_error_var_handling.phpt
new file mode 100644
index 0000000000..ad01663131
--- /dev/null
+++ b/Zend/tests/assign_ref_error_var_handling.phpt
@@ -0,0 +1,25 @@
+--TEST--
+If the LHS of ref-assign ERRORs, that takes precendence over the "only variables" notice
+--FILE--
+<?php
+
+function val() {
+ return 42;
+}
+
+$str = "foo";
+$var = 24;
+var_dump($str->foo =& $var);
+var_dump($str);
+var_dump($str->foo =& val());
+var_dump($str);
+
+?>
+--EXPECTF--
+Warning: Attempt to modify property 'foo' of non-object in %s on line %d
+NULL
+string(3) "foo"
+
+Warning: Attempt to modify property 'foo' of non-object in %s on line %d
+NULL
+string(3) "foo"
diff --git a/Zend/tests/assign_ref_to_overloaded_prop.phpt b/Zend/tests/assign_ref_to_overloaded_prop.phpt
new file mode 100644
index 0000000000..e961b8bdf2
--- /dev/null
+++ b/Zend/tests/assign_ref_to_overloaded_prop.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Cannot assign by reference to overloaded object, even if __get() returns by-ref
+--FILE--
+<?php
+
+class Test {
+ private $x;
+ public function &__get($name) {
+ return $this->x;
+ }
+}
+
+$test = new Test;
+$y = 5;
+$test->x =& $y;
+var_dump($test->x);
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/assign_to_var_001.phpt b/Zend/tests/assign_to_var_001.phpt
index d4a2e549f4..c6b8c6298c 100644
--- a/Zend/tests/assign_to_var_001.phpt
+++ b/Zend/tests/assign_to_var_001.phpt
@@ -12,7 +12,7 @@ var_dump($var1);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(2)
int(2)
Done
diff --git a/Zend/tests/assign_to_var_002.phpt b/Zend/tests/assign_to_var_002.phpt
index 6926da83cc..5cb54dfbc2 100644
--- a/Zend/tests/assign_to_var_002.phpt
+++ b/Zend/tests/assign_to_var_002.phpt
@@ -12,7 +12,7 @@ var_dump($var1);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(1) "g"
string(1) "g"
Done
diff --git a/Zend/tests/assign_to_var_003.phpt b/Zend/tests/assign_to_var_003.phpt
index a0d8acbf29..b915c7231e 100644
--- a/Zend/tests/assign_to_var_003.phpt
+++ b/Zend/tests/assign_to_var_003.phpt
@@ -12,7 +12,7 @@ var_dump($var1);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
Done
diff --git a/Zend/tests/assign_to_var_004.phpt b/Zend/tests/assign_to_var_004.phpt
index 36258bc155..004dd4f299 100644
--- a/Zend/tests/assign_to_var_004.phpt
+++ b/Zend/tests/assign_to_var_004.phpt
@@ -15,7 +15,7 @@ var_dump($var2);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(5) "space"
string(5) "space"
string(5) "space"
diff --git a/Zend/tests/break_error_001.phpt b/Zend/tests/break_error_001.phpt
index eb8ce2efef..d823f50563 100644
--- a/Zend/tests/break_error_001.phpt
+++ b/Zend/tests/break_error_001.phpt
@@ -1,5 +1,5 @@
--TEST--
-'break' error (non positive numbers)
+'break' error (non positive integers)
--FILE--
<?php
function foo () {
@@ -7,4 +7,4 @@ function foo () {
}
?>
--EXPECTF--
-Fatal error: 'break' operator accepts only positive numbers in %sbreak_error_001.php on line 3
+Fatal error: 'break' operator accepts only positive integers in %sbreak_error_001.php on line 3
diff --git a/Zend/tests/break_error_002.phpt b/Zend/tests/break_error_002.phpt
index a1c172d198..e78fd7594e 100644
--- a/Zend/tests/break_error_002.phpt
+++ b/Zend/tests/break_error_002.phpt
@@ -1,5 +1,5 @@
--TEST--
-'break' error (operator with non-constant operand)
+'break' error (operator with non-integer operand)
--FILE--
<?php
function foo () {
@@ -7,4 +7,4 @@ function foo () {
}
?>
--EXPECTF--
-Fatal error: 'break' operator with non-constant operand is no longer supported in %sbreak_error_002.php on line 3
+Fatal error: 'break' operator with non-integer operand is no longer supported in %sbreak_error_002.php on line 3
diff --git a/Zend/tests/bug21478.phpt b/Zend/tests/bug21478.phpt
index 3e868ccaf9..8da1980400 100644
--- a/Zend/tests/bug21478.phpt
+++ b/Zend/tests/bug21478.phpt
@@ -1,9 +1,5 @@
--TEST--
Bug #21478 (Zend/zend_alloc.c :: shutdown_memory_manager produces segfault)
---SKIPIF--
-<?php
- if (!function_exists('stream_filter_register')) die('skip stream_filter_register() not available');
-?>
--FILE--
<?php
class debugfilter extends php_user_filter {
diff --git a/Zend/tests/bug22836.phpt b/Zend/tests/bug22836.phpt
index 205fd1c696..8141f178c6 100644
--- a/Zend/tests/bug22836.phpt
+++ b/Zend/tests/bug22836.phpt
@@ -13,7 +13,7 @@ for ($i = 0; $i < 8; $i++) {
$h =& f();
}
?>
---EXPECTF--
+--EXPECT--
string(3) "foo"
'foo'
string(3) "foo"
diff --git a/Zend/tests/bug26229.phpt b/Zend/tests/bug26229.phpt
index 5d99a152b9..cf23f157f8 100644
--- a/Zend/tests/bug26229.phpt
+++ b/Zend/tests/bug26229.phpt
@@ -24,6 +24,6 @@ catch(Exception $e)
}
?>
===DONE===
---EXPECTF--
+--EXPECT--
Objects returned by array_iterator::getIterator() must be traversable or implement interface Iterator
===DONE===
diff --git a/Zend/tests/bug26697.phpt b/Zend/tests/bug26697.phpt
index 8dda17028a..fe269c0364 100644
--- a/Zend/tests/bug26697.phpt
+++ b/Zend/tests/bug26697.phpt
@@ -13,7 +13,7 @@ var_dump(class_exists('NotExistingClass'));
?>
===DONE===
---EXPECTF--
+--EXPECT--
{closure}(NotExistingClass)
bool(false)
{closure}(NotExistingClass), done
diff --git a/Zend/tests/bug27669.phpt b/Zend/tests/bug27669.phpt
index 43591a9386..97b15590e2 100644
--- a/Zend/tests/bug27669.phpt
+++ b/Zend/tests/bug27669.phpt
@@ -2,8 +2,6 @@
Bug #27669 (PHP 5 didn't support all possibilities for calling static methods dynamically)
--FILE--
<?php
- error_reporting(E_ALL & !E_STRICT);
-
class A {
function hello() {
echo "Hello World\n";
@@ -14,5 +12,6 @@ Bug #27669 (PHP 5 didn't support all possibilities for calling static methods dy
?>
===DONE===
--EXPECTF--
+Deprecated: Non-static method A::hello() should not be called statically in %s on line %d
Hello World
===DONE===
diff --git a/Zend/tests/bug28442.phpt b/Zend/tests/bug28442.phpt
index 1237357cca..36a6fc6ab9 100644
--- a/Zend/tests/bug28442.phpt
+++ b/Zend/tests/bug28442.phpt
@@ -45,7 +45,7 @@ var_dump(ClassC::$prop);
?>
===DONE===
---EXPECTF--
+--EXPECT--
===INIT===
string(1) "A"
string(1) "C"
diff --git a/Zend/tests/bug29210.phpt b/Zend/tests/bug29210.phpt
index 3bae8064b9..db3a67bee6 100644
--- a/Zend/tests/bug29210.phpt
+++ b/Zend/tests/bug29210.phpt
@@ -89,7 +89,7 @@ if (is_callable(array('test_class','test_func4'))) {
$object = new foo();
$object->test();
?>
---EXPECTF--
+--EXPECT--
test_func1
test_func2
test_func3
diff --git a/Zend/tests/bug29368.phpt b/Zend/tests/bug29368.phpt
index c16399abbc..1987fa9b45 100644
--- a/Zend/tests/bug29368.phpt
+++ b/Zend/tests/bug29368.phpt
@@ -28,7 +28,7 @@ unset($bar);
?>
===DONE===
---EXPECTF--
+--EXPECT--
Foo::__construct
Caught exception!
===DONE===
diff --git a/Zend/tests/bug29883.phpt b/Zend/tests/bug29883.phpt
index b6ad99aeaf..4e07b02d10 100644
--- a/Zend/tests/bug29883.phpt
+++ b/Zend/tests/bug29883.phpt
@@ -4,10 +4,18 @@ Bug #29883 (isset gives invalid values on strings)
<?php
$x = "bug";
var_dump(isset($x[-10]));
+var_dump(isset($x[1]));
var_dump(isset($x["1"]));
-echo $x["1"]."\n";
+var_dump($x[-10])."\n";
+var_dump($x[1])."\n";
+var_dump($x["1"])."\n";
?>
---EXPECT--
+--EXPECTF--
bool(false)
bool(true)
-u
+bool(true)
+
+Notice: Uninitialized string offset: -10 in %s on line 6
+string(0) ""
+string(1) "u"
+string(1) "u"
diff --git a/Zend/tests/bug32290.phpt b/Zend/tests/bug32290.phpt
index 89da67b195..e73bca12ac 100644
--- a/Zend/tests/bug32290.phpt
+++ b/Zend/tests/bug32290.phpt
@@ -96,7 +96,7 @@ var_dump($x->doSomethingStatic(1));
?>
===DONE===
<?php exit(0); ?>
---EXPECTF--
+--EXPECT--
===A===
TestB::doSomething(1)
TestA::doSomething(2)
diff --git a/Zend/tests/bug33771.phpt b/Zend/tests/bug33771.phpt
index a8dca37080..0f3dd9815f 100644
--- a/Zend/tests/bug33771.phpt
+++ b/Zend/tests/bug33771.phpt
@@ -33,7 +33,7 @@ var_dump(error_reporting());
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(32767)
int(32767)
int(30719)
diff --git a/Zend/tests/bug36214.phpt b/Zend/tests/bug36214.phpt
index 630773713a..b2e3e5dd21 100644
--- a/Zend/tests/bug36214.phpt
+++ b/Zend/tests/bug36214.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #36214 (__get method works properly only when conditional operator is used)
---SKIPIF--
-<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
--FILE--
<?php
class context {
diff --git a/Zend/tests/bug36568.phpt b/Zend/tests/bug36568.phpt
index e837b7df59..57b5d507c2 100644
--- a/Zend/tests/bug36568.phpt
+++ b/Zend/tests/bug36568.phpt
@@ -1,9 +1,5 @@
--TEST--
Bug #36568 (memory_limit has no effect)
---SKIPIF--
-<?php
- if (!function_exists('memory_get_usage')) die('skip PHP is configured without memory_limit');
-?>
--INI--
memory_limit=16M
--FILE--
diff --git a/Zend/tests/bug37811.phpt b/Zend/tests/bug37811.phpt
index 299018363d..96645d0354 100644
--- a/Zend/tests/bug37811.phpt
+++ b/Zend/tests/bug37811.phpt
@@ -21,7 +21,7 @@ var_dump(Baz);
--EXPECTF--
string(3) "Foo"
-Warning: Constants may only evaluate to scalar values or arrays in %sbug37811.php on line %d
+Warning: Constants may only evaluate to scalar values, arrays or resources in %sbug37811.php on line %d
Warning: Use of undefined constant Baz - assumed 'Baz' (this will throw an Error in a future version of PHP) in %sbug37811.php on line %d
string(3) "Baz"
diff --git a/Zend/tests/bug40809.phpt b/Zend/tests/bug40809.phpt
index 9ff4e6f1b6..f0ba1d9753 100644
--- a/Zend/tests/bug40809.phpt
+++ b/Zend/tests/bug40809.phpt
@@ -2,7 +2,6 @@
Bug #40809 (Poor performance of ".=")
--FILE--
<?php
-error_reporting(E_ALL|E_STRICT);
$num_increments = 100;
$num_repeats = 1000;
diff --git a/Zend/tests/bug40815.phpt b/Zend/tests/bug40815.phpt
index cb38a5d971..3386097523 100644
--- a/Zend/tests/bug40815.phpt
+++ b/Zend/tests/bug40815.phpt
@@ -14,5 +14,5 @@ set_exception_handler("ehandle::exh");
throw new Exception ("Whiii");
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
foo
diff --git a/Zend/tests/bug41026.phpt b/Zend/tests/bug41026.phpt
index 3b8701d09d..e159ad36f6 100644
--- a/Zend/tests/bug41026.phpt
+++ b/Zend/tests/bug41026.phpt
@@ -20,7 +20,7 @@ try_class::main ();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
Done
Warning: (Registered shutdown functions) Unable to call self::on_shutdown() - function does not exist in Unknown on line 0
diff --git a/Zend/tests/bug41075.phpt b/Zend/tests/bug41075.phpt
index d0a77a548c..03cf3a42f3 100644
--- a/Zend/tests/bug41075.phpt
+++ b/Zend/tests/bug41075.phpt
@@ -26,6 +26,6 @@ try {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(40) "Creating default object from empty value"
Done
diff --git a/Zend/tests/bug42819.phpt b/Zend/tests/bug42819.phpt
index a8cff5f451..d0b5c0b2ee 100644
--- a/Zend/tests/bug42819.phpt
+++ b/Zend/tests/bug42819.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #42819 (namespaces in indexes of constant arrays)
---SKIPIF--
-<?php if (!extension_loaded("spl")) print "skip SPL extension required"; ?>
--FILE--
<?php
namespace foo\foo;
diff --git a/Zend/tests/bug43027.phpt b/Zend/tests/bug43027.phpt
index adecf3e39a..2cf2d1d6a5 100644
--- a/Zend/tests/bug43027.phpt
+++ b/Zend/tests/bug43027.phpt
@@ -6,5 +6,5 @@ declare(ticks=1);
namespace test;
echo "ok\n";
?>
---EXPECTF--
+--EXPECT--
ok
diff --git a/Zend/tests/bug43200_2.phpt b/Zend/tests/bug43200_2.phpt
index 3c8a98bddc..8926173aee 100644
--- a/Zend/tests/bug43200_2.phpt
+++ b/Zend/tests/bug43200_2.phpt
@@ -21,5 +21,5 @@ $o = new C();
$o->foo();
?>
---EXPECTF--
+--EXPECT--
works
diff --git a/Zend/tests/bug43344_3.phpt b/Zend/tests/bug43344_3.phpt
index 579ed81ada..5450759bcc 100644
--- a/Zend/tests/bug43344_3.phpt
+++ b/Zend/tests/bug43344_3.phpt
@@ -9,4 +9,8 @@ function f($a=Foo::bar) {
echo f()."\n";
?>
--EXPECTF--
-Fatal error: Class 'Foo\Foo' not found in %sbug43344_3.php on line %d
+Fatal error: Uncaught Error: Class 'Foo\Foo' not found in %s:%d
+Stack trace:
+#0 %s(%d): Foo\f()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug43344_4.phpt b/Zend/tests/bug43344_4.phpt
index 97e08b3664..c147766bf6 100644
--- a/Zend/tests/bug43344_4.phpt
+++ b/Zend/tests/bug43344_4.phpt
@@ -9,4 +9,8 @@ function f($a=array(Foo::bar)) {
echo f()."\n";
?>
--EXPECTF--
-Fatal error: Class 'Foo\Foo' not found in %sbug43344_4.php on line %d
+Fatal error: Uncaught Error: Class 'Foo\Foo' not found in %s:%d
+Stack trace:
+#0 %s(%d): Foo\f()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug43344_5.phpt b/Zend/tests/bug43344_5.phpt
index 645ef33e7f..8cc333fd31 100644
--- a/Zend/tests/bug43344_5.phpt
+++ b/Zend/tests/bug43344_5.phpt
@@ -10,4 +10,8 @@ function f($a=array(Foo::bar=>0)) {
echo f()."\n";
?>
--EXPECTF--
-Fatal error: Class 'Foo\Foo' not found in %sbug43344_5.php on line %d
+Fatal error: Uncaught Error: Class 'Foo\Foo' not found in %s:%d
+Stack trace:
+#0 %s(%d): Foo\f()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug43450.phpt b/Zend/tests/bug43450.phpt
index fc1db11087..05f2f7cbf6 100644
--- a/Zend/tests/bug43450.phpt
+++ b/Zend/tests/bug43450.phpt
@@ -1,12 +1,9 @@
--TEST--
Bug #43450 (Memory leak on some functions with implicit object __toString() call)
---SKIPIF--
-<?php if (!function_exists('memory_get_usage')) die('skip memory_get_usage() not installed'); ?>
--INI--
opcache.enable_cli=0
--FILE--
<?php
-error_reporting(E_ALL|E_STRICT);
class Foo
{
diff --git a/Zend/tests/bug45805.phpt b/Zend/tests/bug45805.phpt
index 6e95149663..d63e658868 100644
--- a/Zend/tests/bug45805.phpt
+++ b/Zend/tests/bug45805.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #45805 (Crash on throwing exception from error handler)
---SKIPIF--
-<?php extension_loaded('reflection') or die('skip'); ?>
--FILE--
<?php
class PHPUnit_Util_ErrorHandler
@@ -31,7 +29,7 @@ class B {
}
set_error_handler(
- array('PHPUnit_Util_ErrorHandler', 'handleError'), E_ALL | E_STRICT
+ array('PHPUnit_Util_ErrorHandler', 'handleError'), E_ALL
);
$o = new B;
diff --git a/Zend/tests/bug46196.phpt b/Zend/tests/bug46196.phpt
index 13695f8afa..7a6a753d87 100644
--- a/Zend/tests/bug46196.phpt
+++ b/Zend/tests/bug46196.phpt
@@ -23,7 +23,7 @@ function myErrorHandler($errno, $errstr, $errfile, $errline)
?>
===DONE===
---EXPECTF--
+--EXPECT--
*** Testing restore_error_handler() : error bug #46196 ***
NULL
bool(true)
diff --git a/Zend/tests/bug46304.phpt b/Zend/tests/bug46304.phpt
index e2e031116d..9898838907 100644
--- a/Zend/tests/bug46304.phpt
+++ b/Zend/tests/bug46304.phpt
@@ -40,6 +40,11 @@ print ns1\ns2\coNSt6 . "\n";
print NS1\ns2\coNSt1 . "\n";
?>
--EXPECTF--
+Deprecated: define(): Declaration of case-insensitive constants is deprecated in %s on line 6
+
+Deprecated: define(): Declaration of case-insensitive constants is deprecated in %s on line 7
+
+Deprecated: define(): Declaration of case-insensitive constants is deprecated in %s on line 8
value1
value1
value1
@@ -52,13 +57,23 @@ value3
value4
value4
value4
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS1\ns2\const4" in %s on line 25
value4
value5
value5
value5
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "ns1\ns2\const5" in %s on line 30
value5
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "ns1\NS2\coNSt6" in %s on line 32
value6
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "ns1\NS2\coNSt6" in %s on line 33
value6
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "ns1\NS2\coNSt6" in %s on line 34
value6
value6
diff --git a/Zend/tests/bug46665.phpt b/Zend/tests/bug46665.phpt
index 954dbfaefb..29491dc26c 100644
--- a/Zend/tests/bug46665.phpt
+++ b/Zend/tests/bug46665.phpt
@@ -13,4 +13,4 @@ new $baz();
?>
--EXPECTF--
-%string|unicode%(11) "Foo\Bar\Baz"
+string(11) "Foo\Bar\Baz"
diff --git a/Zend/tests/bug46811.phpt b/Zend/tests/bug46811.phpt
index 47ba59e415..88a9001e47 100644
--- a/Zend/tests/bug46811.phpt
+++ b/Zend/tests/bug46811.phpt
@@ -7,6 +7,6 @@ arg_separator.output=&
var_dump(ini_set("arg_separator.output", ""));
var_dump(ini_get("arg_separator.output"));
?>
---EXPECTF--
+--EXPECT--
bool(false)
string(1) "&"
diff --git a/Zend/tests/bug47353.phpt b/Zend/tests/bug47353.phpt
index aaf5a942a6..189b1f51a6 100644
--- a/Zend/tests/bug47353.phpt
+++ b/Zend/tests/bug47353.phpt
@@ -22,5 +22,5 @@ $a = new A();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/bug47981.phpt b/Zend/tests/bug47981.phpt
index c0fd69abf9..fba320bb13 100644
--- a/Zend/tests/bug47981.phpt
+++ b/Zend/tests/bug47981.phpt
@@ -13,5 +13,5 @@ interface a{}
class b implements a { function f($a=1) {}}
class c extends b {function f() {}}
?>
---EXPECTF--
+--EXPECT--
string(60) "Declaration of c::f() should be compatible with b::f($a = 1)"
diff --git a/Zend/tests/bug48215.phpt b/Zend/tests/bug48215.phpt
index 2e156ad7f3..4582057d98 100644
--- a/Zend/tests/bug48215.phpt
+++ b/Zend/tests/bug48215.phpt
@@ -28,7 +28,7 @@ $b = new B();
$b->A();
?>
===DONE===
---EXPECTF--
+--EXPECT--
B::__construct
A::__construct
B::A
diff --git a/Zend/tests/bug48770.phpt b/Zend/tests/bug48770.phpt
index 59b66641e0..6ae972a7ab 100644
--- a/Zend/tests/bug48770.phpt
+++ b/Zend/tests/bug48770.phpt
@@ -49,5 +49,5 @@ $c = new C;
$c->func('This should work!');
?>
---EXPECTF--
+--EXPECT--
string(26) "A::func: This should work!"
diff --git a/Zend/tests/bug50174.phpt b/Zend/tests/bug50174.phpt
index ac2ad2cb8d..6ed5733b67 100644
--- a/Zend/tests/bug50174.phpt
+++ b/Zend/tests/bug50174.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #50174 (Incorrectly matched docComment)
---SKIPIF--
-<?php if (!extension_loaded('reflection') || !extension_loaded('spl')) print "skip SPL and reflection extensions required"; ?>
--FILE--
<?php
diff --git a/Zend/tests/bug53632.phpt b/Zend/tests/bug53632.phpt
index d28a41b273..2b62f30dbf 100644
--- a/Zend/tests/bug53632.phpt
+++ b/Zend/tests/bug53632.phpt
@@ -6,5 +6,5 @@ $d = 2.2250738585072011e-308;
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/bug53748.phpt b/Zend/tests/bug53748.phpt
index 2f171fe455..77944ca198 100644
--- a/Zend/tests/bug53748.phpt
+++ b/Zend/tests/bug53748.phpt
@@ -30,7 +30,7 @@ $o= myHelloWorld::getInstance(array(1=>2));
$o= myHelloWorld::getInstance(array(1=>2));
?>
---EXPECTF--
+--EXPECT--
int(1)
int(2)
array(1) {
diff --git a/Zend/tests/bug54043.phpt b/Zend/tests/bug54043.phpt
new file mode 100644
index 0000000000..a8bbcf68cb
--- /dev/null
+++ b/Zend/tests/bug54043.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #54043: Remove inconsitency of internal exceptions and user defined exceptions
+--FILE--
+<?php
+
+$time = '9999-11-33'; // obviously invalid ;-)
+$timeZone = new DateTimeZone('UTC');
+
+try {
+ $dateTime = new DateTime($time, $timeZone);
+} catch (Exception $e) {
+ var_dump($e->getMessage());
+}
+
+var_dump(error_get_last());
+
+?>
+--EXPECT--
+string(105) "DateTime::__construct(): Failed to parse time string (9999-11-33) at position 9 (3): Unexpected character"
+NULL
diff --git a/Zend/tests/bug54624.phpt b/Zend/tests/bug54624.phpt
index 1d0c1ce87c..66239120a4 100644
--- a/Zend/tests/bug54624.phpt
+++ b/Zend/tests/bug54624.phpt
@@ -22,5 +22,5 @@ eval('
echo "DONE\n";
?>
---EXPECTF--
+--EXPECT--
DONE
diff --git a/Zend/tests/bug55135.phpt b/Zend/tests/bug55135.phpt
index f6d0aafaca..a1ffff21f9 100644
--- a/Zend/tests/bug55135.phpt
+++ b/Zend/tests/bug55135.phpt
@@ -19,7 +19,7 @@ unset($array[1]);
print_r($array);
$array = array(1 => 2);
-$a = 1;
+
unset($array["1"]);
print_r($array);
?>
diff --git a/Zend/tests/bug55137.phpt b/Zend/tests/bug55137.phpt
deleted file mode 100644
index 4a4e6e61a2..0000000000
--- a/Zend/tests/bug55137.phpt
+++ /dev/null
@@ -1,26 +0,0 @@
---TEST--
-Bug #55137 (Changing trait static method visibility)
---FILE--
-<?php
-
-trait A {
- protected static function foo() { echo "abc\n"; }
- private static function bar() { echo "def\n"; }
-}
-
-
-class B {
- use A {
- A::foo as public;
- A::bar as public baz;
- }
-}
-
-B::foo();
-B::baz();
-
-
-?>
---EXPECT--
-abc
-def
diff --git a/Zend/tests/bug55156.phpt b/Zend/tests/bug55156.phpt
index 99d2bbe765..53cdf1337a 100644
--- a/Zend/tests/bug55156.phpt
+++ b/Zend/tests/bug55156.phpt
@@ -26,7 +26,7 @@ namespace foo {
}
?>
---EXPECTF--
+--EXPECT--
bool(false)
string(12) "/** test1 */"
string(12) "/** test2 */"
diff --git a/Zend/tests/bug55445.phpt b/Zend/tests/bug55445.phpt
index 0f36ac5d88..2ccba5ff08 100644
--- a/Zend/tests/bug55445.phpt
+++ b/Zend/tests/bug55445.phpt
@@ -4,5 +4,5 @@ Bug #55445 (Lexer error with short open tags)
short_open_tag=0
--FILE--
<?php $u = "chris"; ?><p>Welcome <?= $u ?></p>
---EXPECTF--
+--EXPECT--
<p>Welcome chris</p>
diff --git a/Zend/tests/bug60536_002.phpt b/Zend/tests/bug60536_002.phpt
index 0d39693808..a69b33acff 100644
--- a/Zend/tests/bug60536_002.phpt
+++ b/Zend/tests/bug60536_002.phpt
@@ -2,7 +2,6 @@
The same rules are applied for properties that are defined in the class hierarchy. Thus, if the properties are compatible, a notice is issued, if not a fatal error occures. (relevant with #60536)
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
private $hello;
diff --git a/Zend/tests/bug60536_003.phpt b/Zend/tests/bug60536_003.phpt
index df3bc6cc1f..3ba23b9288 100644
--- a/Zend/tests/bug60536_003.phpt
+++ b/Zend/tests/bug60536_003.phpt
@@ -2,7 +2,6 @@
Properties should be initialized correctly (relevant to #60536)
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class BaseWithPropA {
private $hello = 0;
diff --git a/Zend/tests/bug60536_004.phpt b/Zend/tests/bug60536_004.phpt
index 324a90e55d..3a81b704c8 100644
--- a/Zend/tests/bug60536_004.phpt
+++ b/Zend/tests/bug60536_004.phpt
@@ -2,7 +2,6 @@
Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consitent with normal inheritance handling. (relevant to #60536)
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
private $hello;
@@ -29,7 +28,7 @@ class Notice extends Base {
}
echo "POST-CLASS-GUARD2\n";
?>
---EXPECTF--
+--EXPECT--
PRE-CLASS-GUARD
POST-CLASS-GUARD
POST-CLASS-GUARD2
diff --git a/Zend/tests/bug60536_005.phpt b/Zend/tests/bug60536_005.phpt
index b8aa07ccb4..6434e450ba 100644
--- a/Zend/tests/bug60536_005.phpt
+++ b/Zend/tests/bug60536_005.phpt
@@ -2,7 +2,6 @@
Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consitent with normal inheritance handling. (relevant to #60536)
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
protected $hello;
@@ -28,7 +27,7 @@ class Notice extends Base {
}
echo "POST-CLASS-GUARD2\n";
?>
---EXPECTF--
+--EXPECT--
PRE-CLASS-GUARD
POST-CLASS-GUARD
POST-CLASS-GUARD2
diff --git a/Zend/tests/bug61761.phpt b/Zend/tests/bug61761.phpt
index 24c69ae792..0409d67950 100644
--- a/Zend/tests/bug61761.phpt
+++ b/Zend/tests/bug61761.phpt
@@ -15,5 +15,5 @@ class B extends A
?>
==DONE==
---EXPECTF--
+--EXPECT--
==DONE==
diff --git a/Zend/tests/bug62892.phpt b/Zend/tests/bug62892.phpt
index 8c4bca992c..b4fb88f858 100644
--- a/Zend/tests/bug62892.phpt
+++ b/Zend/tests/bug62892.phpt
@@ -16,6 +16,6 @@ $class = new \ReflectionClass('myClass');
var_dump($class->getTraitAliases());
?>
---EXPECTF--
+--EXPECT--
array(0) {
}
diff --git a/Zend/tests/bug63055.phpt b/Zend/tests/bug63055.phpt
index 5efff9e5bd..c5b2c80871 100644
--- a/Zend/tests/bug63055.phpt
+++ b/Zend/tests/bug63055.phpt
@@ -21,5 +21,5 @@ $matches[2] = $dummy;
str_replace("foo", "bar", "foobar", $matches);
echo "okey";
?>
---EXPECTF--
+--EXPECT--
okey
diff --git a/Zend/tests/bug63217.phpt b/Zend/tests/bug63217.phpt
new file mode 100644
index 0000000000..ca9b900166
--- /dev/null
+++ b/Zend/tests/bug63217.phpt
@@ -0,0 +1,123 @@
+--TEST--
+Bug #63217 (Constant numeric strings become integers when used as ArrayAccess offset)
+--INI--
+opcache.enable_cli=1
+opcache.enable=1
+opcache.optimization_level=-1
+--FILE--
+<?php
+class Test implements ArrayAccess {
+ public function offsetExists($offset) {
+ echo "offsetExists given ";
+ var_dump($offset);
+ }
+ public function offsetUnset($offset) {
+ echo "offsetUnset given ";
+ var_dump($offset);
+ }
+ public function offsetSet($offset, $value) {
+ echo "offsetSet given ";
+ var_dump($offset);
+ }
+ public function offsetGet($offset) {
+ echo "offsetGet given ";
+ var_dump($offset);
+ }
+}
+
+$test = new Test;
+
+/* These should all produce string(...) "..." output and not int(...) */
+isset($test['0']);
+isset($test['123']);
+unset($test['0']);
+unset($test['123']);
+$test['0'] = true;
+$test['123'] = true;
+$foo = $test['0'];
+$foo = $test['123'];
+
+/* These caused the same bug, but in opcache rather than the compiler */
+isset($test[(string)'0']);
+isset($test[(string)'123']);
+unset($test[(string)'0']);
+unset($test[(string)'123']);
+$test[(string)'0'] = true;
+$test[(string)'123'] = true;
+$foo = $test[(string)'0'];
+$foo = $test[(string)'123'];
+
+/**
+ * @see https://github.com/php/php-src/pull/2607#issuecomment-313781748
+ */
+function test(): string {
+ $array["10"] = 42;
+ foreach ($array as $key => $value) {
+ return $key;
+ }
+}
+
+var_dump(test());
+
+/**
+ * Make sure we don't break arrays.
+ */
+$array = [];
+
+$key = '123';
+
+$array[$key] = 1;
+$array['321'] = 2;
+$array['abc'] = 3;
+
+var_dump($array);
+
+/**
+ * Make sure that we haven't broken ArrayObject
+ */
+$ao = new ArrayObject();
+
+$key = '123';
+
+$ao = [];
+$ao[$key] = 1;
+$ao['321'] = 2;
+$ao['abc'] = 3;
+
+var_dump($ao);
+
+?>
+--EXPECT--
+offsetExists given string(1) "0"
+offsetExists given string(3) "123"
+offsetUnset given string(1) "0"
+offsetUnset given string(3) "123"
+offsetSet given string(1) "0"
+offsetSet given string(3) "123"
+offsetGet given string(1) "0"
+offsetGet given string(3) "123"
+offsetExists given string(1) "0"
+offsetExists given string(3) "123"
+offsetUnset given string(1) "0"
+offsetUnset given string(3) "123"
+offsetSet given string(1) "0"
+offsetSet given string(3) "123"
+offsetGet given string(1) "0"
+offsetGet given string(3) "123"
+string(2) "10"
+array(3) {
+ [123]=>
+ int(1)
+ [321]=>
+ int(2)
+ ["abc"]=>
+ int(3)
+}
+array(3) {
+ [123]=>
+ int(1)
+ [321]=>
+ int(2)
+ ["abc"]=>
+ int(3)
+}
diff --git a/Zend/tests/bug63982.phpt b/Zend/tests/bug63982.phpt
index 31294f33e8..4318a5091c 100644
--- a/Zend/tests/bug63982.phpt
+++ b/Zend/tests/bug63982.phpt
@@ -10,6 +10,6 @@ $test = new Test();
var_dump(isset($test->protectedProperty));
var_dump(isset($test->protectedProperty->foo));
---EXPECTF--
+--EXPECT--
bool(false)
bool(false)
diff --git a/Zend/tests/bug64354.phpt b/Zend/tests/bug64354.phpt
index d881779df1..3746c1fef8 100644
--- a/Zend/tests/bug64354.phpt
+++ b/Zend/tests/bug64354.phpt
@@ -20,5 +20,5 @@ try {
var_dump($e->getMessage());
}
?>
---EXPECTF--
+--EXPECT--
string(9) "serialize"
diff --git a/Zend/tests/bug64578.phpt b/Zend/tests/bug64578.phpt
index 6cb5392cef..b4018e96a2 100644
--- a/Zend/tests/bug64578.phpt
+++ b/Zend/tests/bug64578.phpt
@@ -9,6 +9,6 @@ function x($s) { $s['a'] = 1; };
$y = '1';
x($y);
print_r($y);
---EXPECTF--
+--EXPECT--
string(25) "Illegal string offset 'a'"
1
diff --git a/Zend/tests/bug65419.phpt b/Zend/tests/bug65419.phpt
index 553bb5d939..0472f64de7 100644
--- a/Zend/tests/bug65419.phpt
+++ b/Zend/tests/bug65419.phpt
@@ -18,6 +18,6 @@ class ghi
ghi::def();
?>
---EXPECTF--
+--EXPECT--
ghi
ghi
diff --git a/Zend/tests/bug66015.phpt b/Zend/tests/bug66015.phpt
index 99003e6045..5e0815240d 100644
--- a/Zend/tests/bug66015.phpt
+++ b/Zend/tests/bug66015.phpt
@@ -25,7 +25,7 @@ $test = new Test();
?>
===DONE===
---EXPECTF--
+--EXPECT--
array (
1 => 'first',
2 => 'second',
diff --git a/Zend/tests/bug66218.phpt b/Zend/tests/bug66218.phpt
index af7a5ab1d0..d800605ac8 100644
--- a/Zend/tests/bug66218.phpt
+++ b/Zend/tests/bug66218.phpt
@@ -16,6 +16,6 @@ foreach ($fcts as $fct) {
}
?>
Done
---EXPECTF--
+--EXPECT--
dl Ok
Done
diff --git a/Zend/tests/bug66811.phpt b/Zend/tests/bug66811.phpt
index 6409ceb4ab..339e0a226c 100644
--- a/Zend/tests/bug66811.phpt
+++ b/Zend/tests/bug66811.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #66811: Cannot access static::class in lambda, writen outside of a class
+Bug #66811: Cannot access static::class in lambda, written outside of a class
--FILE--
<?php
class A {
diff --git a/Zend/tests/bug67368.phpt b/Zend/tests/bug67368.phpt
index c92e994b94..b3aff293a0 100644
--- a/Zend/tests/bug67368.phpt
+++ b/Zend/tests/bug67368.phpt
@@ -8,5 +8,5 @@ class FooBar {
const bar = ["bar" => 3]["bar"];
}
echo "okey";
---EXPECTF--
+--EXPECT--
okey
diff --git a/Zend/tests/bug67436/bug67436_nohandler.phpt b/Zend/tests/bug67436/bug67436_nohandler.phpt
index d7cd823b0d..d9e6e169ff 100644
--- a/Zend/tests/bug67436/bug67436_nohandler.phpt
+++ b/Zend/tests/bug67436/bug67436_nohandler.phpt
@@ -1,7 +1,5 @@
--TEST--
bug67436: E_STRICT instead of custom error handler
---INI--
-error_reporting=-1
--FILE--
<?php
diff --git a/Zend/tests/bug69221.phpt b/Zend/tests/bug69221.phpt
index 9eb5afcad8..72f242f995 100644
--- a/Zend/tests/bug69221.phpt
+++ b/Zend/tests/bug69221.phpt
@@ -20,5 +20,5 @@ unset($gen1);
foreach ($gen2 as $v) { var_dump($v); }
?>
---EXPECTF--
+--EXPECT--
int(1)
diff --git a/Zend/tests/bug69388.phpt b/Zend/tests/bug69388.phpt
index ce39eb0197..bf0c0a3c39 100644
--- a/Zend/tests/bug69388.phpt
+++ b/Zend/tests/bug69388.phpt
@@ -3,7 +3,6 @@ Bug #69388: Use after free on recursive calls to PHP compiler
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
function handle_error($code, $message, $file, $line, $context) {
if (!function_exists("bla")) {
eval('function bla($s) {echo "$s\n";}');
diff --git a/Zend/tests/bug69388_2.phpt b/Zend/tests/bug69388_2.phpt
index d597365bc8..b55153b492 100644
--- a/Zend/tests/bug69388_2.phpt
+++ b/Zend/tests/bug69388_2.phpt
@@ -2,7 +2,6 @@
Bug #69388 - Variation
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
function handle_error($code, $message, $file, $line, $context) {
eval('namespace Foo;');
echo "$message\n";
diff --git a/Zend/tests/bug69955.phpt b/Zend/tests/bug69955.phpt
index 33c36850c0..ece96a88ad 100644
--- a/Zend/tests/bug69955.phpt
+++ b/Zend/tests/bug69955.phpt
@@ -25,7 +25,7 @@ class C10 implements ArrayAccess
$c10 = new C10;
var_dump($c10[] += 5);
---EXPECTF--
+--EXPECT--
Inside C10::offsetGet
NULL
diff --git a/Zend/tests/bug70089.phpt b/Zend/tests/bug70089.phpt
index e1884d9dac..1bfc38ae09 100644
--- a/Zend/tests/bug70089.phpt
+++ b/Zend/tests/bug70089.phpt
@@ -30,7 +30,7 @@ try {
var_dump($e->getMessage());
}
?>
---EXPECTF--
+--EXPECT--
string(36) "Cannot use string offset as an array"
string(27) "Cannot unset string offsets"
string(41) "Only variables can be passed by reference"
diff --git a/Zend/tests/bug70958.phpt b/Zend/tests/bug70958.phpt
index b00d7aea81..faa75e0b16 100644
--- a/Zend/tests/bug70958.phpt
+++ b/Zend/tests/bug70958.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #70958 (Invalid opcode while using ::class as trait method paramater default value)
+Bug #70958 (Invalid opcode while using ::class as trait method parameter default value)
--FILE--
<?php
trait Foo
diff --git a/Zend/tests/bug70987.phpt b/Zend/tests/bug70987.phpt
index d31a1d2c6e..3c8dcc79c8 100644
--- a/Zend/tests/bug70987.phpt
+++ b/Zend/tests/bug70987.phpt
@@ -11,5 +11,5 @@ $bar = function () {
var_dump($bar->call(new foo));
?>
---EXPECTF--
+--EXPECT--
string(3) "foo"
diff --git a/Zend/tests/bug71756.phpt b/Zend/tests/bug71756.phpt
index 42066f3c2e..1f43c082f0 100644
--- a/Zend/tests/bug71756.phpt
+++ b/Zend/tests/bug71756.phpt
@@ -20,7 +20,7 @@ function c ($option) {
}
a(array('bla' => 'false'));
?>
---EXPECTF--
+--EXPECT--
array(1) {
["bla"]=>
string(7) "changed"
diff --git a/Zend/tests/bug72101.phpt b/Zend/tests/bug72101.phpt
index 8782b8e264..808627be3b 100644
--- a/Zend/tests/bug72101.phpt
+++ b/Zend/tests/bug72101.phpt
@@ -62,7 +62,7 @@ class Mock_MethodCallbackByReference_7b180d26 extends MethodCallbackByReference
set_error_handler(function() {
// var_dump(func_get_args());
DoesNotExists::$nope = true;
-}, E_ALL | E_STRICT);
+}, E_ALL);
$foo = new Mock_MethodCallbackByReference_7b180d26();
$InvMocker = new PHPUnit_Framework_MockObject_InvocationMocker();
diff --git a/Zend/tests/bug72221.phpt b/Zend/tests/bug72221.phpt
deleted file mode 100644
index 8f30099cab..0000000000
--- a/Zend/tests/bug72221.phpt
+++ /dev/null
@@ -1,11 +0,0 @@
---TEST--
-Bug #72221 (Segmentation fault in stream_get_line / zend_memnstr_ex)
---FILE--
-<?php
-$fp = fopen("php://memory", "r+");
-fwrite($fp, str_repeat("baad", 1024*1024));
-rewind($fp);
-stream_get_line($fp, 1024*1024*2, "aaaa");
-echo "Done\n";
---EXPECT--
-Done
diff --git a/Zend/tests/bug72543_5.phpt b/Zend/tests/bug72543_5.phpt
index 66b3b75f2a..dc2fcdafe2 100644
--- a/Zend/tests/bug72543_5.phpt
+++ b/Zend/tests/bug72543_5.phpt
@@ -5,6 +5,13 @@ Bug #72543.5 (different references behavior comparing to PHP 5)
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
+
+$obj = new stdClass;
+$obj->prop = 1;
+$ref =& $obj->prop;
+var_dump($obj->prop + ($obj->prop = 2));
+
?>
--EXPECT--
-int(4)
+int(3)
+int(3)
diff --git a/Zend/tests/bug72594.phpt b/Zend/tests/bug72594.phpt
index 3e88b2e6d6..c67e68e4ac 100644
--- a/Zend/tests/bug72594.phpt
+++ b/Zend/tests/bug72594.phpt
@@ -22,7 +22,7 @@ var_dump(get_object_vars($oldFoo));
$newFoo->bing($oldFoo);
?>
---EXPECTF--
+--EXPECT--
array(1) {
[0]=>
string(4) "bing"
diff --git a/Zend/tests/bug72911.phpt b/Zend/tests/bug72911.phpt
index 84f04eff1e..0d290caca7 100644
--- a/Zend/tests/bug72911.phpt
+++ b/Zend/tests/bug72911.phpt
@@ -12,6 +12,4 @@ var_dump($b);
?>
--EXPECTF--
Warning: Attempt to modify property 'b' of non-object in %sbug72911.php on line %d
-
-Warning: Attempt to assign property 'i' of non-object in %sbug72911.php on line %d
NULL
diff --git a/Zend/tests/bug73337.phpt b/Zend/tests/bug73337.phpt
index 9eff18e643..53ce963c52 100644
--- a/Zend/tests/bug73337.phpt
+++ b/Zend/tests/bug73337.phpt
@@ -6,7 +6,7 @@ class d { function __destruct() { throw new Exception; } }
try { new d + new d; } catch (Exception $e) { print "Exception properly caught\n"; }
?>
--EXPECTF--
-Notice: Object of class d could not be converted to int in %sbug73337.php on line 3
+Notice: Object of class d could not be converted to number in %sbug73337.php on line 3
-Notice: Object of class d could not be converted to int in %sbug73337.php on line 3
+Notice: Object of class d could not be converted to number in %sbug73337.php on line 3
Exception properly caught
diff --git a/Zend/tests/bug73753.phpt b/Zend/tests/bug73753.phpt
index 9a77f62f56..567bb9e01f 100644
--- a/Zend/tests/bug73753.phpt
+++ b/Zend/tests/bug73753.phpt
@@ -25,5 +25,5 @@ function traverse($a) {
$arr = array(1 => 'foo', 'b' => 'bar', 'baz');
var_dump(traverse($arr));
?>
---EXPECTF--
+--EXPECT--
string(3) "baz"
diff --git a/Zend/tests/bug73954.phpt b/Zend/tests/bug73954.phpt
index f911dd5834..fb0a6b8f3d 100644
--- a/Zend/tests/bug73954.phpt
+++ b/Zend/tests/bug73954.phpt
@@ -16,7 +16,7 @@ takes_int(log(tan(3.14)));
float(NAN)
bool(true)
-Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type integer, float given, called in %s on line 9 and defined in %s:6
+Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type int, float given, called in %s on line 9 and defined in %s:6
Stack trace:
#0 %s(9): takes_int(NAN)
#1 {main}
diff --git a/Zend/tests/bug74408.phpt b/Zend/tests/bug74408.phpt
index d530265d77..e770a51dc8 100644
--- a/Zend/tests/bug74408.phpt
+++ b/Zend/tests/bug74408.phpt
@@ -1,12 +1,8 @@
--TEST--
Bug #74408 (Endless loop bypassing execution time limit)
---INI--
-error_reporting = E_ALL | E_DEPRECATED | E_STRICT
--FILE--
<?php
- //php.ini: error_reporting = E_ALL | E_DEPRECATED | E_STRICT
-
class ErrorHandling {
public function error_handler($errno, $errstr, $errfile, $errline) {
diff --git a/Zend/tests/bug74603.phpt b/Zend/tests/bug74603.phpt
index b3194ecd48..5a5e40292e 100644
--- a/Zend/tests/bug74603.phpt
+++ b/Zend/tests/bug74603.phpt
@@ -1,9 +1,5 @@
--TEST--
Bug #74603 (PHP INI Parsing Stack Buffer Overflow Vulnerability)
---SKIPIF--
-<?php
-if (PHP_INT_MAX !== 2147483647)
- die('skip for 32-bit only');
--FILE--
<?php
var_dump(parse_ini_file(__DIR__ . "/bug74603.ini", true, INI_SCANNER_NORMAL));
diff --git a/Zend/tests/bug74947.phpt b/Zend/tests/bug74947.phpt
index e0615fc4a6..4119d3dd3a 100644
--- a/Zend/tests/bug74947.phpt
+++ b/Zend/tests/bug74947.phpt
@@ -8,5 +8,5 @@ echo 200000000000000000000000000000000000000000000000000000000000000000000000000
echo -200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
?>
---EXPECTF--
+--EXPECT--
INF-INF
diff --git a/Zend/tests/bug75218.phpt b/Zend/tests/bug75218.phpt
new file mode 100644
index 0000000000..ddbde62a52
--- /dev/null
+++ b/Zend/tests/bug75218.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #75218: Change remaining uncatchable fatal errors for parsing into ParseError
+--FILE--
+<?php
+
+function try_eval($code) {
+ try {
+ eval($code);
+ } catch (CompileError $e) {
+ echo $e->getMessage(), "\n";
+ }
+}
+
+try_eval('if (false) {class C { final final function foo($fff) {}}}');
+try_eval('if (false) {class C { private protected $x; }}');
+try_eval('if (true) { __HALT_COMPILER(); }');
+try_eval('declare(encoding=[]);');
+
+?>
+--EXPECT--
+Multiple final modifiers are not allowed
+Multiple access type modifiers are not allowed
+__HALT_COMPILER() can only be used from the outermost scope
+Encoding must be a literal
diff --git a/Zend/tests/bug76337.phpt b/Zend/tests/bug76337.phpt
deleted file mode 100644
index 07608e2660..0000000000
--- a/Zend/tests/bug76337.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-Bug 76337: segmentation fault when an extension use zend_register_class_alias() and opcache enabled
---SKIPIF--
-<?php if (!class_exists('_ZendTestClass') || !extension_loaded('Zend OPcache')) die('skip');
---INI--
-opcache.enable=1
-opcache.enable_cli=1
---FILE--
-<?php
-var_dump(class_exists('_ZendTestClassAlias'));
---EXPECT--
-bool(true)
diff --git a/Zend/tests/bug76439.phpt b/Zend/tests/bug76439.phpt
new file mode 100644
index 0000000000..0572e9f5c2
--- /dev/null
+++ b/Zend/tests/bug76439.phpt
@@ -0,0 +1,68 @@
+--TEST--
+Bug #76439: Don't always strip leading whitespace from heredoc T_ENCAPSED_AND_WHITESPACE tokens
+--FILE--
+<?php
+
+[$one, $two, $three, $four, $five, $six, $seven, $eight, $nine] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+
+var_dump(<<<BAR
+ $one-
+ BAR);
+
+var_dump(<<<BAR
+ $two -
+ BAR);
+
+var_dump(<<<BAR
+ $three -
+ BAR);
+
+var_dump(<<<BAR
+ $four-$four
+ BAR);
+
+var_dump(<<<BAR
+ $five-$five-
+ BAR);
+
+var_dump(<<<BAR
+ $six-$six-$six
+ BAR);
+
+var_dump(<<<BAR
+ $seven
+ -
+ BAR);
+
+var_dump(<<<BAR
+ $eight
+ -
+ BAR);
+
+var_dump(<<<BAR
+$nine
+BAR);
+
+var_dump(<<<BAR
+ -
+ BAR);
+
+var_dump(<<<BAR
+ -
+ BAR);
+
+?>
+--EXPECT--
+string(2) "1-"
+string(3) "2 -"
+string(3) "3 -"
+string(3) "4-4"
+string(4) "5-5-"
+string(5) "6-6-6"
+string(3) "7
+-"
+string(4) "8
+ -"
+string(1) "9"
+string(1) "-"
+string(2) " -"
diff --git a/Zend/tests/bug76439_2.phpt b/Zend/tests/bug76439_2.phpt
new file mode 100644
index 0000000000..c91303b392
--- /dev/null
+++ b/Zend/tests/bug76439_2.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #76439: Don't always strip leading whitespace from heredoc T_ENCAPSED_AND_WHITESPACE tokens (error case)
+--FILE--
+<?php
+
+$foo = 1;
+
+var_dump(<<<BAR
+ $foo
+$foo
+ BAR);
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 1) in %s on line 7
diff --git a/Zend/tests/bug76667.phpt b/Zend/tests/bug76667.phpt
new file mode 100644
index 0000000000..15dc34693d
--- /dev/null
+++ b/Zend/tests/bug76667.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #76667 (Segfault with divide-assign op and __get + __set)
+--FILE--
+<?php
+
+class T {
+ public function __get($k)
+ {
+ return $undefined->$k;
+ }
+
+ public function __set($k, $v)
+ {
+ return $this->$v /= 0;
+ }
+};
+
+$x = new T;
+$x->x = 1;
+?>
+--EXPECTF--
+Notice: Undefined variable: undefined in %sbug76667.php on line %d
+
+Notice: Trying to get property '1' of non-object in %sbug76667.php on line %d
+
+Warning: Division by zero in %sbug76667.php on line %d
+
+Notice: Undefined variable: undefined in %sbug76667.php on line %d
+
+Notice: Trying to get property 'NAN' of non-object in %sbug76667.php on line %d
+
+Warning: Division by zero in %sbug76667.php on line %d
+
+Notice: Undefined variable: undefined in %sbug76667.php on line %d
+
+Notice: Trying to get property 'NAN' of non-object in %sbug76667.php on line %d
+
+Warning: Division by zero in %sbug76667.php on line %d
diff --git a/Zend/tests/bug76752.phpt b/Zend/tests/bug76752.phpt
new file mode 100644
index 0000000000..dcdfeebeb9
--- /dev/null
+++ b/Zend/tests/bug76752.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Bug #76752 (Crash in ZEND_COALESCE_SPEC_TMP_HANDLER - assertion in _get_zval_ptr_tmp failed)
+--FILE--
+<?php
+$obj = new stdClass;
+$val = 'foo';
+$obj->prop = &$val;
+var_dump($obj->prop ?? []);
+?>
+--EXPECT--
+string(3) "foo"
diff --git a/Zend/tests/bug76869.phpt b/Zend/tests/bug76869.phpt
new file mode 100644
index 0000000000..ba963d4c4e
--- /dev/null
+++ b/Zend/tests/bug76869.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #76869 (Incorrect bypassing protected method accessibilty check)
+--FILE--
+<?php
+class A {
+ private function f() {
+ return "A";
+ }
+}
+class B extends A {
+ protected function f() {
+ return "B";
+ }
+}
+$b = new B();
+try {
+ var_dump($b->f());
+} catch (Throwable $e) {
+ echo "Exception: ", $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Exception: Call to protected method B::f() from context ''
diff --git a/Zend/tests/bug77291.phpt b/Zend/tests/bug77291.phpt
new file mode 100644
index 0000000000..2960648a7c
--- /dev/null
+++ b/Zend/tests/bug77291.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Bug #77291 (magic methods inherited from a trait may be ignored)
+--FILE--
+<?php
+
+trait AccessibleProperties
+{
+ public function __isset($property)
+ {
+ return property_exists($this, $property);
+ }
+
+ public function __get($property)
+ {
+ if (property_exists($this, $property)) {
+ return $this->$property;
+ }
+ }
+}
+
+class Foo4567 {
+ use AccessibleProperties;
+
+ protected $a = 'Some value';
+}
+
+class Foo45 {
+ use AccessibleProperties;
+
+ protected $a = 'Some value';
+}
+
+$foo = new Foo4567;
+var_dump(isset($foo->a));
+$foo = new Foo45;
+var_dump($foo->a);
+?>
+===DONE===
+--EXPECT--
+bool(true)
+string(10) "Some value"
+===DONE===
diff --git a/Zend/tests/bug77345_gc_1.phpt b/Zend/tests/bug77345_gc_1.phpt
new file mode 100644
index 0000000000..eabb94ce7d
--- /dev/null
+++ b/Zend/tests/bug77345_gc_1.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Bug #77345 (Segmentation faults stack overflow in cyclic garbage collector) (Bug #77427)
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+
+class Node
+{
+ /** @var Node */
+ public $previous;
+ /** @var Node */
+ public $next;
+}
+
+var_dump(gc_enabled());
+var_dump('start');
+
+$firstNode = new Node();
+$firstNode->previous = $firstNode;
+$firstNode->next = $firstNode;
+
+$circularDoublyLinkedList = $firstNode;
+
+for ($i = 0; $i < 200000; $i++) {
+ $currentNode = $circularDoublyLinkedList;
+ $nextNode = $circularDoublyLinkedList->next;
+
+ $newNode = new Node();
+
+ $newNode->previous = $currentNode;
+ $currentNode->next = $newNode;
+ $newNode->next = $nextNode;
+ $nextNode->previous = $newNode;
+
+ $circularDoublyLinkedList = $nextNode;
+}
+var_dump('end');
+--EXPECT--
+bool(true)
+string(5) "start"
+string(3) "end" \ No newline at end of file
diff --git a/Zend/tests/bug77345_gc_2.phpt b/Zend/tests/bug77345_gc_2.phpt
new file mode 100644
index 0000000000..9d39b6b969
--- /dev/null
+++ b/Zend/tests/bug77345_gc_2.phpt
@@ -0,0 +1,48 @@
+--TEST--
+Bug #77345 (Segmentation faults stack overflow in cyclic garbage collector) (Bug #77427)
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+
+class Node
+{
+ /** @var Node */
+ public $previous;
+ /** @var Node */
+ public $next;
+}
+
+var_dump(gc_enabled());
+var_dump('start');
+
+function xxx() {
+ $firstNode = new Node();
+ $firstNode->previous = $firstNode;
+ $firstNode->next = $firstNode;
+
+ $circularDoublyLinkedList = $firstNode;
+
+ for ($i = 0; $i < 300000; $i++) {
+ $currentNode = $circularDoublyLinkedList;
+ $nextNode = $circularDoublyLinkedList->next;
+
+ $newNode = new Node();
+
+ $newNode->previous = $currentNode;
+ $currentNode->next = $newNode;
+ $newNode->next = $nextNode;
+ $nextNode->previous = $newNode;
+
+ $circularDoublyLinkedList = $nextNode;
+ }
+}
+
+xxx();
+gc_collect_cycles();
+
+var_dump('end');
+--EXPECT--
+bool(true)
+string(5) "start"
+string(3) "end" \ No newline at end of file
diff --git a/Zend/tests/bug77376.phpt b/Zend/tests/bug77376.phpt
new file mode 100644
index 0000000000..4f6aec9ce9
--- /dev/null
+++ b/Zend/tests/bug77376.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #77376 ("undefined function" message no longer includes namespace)
+--FILE--
+<?php
+namespace Hello;
+World();
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Call to undefined function Hello\World() %sbug77376.php:%d
+Stack trace:
+#0 {main}
+ thrown in %sbug77376.php on line %d
diff --git a/Zend/tests/bug77922.phpt b/Zend/tests/bug77922.phpt
new file mode 100644
index 0000000000..2984f4c873
--- /dev/null
+++ b/Zend/tests/bug77922.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #77922: Double release of doc comment on inherited shadow property
+--FILE--
+<?php
+
+class A {
+ /** Foo */
+ private $prop;
+}
+
+class B extends A {
+}
+
+class C extends B {
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug78010.phpt b/Zend/tests/bug78010.phpt
new file mode 100644
index 0000000000..a9ebc37ef1
--- /dev/null
+++ b/Zend/tests/bug78010.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #78010: Segmentation fault during GC
+--INI--
+memory_limit=2G
+--FILE--
+<?php
+
+class foo
+{
+ public function __construct()
+ {
+ $this->x = $this;
+
+ for ($i = 0; $i < 898; $i++) { //Will not trigger with <898
+ $obj = [new stdClass, new stdClass]; //This must have at least 2 elements
+ $this->y[] = $obj;
+ }
+ }
+}
+
+for ($i = 0; $i < 2; ++$i) { //This must run >=2 (increasing the number of elements in the array *2 will not do)
+ $x = []; //This must be reset
+ foreach (array_fill(0, 389, 'x') as &$params) { //Will not trigger <389
+ $x[] = new foo;
+ }
+}
+
+echo "Completed\n";
+
+?>
+--EXPECT--
+Completed
diff --git a/Zend/tests/bug78271.phpt b/Zend/tests/bug78271.phpt
new file mode 100644
index 0000000000..70eba17467
--- /dev/null
+++ b/Zend/tests/bug78271.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #78271: Invalid result of if-else
+--FILE--
+<?php
+function test($a, $b){
+ if ($a==10) {
+ $w="x";
+ } else {
+ $w="y";
+ }
+
+ if ($b) {
+ $d1="none";
+ $d2="block";
+ } else {
+ $d1="block";
+ $d2="none";
+ }
+
+ echo $d2.$b."\n";
+
+}
+
+test(1, 1);
+?>
+--EXPECT--
+block1
diff --git a/Zend/tests/bug78363.phpt b/Zend/tests/bug78363.phpt
new file mode 100644
index 0000000000..0d17a1961c
--- /dev/null
+++ b/Zend/tests/bug78363.phpt
Binary files differ
diff --git a/Zend/tests/call_static_002.phpt b/Zend/tests/call_static_002.phpt
index 9604bf5b9f..ac30636ded 100644
--- a/Zend/tests/call_static_002.phpt
+++ b/Zend/tests/call_static_002.phpt
@@ -19,7 +19,7 @@ call_user_func(array($a, 'aAa'));
call_user_func(array('Foo', 'aAa'));
?>
---EXPECTF--
+--EXPECT--
nonstatic
string(3) "aAa"
static
diff --git a/Zend/tests/call_user_func_001.phpt b/Zend/tests/call_user_func_001.phpt
index d6ac94dd4d..15d0aec263 100644
--- a/Zend/tests/call_user_func_001.phpt
+++ b/Zend/tests/call_user_func_001.phpt
@@ -28,7 +28,7 @@ namespace testing {
?>
--EXPECTF--
-%string|unicode%(6) "foobar"
+string(6) "foobar"
Warning: call_user_func() expects parameter 1 to be a valid callback, cannot access private method testing\foo::priv() in %s on line %d
diff --git a/Zend/tests/call_user_func_005.phpt b/Zend/tests/call_user_func_005.phpt
index d4554d62e2..9305e5849c 100644
--- a/Zend/tests/call_user_func_005.phpt
+++ b/Zend/tests/call_user_func_005.phpt
@@ -19,7 +19,7 @@ var_dump(call_user_func(array('foo', 'teste')));
?>
--EXPECTF--
Deprecated: %son-static method foo::teste() should not be called statically in %s on line %d
-%string|unicode%(1) "x"
+string(1) "x"
array(1) {
[0]=>
object(Closure)#%d (1) {
diff --git a/Zend/tests/case_insensitive_constant_deprecation.phpt b/Zend/tests/case_insensitive_constant_deprecation.phpt
new file mode 100644
index 0000000000..e7a92c8c4c
--- /dev/null
+++ b/Zend/tests/case_insensitive_constant_deprecation.phpt
@@ -0,0 +1,127 @@
+--TEST--
+Case-insensitive constants are deprecated
+--FILE--
+<?php
+
+namespace {
+ define('FOO', 42, true); // Deprecated
+ define('NS\FOO', 24, true); // Deprecated
+
+ var_dump(FOO); // Ok
+ var_dump(foo); // Deprecated
+
+ var_dump(NS\FOO); // Ok
+ var_dump(ns\FOO); // Ok
+ var_dump(ns\foo); // Deprecated
+
+ var_dump(defined('FOO')); // Ok
+ var_dump(defined('foo')); // Ok
+ var_dump(defined('NS\FOO')); // Ok
+ var_dump(defined('ns\FOO')); // Ok
+ var_dump(defined('ns\foo')); // Ok
+
+ var_dump(constant('FOO')); // Ok
+ var_dump(constant('foo')); // Deprecated
+ var_dump(constant('NS\FOO')); // Ok
+ var_dump(constant('ns\FOO')); // Ok
+ var_dump(constant('ns\foo')); // Deprecated
+}
+
+namespace NS {
+ var_dump(FOO); // Ok
+ var_dump(foo); // Deprecated
+}
+
+namespace ns {
+ var_dump(FOO); // Ok
+ var_dump(foo); // Deprecated
+}
+
+namespace Other {
+ var_dump(FOO); // Ok
+ var_dump(foo); // Deprecated
+
+ var_dump(defined('FOO')); // Ok
+ var_dump(defined('foo')); // Ok
+ var_dump(defined('NS\FOO')); // Ok
+ var_dump(defined('ns\FOO')); // Ok
+ var_dump(defined('ns\foo')); // Ok
+
+ var_dump(constant('FOO')); // Ok
+ var_dump(constant('foo')); // Deprecated
+ var_dump(constant('NS\FOO')); // Ok
+ var_dump(constant('ns\FOO')); // Ok
+ var_dump(constant('ns\foo')); // Deprecated
+
+ const C1 = FOO; // Ok
+ var_dump(C1);
+ const C2 = foo; // Deprecated
+ var_dump(C2);
+ const C3 = 1 + FOO; // Ok
+ var_dump(C3);
+ const C4 = 1 + foo; // Deprecated
+ var_dump(C4);
+}
+
+?>
+--EXPECTF--
+Deprecated: define(): Declaration of case-insensitive constants is deprecated in %s on line 4
+
+Deprecated: define(): Declaration of case-insensitive constants is deprecated in %s on line 5
+int(42)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 8
+int(42)
+int(24)
+int(24)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS\FOO" in %s on line 12
+int(24)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+int(42)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 21
+int(42)
+int(24)
+int(24)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS\FOO" in %s on line 24
+int(24)
+int(24)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS\FOO" in %s on line 29
+int(24)
+int(24)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS\FOO" in %s on line 34
+int(24)
+int(42)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 39
+int(42)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+int(42)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 48
+int(42)
+int(24)
+int(24)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "NS\FOO" in %s on line 51
+int(24)
+int(42)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 55
+int(42)
+int(43)
+
+Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "FOO" in %s on line 59
+int(43)
diff --git a/Zend/tests/cast_to_bool.phpt b/Zend/tests/cast_to_bool.phpt
index e0edd35ded..ebb1df6dfd 100644
--- a/Zend/tests/cast_to_bool.phpt
+++ b/Zend/tests/cast_to_bool.phpt
@@ -36,7 +36,7 @@ foreach ($vars as $var) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
bool(true)
bool(true)
bool(false)
diff --git a/Zend/tests/class_alias_015.phpt b/Zend/tests/class_alias_015.phpt
deleted file mode 100644
index c79c077187..0000000000
--- a/Zend/tests/class_alias_015.phpt
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-Testing instantiation using namespace:: prefix
---FILE--
-<?php
-
-namespace foo;
-
-class bar {
-}
-
-class_alias('foo\bar', 'foo\baz');
-
-var_dump(new namespace\baz);
-
-?>
---EXPECTF--
-object(foo\bar)#%d (0) {
-}
diff --git a/Zend/tests/class_alias_017.phpt b/Zend/tests/class_alias_017.phpt
index f4d3626e45..555e776227 100644
--- a/Zend/tests/class_alias_017.phpt
+++ b/Zend/tests/class_alias_017.phpt
@@ -26,7 +26,7 @@ baz::test();
bar::test();
?>
---EXPECTF--
+--EXPECT--
foo
baz
foo
diff --git a/Zend/tests/class_constants_002.phpt b/Zend/tests/class_constants_002.phpt
index 726b9b8357..259c724372 100644
--- a/Zend/tests/class_constants_002.phpt
+++ b/Zend/tests/class_constants_002.phpt
@@ -28,4 +28,8 @@ int(1)
int(5)
int(10)
-Fatal error: Class 'NoSuchClass' not found in %s on line %d
+Fatal error: Uncaught Error: Class 'NoSuchClass' not found in %s:%d
+Stack trace:
+#0 %s(%d): bar()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/class_constants_003.phpt b/Zend/tests/class_constants_003.phpt
index d9f1236740..14222a4960 100644
--- a/Zend/tests/class_constants_003.phpt
+++ b/Zend/tests/class_constants_003.phpt
@@ -27,7 +27,7 @@ unlink($filename);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(1)
int(5)
Done
diff --git a/Zend/tests/class_constants_005.phpt b/Zend/tests/class_constants_005.phpt
new file mode 100644
index 0000000000..de53c2c0ca
--- /dev/null
+++ b/Zend/tests/class_constants_005.phpt
@@ -0,0 +1,12 @@
+--TEST--
+String interning during constants substitution
+--INI--
+opcache.enable_cli=0
+--FILE--
+<?php
+define ("A", "." . ord(26) . ".");
+eval("class A {const a = A;}");
+var_dump(A::a);
+?>
+--EXPECT--
+string(4) ".50."
diff --git a/Zend/tests/class_name_as_scalar.phpt b/Zend/tests/class_name_as_scalar.phpt
index 38e55b16d5..72a460abaa 100644
--- a/Zend/tests/class_name_as_scalar.phpt
+++ b/Zend/tests/class_name_as_scalar.phpt
@@ -51,7 +51,7 @@ namespace {
}
?>
---EXPECTF--
+--EXPECT--
In NS
string(11) "Foo\Bar\Moo"
Top
diff --git a/Zend/tests/class_properties_dynamic.phpt b/Zend/tests/class_properties_dynamic.phpt
index 8a1fc6f029..456bcf4a5b 100644
--- a/Zend/tests/class_properties_dynamic.phpt
+++ b/Zend/tests/class_properties_dynamic.phpt
@@ -9,5 +9,5 @@ class Foo {
}
echo (new Foo)->bar;
?>
---EXPECTF--
+--EXPECT--
3
diff --git a/Zend/tests/clone_004.phpt b/Zend/tests/clone_004.phpt
index dd7fe3ecff..c97bb032c0 100644
--- a/Zend/tests/clone_004.phpt
+++ b/Zend/tests/clone_004.phpt
@@ -3,8 +3,6 @@ Testing usage of object as array on clone statement
--FILE--
<?php
-error_reporting(E_ALL|E_STRICT);
-
class foo {
public function __get($a) {
return new $this;
diff --git a/Zend/tests/closure_024.phpt b/Zend/tests/closure_024.phpt
index fcaa1e9b41..39f0062fec 100644
--- a/Zend/tests/closure_024.phpt
+++ b/Zend/tests/closure_024.phpt
@@ -18,7 +18,7 @@ echo $cc(10)."\n";
echo "Done.\n";
?>
---EXPECTF--
+--EXPECT--
11
11
12
diff --git a/Zend/tests/closure_036.phpt b/Zend/tests/closure_036.phpt
index 55e3f47cde..9123a1ba47 100644
--- a/Zend/tests/closure_036.phpt
+++ b/Zend/tests/closure_036.phpt
@@ -27,7 +27,7 @@ var_dump($cb());
var_dump($cb2());
?>
---EXPECTF--
+--EXPECT--
int(1)
int(11)
int(12)
diff --git a/Zend/tests/closure_037.phpt b/Zend/tests/closure_037.phpt
index 9da88c9ebb..1257d6bc7e 100644
--- a/Zend/tests/closure_037.phpt
+++ b/Zend/tests/closure_037.phpt
@@ -37,7 +37,7 @@ $closure = $b->getClosure();
$closure();
?>
Done.
---EXPECTF--
+--EXPECT--
1
42
42
diff --git a/Zend/tests/closure_042.phpt b/Zend/tests/closure_042.phpt
index 7ab49d562d..dc849a5282 100644
--- a/Zend/tests/closure_042.phpt
+++ b/Zend/tests/closure_042.phpt
@@ -1,7 +1,5 @@
--TEST--
Closure 042: Binding an instance to a non-scoped non-static closures gives it a dummy scope
---SKIPIF--
-<?php if(!extension_loaded("reflection")) print "skip no reflection"; ?>
--FILE--
<?php
@@ -18,6 +16,7 @@ $rm = new ReflectionFunction($d);
var_dump($rm->getClosureScopeClass()->name); //dummy sope is Closure
echo "Done.\n";
+?>
--EXPECTF--
object(stdClass)#%d (0) {
}
diff --git a/Zend/tests/closure_044.phpt b/Zend/tests/closure_044.phpt
index 31a1e063dc..c71204b130 100644
--- a/Zend/tests/closure_044.phpt
+++ b/Zend/tests/closure_044.phpt
@@ -38,7 +38,7 @@ $d = $nonstaticUnscoped->bindTo(new A, 'A'); $d(); echo "\n";
$d = $nonstaticScoped->bindTo(new A, 'A'); $d(); echo "\n";
echo "Done.\n";
---EXPECTF--
+--EXPECT--
Before binding
bool(false)
bool(false)
diff --git a/Zend/tests/closure_045.phpt b/Zend/tests/closure_045.phpt
index 3a9720eaf5..2b99476678 100644
--- a/Zend/tests/closure_045.phpt
+++ b/Zend/tests/closure_045.phpt
@@ -13,5 +13,5 @@ $a = A::foo();
$a->bindTo(new A);
echo "Done.\n";
---EXPECTF--
+--EXPECT--
Done.
diff --git a/Zend/tests/closure_046.phpt b/Zend/tests/closure_046.phpt
index b711ed7788..ef8aff4bbc 100644
--- a/Zend/tests/closure_046.phpt
+++ b/Zend/tests/closure_046.phpt
@@ -38,7 +38,7 @@ echo "After binding, with different instance for the bound one", "\n";
$d = $nonstaticScoped->bindTo(new B, "static"); $d(); echo "\n";
echo "Done.\n";
---EXPECTF--
+--EXPECT--
Before binding
bool(false)
bool(false)
diff --git a/Zend/tests/closures/closure_from_callable_reflection.phpt b/Zend/tests/closures/closure_from_callable_reflection.phpt
index af40193fba..111115a44a 100644
--- a/Zend/tests/closures/closure_from_callable_reflection.phpt
+++ b/Zend/tests/closures/closure_from_callable_reflection.phpt
@@ -35,7 +35,7 @@ foreach ($callables as $callable) {
}
?>
---EXPECTF--
+--EXPECT--
Bar
int
Bar
diff --git a/Zend/tests/compare_002.phpt b/Zend/tests/compare_002.phpt
index cbf2c953e3..9e3eb86d57 100644
--- a/Zend/tests/compare_002.phpt
+++ b/Zend/tests/compare_002.phpt
@@ -48,7 +48,7 @@ foreach($a as $var) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3)} === array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3)}
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3)} !== string(0) ""
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3)} !== int(1)
diff --git a/Zend/tests/compound_assign_with_numeric_strings.phpt b/Zend/tests/compound_assign_with_numeric_strings.phpt
index 72c80b0afc..e5cdb344ef 100644
--- a/Zend/tests/compound_assign_with_numeric_strings.phpt
+++ b/Zend/tests/compound_assign_with_numeric_strings.phpt
@@ -38,7 +38,7 @@ try{
$n = "-1";
$n %= $n;
var_dump($n);
---EXPECTF--
+--EXPECT--
int(0)
Exception: Bit shift by negative number
diff --git a/Zend/tests/constant_arrays.phpt b/Zend/tests/constant_arrays.phpt
index 6c0d791650..06d911328c 100644
--- a/Zend/tests/constant_arrays.phpt
+++ b/Zend/tests/constant_arrays.phpt
@@ -93,7 +93,7 @@ array(1) {
int(7)
}
-Warning: Constants may only evaluate to scalar values or arrays in %s on line %d
+Warning: Constants may only evaluate to scalar values, arrays or resources in %s on line %d
bool(false)
Warning: Constants cannot be recursive arrays in %s on line %d
diff --git a/Zend/tests/constants_002.phpt b/Zend/tests/constants_002.phpt
index 832da1564d..b0cf1db61f 100644
--- a/Zend/tests/constants_002.phpt
+++ b/Zend/tests/constants_002.phpt
@@ -11,7 +11,7 @@ var_dump(foo);
?>
--EXPECTF--
-Warning: Constants may only evaluate to scalar values or arrays in %s on line %d
+Warning: Constants may only evaluate to scalar values, arrays or resources in %s on line %d
Warning: Use of undefined constant foo - assumed 'foo' (this will throw an Error in a future version of PHP) in %s on line %d
string(%d) "foo"
diff --git a/Zend/tests/continue_targeting_switch_warning.phpt b/Zend/tests/continue_targeting_switch_warning.phpt
new file mode 100644
index 0000000000..05a51e5a22
--- /dev/null
+++ b/Zend/tests/continue_targeting_switch_warning.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Warning on continue targeting switch
+--FILE--
+<?php
+
+function test() {
+ switch ($foo) {
+ case 0:
+ continue; // INVALID
+ case 1:
+ break;
+ }
+
+ while ($foo) {
+ switch ($bar) {
+ case 0:
+ continue; // INVALID
+ case 1:
+ continue 2;
+ case 2:
+ break;
+ }
+ }
+
+ while ($foo) {
+ switch ($bar) {
+ case 0:
+ while ($xyz) {
+ continue 2; // INVALID
+ }
+ case 1:
+ while ($xyz) {
+ continue 3;
+ }
+ case 2:
+ while ($xyz) {
+ break 2;
+ }
+ }
+ }
+}
+
+?>
+--EXPECTF--
+Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in %s on line 6
+
+Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in %s on line 14
+
+Warning: "continue 2" targeting switch is equivalent to "break 2". Did you mean to use "continue 3"? in %s on line 26
diff --git a/Zend/tests/custom_assert_deprecation.phpt b/Zend/tests/custom_assert_deprecation.phpt
new file mode 100644
index 0000000000..b4e22843dd
--- /dev/null
+++ b/Zend/tests/custom_assert_deprecation.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Defining a free-standing assert() function is deprecated
+--FILE--
+<?php
+
+namespace FooBar;
+
+function assert() {}
+
+?>
+--EXPECTF--
+Deprecated: Defining a custom assert() function is deprecated, as the function has special semantics in %s on line %d
diff --git a/Zend/tests/declare_005.phpt b/Zend/tests/declare_005.phpt
index 8f5adcfbd2..654f8252e0 100644
--- a/Zend/tests/declare_005.phpt
+++ b/Zend/tests/declare_005.phpt
@@ -1,6 +1,5 @@
--TEST--
Testing declare statement with ticks
---SKIPIF--
--FILE--
<?php
register_tick_function(function () { echo "tick\n"; });
@@ -13,6 +12,6 @@ foo();
}
?>
---EXPECTF--
+--EXPECT--
tick
tick
diff --git a/Zend/tests/div_001.phpt b/Zend/tests/div_001.phpt
index b53c4cdc31..051ed3f733 100644
--- a/Zend/tests/div_001.phpt
+++ b/Zend/tests/div_001.phpt
@@ -25,7 +25,7 @@ var_dump($c);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
float(394758.39454545)
float(394758.39454545)
float(394758.39454545)
diff --git a/Zend/tests/double_to_string_64bit.phpt b/Zend/tests/double_to_string_64bit.phpt
index 5ecb1a6067..d228b707d4 100644
--- a/Zend/tests/double_to_string_64bit.phpt
+++ b/Zend/tests/double_to_string_64bit.phpt
@@ -35,7 +35,7 @@ foreach ($doubles as $d) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(7) "2.9E+37"
string(18) "290000000000000000"
string(15) "290000000000000"
diff --git a/Zend/tests/empty_str_offset.phpt b/Zend/tests/empty_str_offset.phpt
index 49e175dd21..044719a382 100644
--- a/Zend/tests/empty_str_offset.phpt
+++ b/Zend/tests/empty_str_offset.phpt
@@ -17,16 +17,24 @@ var_dump(empty($str[5])); // 1
var_dump(empty($str[8]));
var_dump(empty($str[10000]));
// non-numeric offsets
-print "- string ---\n";
-var_dump(empty($str['-1']));
+print "- string literal ---\n";
+var_dump(empty($str['-1'])); // 3
var_dump(empty($str['-10']));
-var_dump(empty($str['-4'])); // 0
var_dump(empty($str['0']));
var_dump(empty($str['1']));
var_dump(empty($str['4'])); // 0
var_dump(empty($str['1.5']));
var_dump(empty($str['good']));
var_dump(empty($str['3 and a half']));
+print "- string variable ---\n";
+var_dump(empty($str[$key = '-1'])); // 3
+var_dump(empty($str[$key = '-10']));
+var_dump(empty($str[$key = '0']));
+var_dump(empty($str[$key = '1']));
+var_dump(empty($str[$key = '4'])); // 0
+var_dump(empty($str[$key = '1.5']));
+var_dump(empty($str[$key = 'good']));
+var_dump(empty($str[$key = '3 and a half']));
print "- bool ---\n";
var_dump(empty($str[true]));
var_dump(empty($str[false]));
@@ -65,9 +73,17 @@ bool(true)
bool(false)
bool(true)
bool(true)
-- string ---
+- string literal ---
bool(false)
bool(true)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+- string variable ---
+bool(false)
bool(true)
bool(false)
bool(false)
diff --git a/Zend/tests/errmsg_024.phpt b/Zend/tests/errmsg_024.phpt
index abfb2b9c23..0755d2b75c 100644
--- a/Zend/tests/errmsg_024.phpt
+++ b/Zend/tests/errmsg_024.phpt
@@ -13,5 +13,5 @@ class test extends test1 {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/errmsg_040.phpt b/Zend/tests/errmsg_040.phpt
index ec28bb71af..d8ebc67bf6 100644
--- a/Zend/tests/errmsg_040.phpt
+++ b/Zend/tests/errmsg_040.phpt
@@ -9,7 +9,7 @@ class test {
var_dump(test::TEST);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
array(3) {
[0]=>
int(1)
diff --git a/Zend/tests/errmsg_041.phpt b/Zend/tests/errmsg_041.phpt
deleted file mode 100644
index 2a60652a42..0000000000
--- a/Zend/tests/errmsg_041.phpt
+++ /dev/null
@@ -1,11 +0,0 @@
---TEST--
-errmsg: instanceof expects an object instance, constant given
---FILE--
-<?php
-
-var_dump("abc" instanceof stdclass);
-
-echo "Done\n";
-?>
---EXPECTF--
-Fatal error: instanceof expects an object instance, constant given in %s on line %d
diff --git a/Zend/tests/error_reporting06.phpt b/Zend/tests/error_reporting06.phpt
index f3c4bca653..8f286f75ae 100644
--- a/Zend/tests/error_reporting06.phpt
+++ b/Zend/tests/error_reporting06.phpt
@@ -25,6 +25,6 @@ var_dump(error_reporting());
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(32767)
Done
diff --git a/Zend/tests/error_reporting07.phpt b/Zend/tests/error_reporting07.phpt
index fe7278cbec..84cf6264b9 100644
--- a/Zend/tests/error_reporting07.phpt
+++ b/Zend/tests/error_reporting07.phpt
@@ -25,6 +25,6 @@ var_dump(error_reporting());
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(32767)
Done
diff --git a/Zend/tests/error_reporting10.phpt b/Zend/tests/error_reporting10.phpt
index 1b6501a975..8b0c7b9923 100644
--- a/Zend/tests/error_reporting10.phpt
+++ b/Zend/tests/error_reporting10.phpt
@@ -29,7 +29,7 @@ var_dump(error_reporting());
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(32767)
int(32759)
Done
diff --git a/Zend/tests/exception_handler_001.phpt b/Zend/tests/exception_handler_001.phpt
index 7a85cff021..d4e205cceb 100644
--- a/Zend/tests/exception_handler_001.phpt
+++ b/Zend/tests/exception_handler_001.phpt
@@ -16,5 +16,5 @@ throw new test();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(12) "test thrown!"
diff --git a/Zend/tests/exception_handler_003.phpt b/Zend/tests/exception_handler_003.phpt
index 7e1636a0cf..8d3635c4b8 100644
--- a/Zend/tests/exception_handler_003.phpt
+++ b/Zend/tests/exception_handler_003.phpt
@@ -20,5 +20,5 @@ throw new Exception();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(17) "Exception thrown!"
diff --git a/Zend/tests/exception_handler_005.phpt b/Zend/tests/exception_handler_005.phpt
index ca0ae07f81..af96627561 100644
--- a/Zend/tests/exception_handler_005.phpt
+++ b/Zend/tests/exception_handler_005.phpt
@@ -19,5 +19,5 @@ throw new excEption();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(25) "foo1(): Exception thrown!"
diff --git a/Zend/tests/exception_handler_006.phpt b/Zend/tests/exception_handler_006.phpt
index 904bb42383..861a10ffa1 100644
--- a/Zend/tests/exception_handler_006.phpt
+++ b/Zend/tests/exception_handler_006.phpt
@@ -21,5 +21,5 @@ throw new excEption();
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(24) "foo(): Exception thrown!"
diff --git a/Zend/tests/flexible-heredoc-complex-test1.phpt b/Zend/tests/flexible-heredoc-complex-test1.phpt
new file mode 100644
index 0000000000..3e148d0652
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-complex-test1.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Flexible heredoc syntax complex test 1: interpolated nested heredocs
+with different delimiter names
+--FILE--
+<?php
+
+$a = 'b';
+${"b\nb\n d"} = 'b';
+
+var_dump(<<<DOC1
+ a
+ ${<<<DOC2
+ b
+ ${<<<DOC3
+ a
+ DOC3}
+ d
+ DOC2
+ }
+ c
+ DOC1);
+
+?>
+--EXPECT--
+string(5) "a
+b
+c"
diff --git a/Zend/tests/flexible-heredoc-complex-test2.phpt b/Zend/tests/flexible-heredoc-complex-test2.phpt
new file mode 100644
index 0000000000..d585e4b476
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-complex-test2.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Flexible heredoc syntax complex test 2: interpolated nested heredocs
+with the same delimiter name
+--FILE--
+<?php
+
+$a = 'b';
+${"b\nb\n d"} = 'b';
+
+var_dump(<<<DOC1
+ a
+ ${<<<DOC1
+ b
+ ${<<<DOC1
+ a
+ DOC1}
+ d
+ DOC1
+ }
+ c
+ DOC1);
+
+?>
+--EXPECT--
+string(5) "a
+b
+c"
diff --git a/Zend/tests/flexible-heredoc-complex-test3.phpt b/Zend/tests/flexible-heredoc-complex-test3.phpt
new file mode 100644
index 0000000000..cf68f12316
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-complex-test3.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Flexible heredoc syntax complex test 3: interpolated nested heredocs
+with the same delimiter name with different levels of indentation
+--FILE--
+<?php
+
+${' a'} = ' b';
+${' b'} = 'c';
+${"b\n b"} = 'b';
+
+var_dump(<<<DOC1
+ a
+ ${<<<DOC2
+ b
+ ${<<<DOC3
+ a
+ DOC3}
+ DOC2
+ }
+ c
+ DOC1);
+
+?>
+--EXPECT--
+string(8) " a
+ b
+c"
diff --git a/Zend/tests/flexible-heredoc-complex-test4.phpt b/Zend/tests/flexible-heredoc-complex-test4.phpt
new file mode 100644
index 0000000000..5be0f442f6
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-complex-test4.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Flexible heredoc syntax complex test 4: interpolated variable with
+the same delimiter name as the heredoc
+--FILE--
+<?php
+
+{
+ $FOO = "FOO";
+ define("FOO", "FOO");
+ $b = <<<FOO
+ Test
+ ${
+ FOO
+ }
+ FOO;
+ var_dump($b);
+}
+
+{
+ $FOO = "FOO";
+ $b = <<<FOO
+ Test
+ ${
+ FOO
+ }
+ FOO;
+ var_dump($b);
+}
+
+?>
+--EXPECT--
+string(8) "Test
+FOO"
+string(16) " Test
+ FOO"
diff --git a/Zend/tests/flexible-heredoc-error1.phpt b/Zend/tests/flexible-heredoc-error1.phpt
new file mode 100644
index 0000000000..237386834b
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error1.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible heredoc syntax 1: different indentation for body (spaces) ending marker (tabs)
+--FILE--
+<?php
+
+echo <<<END
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error10.phpt b/Zend/tests/flexible-heredoc-error10.phpt
new file mode 100644
index 0000000000..51be4562f1
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error10.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Flexible heredoc syntax error 10: unindented variable interpolation (as first value)
+--FILE--
+<?php
+
+$var = 'Bar';
+var_dump(<<<TEST
+$var
+ TEST);
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 1) in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error11.phpt b/Zend/tests/flexible-heredoc-error11.phpt
new file mode 100644
index 0000000000..cd952a73f2
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error11.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Flexible heredoc syntax error 11: show erroneous line in error message (variable interpolation)
+--FILE--
+<?php
+
+echo <<<END
+ a
+$a
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 1) in %s on line 5
diff --git a/Zend/tests/flexible-heredoc-error12.phpt b/Zend/tests/flexible-heredoc-error12.phpt
new file mode 100644
index 0000000000..05b71b36b2
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error12.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Flexible heredoc syntax error 12: show erroneous line in error message (mixed indentation)
+--FILE--
+<?php
+
+echo <<<END
+ a
+ b
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line 5
diff --git a/Zend/tests/flexible-heredoc-error13.phpt b/Zend/tests/flexible-heredoc-error13.phpt
new file mode 100644
index 0000000000..46d6371b21
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error13.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Flexible heredoc syntax error 12: show erroneous line in error message (lacking indentation)
+--FILE--
+<?php
+
+echo <<<END
+ a
+b
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 1) in %s on line 5
diff --git a/Zend/tests/flexible-heredoc-error2.phpt b/Zend/tests/flexible-heredoc-error2.phpt
new file mode 100644
index 0000000000..ad410d6b2a
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error2.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible heredoc syntax 2: mixing spaces and tabs in body
+--FILE--
+<?php
+
+echo <<<END
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error3.phpt b/Zend/tests/flexible-heredoc-error3.phpt
new file mode 100644
index 0000000000..e0303f1924
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error3.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible heredoc syntax error 3: mixing spaces and tabs in ending marker
+--FILE--
+<?php
+
+echo <<<END
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error4.phpt b/Zend/tests/flexible-heredoc-error4.phpt
new file mode 100644
index 0000000000..db3454c9c0
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error4.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible heredoc syntax error 4: not enough body indentation
+--FILE--
+<?php
+
+echo <<<END
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 5) in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error5.phpt b/Zend/tests/flexible-heredoc-error5.phpt
new file mode 100644
index 0000000000..79102d76a4
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error5.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Flexible heredoc syntax error 5: mixing spaces and tabs in ending marker for 0 length body
+--FILE--
+<?php
+
+echo <<<END
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error6.phpt b/Zend/tests/flexible-heredoc-error6.phpt
new file mode 100644
index 0000000000..42fb36ddc9
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error6.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Flexible heredoc syntax error 6: no ending token on 0 length body
+--DESCRIPTION--
+Note: the closing ?> has been deliberately elided.
+--FILE--
+<?php
+
+echo <<<END
+--EXPECTF--
+Parse error: syntax error, unexpected end of file in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error7.phpt b/Zend/tests/flexible-heredoc-error7.phpt
new file mode 100644
index 0000000000..ae9d1da0cd
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error7.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Flexible heredoc syntax error 7: no ending token
+--DESCRIPTION--
+Note: the closing ?> has been deliberately elided.
+--FILE--
+<?php
+
+echo <<<END
+
+--EXPECTF--
+Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error8.phpt b/Zend/tests/flexible-heredoc-error8.phpt
new file mode 100644
index 0000000000..6140e273f4
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error8.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Flexible heredoc syntax error 8: don't interpret \t as indentation
+--FILE--
+<?php
+
+<<<end
+\ta
+ end);
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 1) in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-error9.phpt b/Zend/tests/flexible-heredoc-error9.phpt
new file mode 100644
index 0000000000..c98cc996c5
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-error9.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible heredoc syntax error 9: unindented variable interpolation
+--FILE--
+<?php
+
+$var = 'Bar';
+var_dump(<<<TEST
+ Foo
+$var
+ TEST);
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 2) in %s on line %d
diff --git a/Zend/tests/flexible-heredoc-nowdoc-lineno.phpt b/Zend/tests/flexible-heredoc-nowdoc-lineno.phpt
new file mode 100644
index 0000000000..8aeddbd10d
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-nowdoc-lineno.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Flexible heredoc lineno: ensure the compiler globals line number is correct
+--FILE--
+<?php
+
+$heredoc = <<<EOT
+hello world
+EOT;
+
+$heredoc = <<<'EOT'
+hello world
+EOT;
+
+$heredoc = <<<EOT
+ hello world
+ EOT;
+
+$heredoc = <<<'EOT'
+ hello world
+ EOT;
+
+try {
+ throw new exception();
+} catch (Exception $e) {
+ var_dump($e->getLine());
+}
+
+?>
+--EXPECT--
+int(20)
diff --git a/Zend/tests/flexible-heredoc-nowdoc.phpt b/Zend/tests/flexible-heredoc-nowdoc.phpt
new file mode 100644
index 0000000000..15d42a5be9
--- /dev/null
+++ b/Zend/tests/flexible-heredoc-nowdoc.phpt
@@ -0,0 +1,128 @@
+--TEST--
+Flexible heredoc/nowdoc syntax
+--FILE--
+<?php
+
+$test = 'c';
+
+var_dump(<<<'END'
+ END);
+
+var_dump(<<<END
+
+ END);
+
+// Insufficient indentation is fine if the line is whitespace-only
+// Using eval() here to avoid issue with trailing whitespace trimming
+var_dump(eval("return <<<END
+\x20
+\x20\x20END;"));
+
+echo <<<'END'
+ a
+ b
+
+ c
+
+ d
+ e
+ END, PHP_EOL;
+
+echo <<<END
+ a
+ b
+ $test
+ d
+ e
+ END, PHP_EOL;
+
+echo <<<'END'
+
+ a
+
+ b
+
+ c
+
+ d
+
+e
+
+END, PHP_EOL;
+
+echo <<<END
+ a\r\n
+\ta\n
+ b\r\n
+ $test\n
+ d\r\n
+e\n
+END, PHP_EOL;
+
+echo <<<'END'
+ a
+ b
+ c
+ d
+e
+END, PHP_EOL;
+
+$var = 'Bar';
+var_dump(<<<TEST
+$var
+TEST);
+
+$var = 'Bar';
+var_dump(<<<TEST
+
+$var
+TEST);
+
+?>
+--EXPECT--
+string(0) ""
+string(0) ""
+string(0) ""
+ a
+ b
+
+ c
+
+ d
+e
+ a
+ b
+ c
+ d
+e
+
+ a
+
+ b
+
+ c
+
+ d
+
+e
+
+ a
+
+ a
+
+ b
+
+ c
+
+ d
+
+e
+
+ a
+ b
+ c
+ d
+e
+string(3) "Bar"
+string(4) "
+Bar"
diff --git a/Zend/tests/flexible-nowdoc-error1.phpt b/Zend/tests/flexible-nowdoc-error1.phpt
new file mode 100644
index 0000000000..95627c0937
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error1.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible nowdoc syntax 1: different indentation for body (spaces) ending marker (tabs)
+--FILE--
+<?php
+
+echo <<<'END'
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error2.phpt b/Zend/tests/flexible-nowdoc-error2.phpt
new file mode 100644
index 0000000000..0cc7330464
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error2.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible nowdoc syntax 2: mixing spaces and tabs in body
+--FILE--
+<?php
+
+echo <<<'END'
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error3.phpt b/Zend/tests/flexible-nowdoc-error3.phpt
new file mode 100644
index 0000000000..8d888df9ba
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error3.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible nowdoc syntax error 3: mixing spaces and tabs in ending marker
+--FILE--
+<?php
+
+echo <<<'END'
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error4.phpt b/Zend/tests/flexible-nowdoc-error4.phpt
new file mode 100644
index 0000000000..f8155656fc
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error4.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Flexible nowdoc syntax error 4: not enough body indentation
+--FILE--
+<?php
+
+echo <<<'END'
+ a
+ b
+ c
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid body indentation level (expecting an indentation level of at least 5) in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error5.phpt b/Zend/tests/flexible-nowdoc-error5.phpt
new file mode 100644
index 0000000000..08c8fde79b
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error5.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Flexible nowdoc syntax error 5: mixing spaces and tabs in ending marker for 0 length body
+--FILE--
+<?php
+
+echo <<<'END'
+ END;
+
+?>
+--EXPECTF--
+Parse error: Invalid indentation - tabs and spaces cannot be mixed in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error6.phpt b/Zend/tests/flexible-nowdoc-error6.phpt
new file mode 100644
index 0000000000..4c4dc7f078
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error6.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Flexible nowdoc syntax error 6: no ending token on 0 length body
+--DESCRIPTION--
+Note: the closing ?> has been deliberately elided.
+--FILE--
+<?php
+
+echo <<<'END'
+--EXPECTF--
+Parse error: syntax error, unexpected end of file in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error7.phpt b/Zend/tests/flexible-nowdoc-error7.phpt
new file mode 100644
index 0000000000..27d5dbb46e
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error7.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Flexible nowdoc syntax error 7: no ending token
+--DESCRIPTION--
+Note: the closing ?> has been deliberately elided.
+--FILE--
+<?php
+
+echo <<<'END'
+
+--EXPECTF--
+Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in %s on line %d
diff --git a/Zend/tests/flexible-nowdoc-error8.phpt b/Zend/tests/flexible-nowdoc-error8.phpt
new file mode 100644
index 0000000000..ba6a2b85d8
--- /dev/null
+++ b/Zend/tests/flexible-nowdoc-error8.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Flexible nowdoc syntax error 8: no ending token with explicit trailing space
+--FILE--
+<?php
+
+eval('<<<\'end\'
+ ');
+
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in %s on line %d
diff --git a/Zend/tests/foreach_by_ref_repacking_insert.phpt b/Zend/tests/foreach_by_ref_repacking_insert.phpt
new file mode 100644
index 0000000000..1a2f9c7068
--- /dev/null
+++ b/Zend/tests/foreach_by_ref_repacking_insert.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Perform a packed to hash insert when the iterator is at the end of the array
+--FILE--
+
+<?php
+$a = [];
+$a[1] = 1;
+foreach ($a as $k => &$v) {
+ var_dump($v);
+ if ($k == 1) $a[4] = 4;
+ if ($k == 4) $a[2] = 2;
+}
+
+?>
+--EXPECT--
+int(1)
+int(4)
+int(2)
diff --git a/Zend/tests/foreach_list_002.phpt b/Zend/tests/foreach_list_002.phpt
index d84f3dd9d4..1c693651fd 100644
--- a/Zend/tests/foreach_list_002.phpt
+++ b/Zend/tests/foreach_list_002.phpt
@@ -14,7 +14,7 @@ foreach($array as list(, $a)) {
}
?>
---EXPECTF--
+--EXPECT--
int(1)
int(3)
string(1) "b"
diff --git a/Zend/tests/foreach_reference.phpt b/Zend/tests/foreach_reference.phpt
index 6b273208aa..58c05e5553 100644
--- a/Zend/tests/foreach_reference.phpt
+++ b/Zend/tests/foreach_reference.phpt
@@ -16,7 +16,7 @@ var_dump($a);
var_dump(array_reverse($array));
?>
---EXPECTF--
+--EXPECT--
array(4) {
[0]=>
string(1) "a"
diff --git a/Zend/tests/foreach_unset_globals.phpt b/Zend/tests/foreach_unset_globals.phpt
index 7d6a14e375..8c505cdb04 100644
--- a/Zend/tests/foreach_unset_globals.phpt
+++ b/Zend/tests/foreach_unset_globals.phpt
@@ -11,7 +11,7 @@ foreach ($arr as $key => $val) {
var_dump($arr);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
array(2) {
["a"]=>
int(1)
diff --git a/Zend/tests/function_arguments/argument_count_incorrect_userland_strict.phpt b/Zend/tests/function_arguments/argument_count_incorrect_userland_strict.phpt
index 5698472f42..1e535ea9f9 100644
--- a/Zend/tests/function_arguments/argument_count_incorrect_userland_strict.phpt
+++ b/Zend/tests/function_arguments/argument_count_incorrect_userland_strict.phpt
@@ -49,6 +49,6 @@ Too few arguments to function bar(), 1 passed in %s and exactly 2 expected
ArgumentCountError
Too few arguments to function bat(), 1 passed in %s and exactly 2 expected
TypeError
-Argument 1 passed to bat() must be of the type integer, string given, called in %s
+Argument 1 passed to bat() must be of the type int, string given, called in %s
TypeError
-Argument 2 passed to bat() must be of the type string, integer given, called in %s
+Argument 2 passed to bat() must be of the type string, int given, called in %s
diff --git a/Zend/tests/function_arguments/call_with_leading_comma_error.phpt b/Zend/tests/function_arguments/call_with_leading_comma_error.phpt
new file mode 100644
index 0000000000..1f587dd8f5
--- /dev/null
+++ b/Zend/tests/function_arguments/call_with_leading_comma_error.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Leading commas in function calls is not allowed
+--FILE--
+<?php
+foo(,$foo);
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected ',' in %s on line %d
diff --git a/Zend/tests/function_arguments/call_with_multi_inner_comma_error.phpt b/Zend/tests/function_arguments/call_with_multi_inner_comma_error.phpt
new file mode 100644
index 0000000000..d8250536da
--- /dev/null
+++ b/Zend/tests/function_arguments/call_with_multi_inner_comma_error.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Multiple inner commas in function calls is not allowed
+--FILE--
+<?php
+foo($foo,,$bar);
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected ',', expecting ')' in %s on line %d
diff --git a/Zend/tests/function_arguments/call_with_multi_trailing_comma_error.phpt b/Zend/tests/function_arguments/call_with_multi_trailing_comma_error.phpt
new file mode 100644
index 0000000000..a38a01644b
--- /dev/null
+++ b/Zend/tests/function_arguments/call_with_multi_trailing_comma_error.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Multiple trailing commas in function calls is not allowed
+--FILE--
+<?php
+foo($foo,,);
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected ',', expecting ')' in %s on line %d
diff --git a/Zend/tests/function_arguments/call_with_only_comma_error.phpt b/Zend/tests/function_arguments/call_with_only_comma_error.phpt
new file mode 100644
index 0000000000..8a0ce6810d
--- /dev/null
+++ b/Zend/tests/function_arguments/call_with_only_comma_error.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Single comma in function calls is not allowed
+--FILE--
+<?php
+foo(,);
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected ',' in %s on line %d
diff --git a/Zend/tests/function_arguments/call_with_trailing_comma_basic.phpt b/Zend/tests/function_arguments/call_with_trailing_comma_basic.phpt
new file mode 100644
index 0000000000..aec3008e92
--- /dev/null
+++ b/Zend/tests/function_arguments/call_with_trailing_comma_basic.phpt
@@ -0,0 +1,97 @@
+--TEST--
+Allow trailing commas in function and method calls
+--FILE--
+<?php
+function foo(...$args) {
+ echo __FUNCTION__ . "\n";
+ var_dump($args);
+}
+foo(
+ 'function',
+ 'bar',
+);
+
+class Foo
+{
+ public function __construct(...$args) {
+ echo __FUNCTION__ . "\n";
+ var_dump($args);
+ }
+
+ public function bar(...$args) {
+ echo __FUNCTION__ . "\n";
+ var_dump($args);
+ }
+
+ public function __invoke(...$args) {
+ echo __FUNCTION__ . "\n";
+ var_dump($args);
+ }
+}
+
+$foo = new Foo(
+ 'constructor',
+ 'bar',
+);
+
+$foo->bar(
+ 'method',
+ 'bar',
+);
+
+$foo(
+ 'invoke',
+ 'bar',
+);
+
+$bar = function(...$args) {
+ echo __FUNCTION__ . "\n";
+ var_dump($args);
+};
+
+$bar(
+ 'closure',
+ 'bar',
+);
+
+# Make sure to hit the "not really a function" language constructs
+unset($foo, $bar,);
+var_dump(isset($foo, $bar,));
+?>
+--EXPECT--
+foo
+array(2) {
+ [0]=>
+ string(8) "function"
+ [1]=>
+ string(3) "bar"
+}
+__construct
+array(2) {
+ [0]=>
+ string(11) "constructor"
+ [1]=>
+ string(3) "bar"
+}
+bar
+array(2) {
+ [0]=>
+ string(6) "method"
+ [1]=>
+ string(3) "bar"
+}
+__invoke
+array(2) {
+ [0]=>
+ string(6) "invoke"
+ [1]=>
+ string(3) "bar"
+}
+{closure}
+array(2) {
+ [0]=>
+ string(7) "closure"
+ [1]=>
+ string(3) "bar"
+}
+bool(false)
diff --git a/Zend/tests/gc_016.phpt b/Zend/tests/gc_016.phpt
index f1e14dab1a..f082d60973 100644
--- a/Zend/tests/gc_016.phpt
+++ b/Zend/tests/gc_016.phpt
@@ -18,9 +18,11 @@ $a = new Foo();
$a->a = $a;
unset($a);
var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
echo "ok\n"
?>
--EXPECT--
--> int(1)
+-> int(0)
+int(1)
int(1)
ok
diff --git a/Zend/tests/gc_024.phpt b/Zend/tests/gc_024.phpt
index ca78da63d3..3f6290241a 100644
--- a/Zend/tests/gc_024.phpt
+++ b/Zend/tests/gc_024.phpt
@@ -2,8 +2,6 @@
GC 024: GC and objects with non-standard handlers
--INI--
zend.enable_gc=1
---SKIPIF--
-<?php if (!extension_loaded("spl")) print "skip SPL extension required"; ?>
--FILE--
<?php
$a = new ArrayObject();
diff --git a/Zend/tests/gc_029.phpt b/Zend/tests/gc_029.phpt
index 3873d8becd..215d0e0e3b 100644
--- a/Zend/tests/gc_029.phpt
+++ b/Zend/tests/gc_029.phpt
@@ -1,7 +1,5 @@
--TEST--
GC 029: GC and destructors
---SKIPIF--
-<?php if (PHP_ZTS) { print "skip only for no-zts build"; }
--INI--
zend.enable_gc=1
--FILE--
diff --git a/Zend/tests/gc_029_zts.phpt b/Zend/tests/gc_029_zts.phpt
deleted file mode 100644
index b291b6d92b..0000000000
--- a/Zend/tests/gc_029_zts.phpt
+++ /dev/null
@@ -1,37 +0,0 @@
---TEST--
-GC 029: GC and destructors
---SKIPIF--
-<?php if (!PHP_ZTS) { print "skip only for zts build"; }
---INI--
-zend.enable_gc=1
---FILE--
-<?php
-class Foo {
- public $bar;
- public $x = array(1,2,3);
- function __destruct() {
- if ($this->bar !== null) {
- $this->x = null;
- unset($this->bar);
- }
- }
-}
-class Bar {
- public $foo;
- function __destruct() {
- if ($this->foo !== null) {
- unset($this->foo);
- }
- }
-
-}
-$foo = new Foo();
-$bar = new Bar();
-$foo->bar = $bar;
-$bar->foo = $foo;
-unset($foo);
-unset($bar);
-var_dump(gc_collect_cycles());
-?>
---EXPECT--
-int(6)
diff --git a/Zend/tests/gc_031.phpt b/Zend/tests/gc_031.phpt
index 58c4b15e3a..a79d4311b5 100644
--- a/Zend/tests/gc_031.phpt
+++ b/Zend/tests/gc_031.phpt
@@ -7,5 +7,5 @@ zend.enable_gc=0
gc_collect_cycles();
echo "DONE\n";
?>
---EXPECTF--
+--EXPECT--
DONE
diff --git a/Zend/tests/gc_032.phpt b/Zend/tests/gc_032.phpt
index cd30ed7cb6..90c30f7c16 100644
--- a/Zend/tests/gc_032.phpt
+++ b/Zend/tests/gc_032.phpt
@@ -7,35 +7,25 @@ zend.enable_gc=1
$a = array();
$b =& $a;
$a[0] = $a;
-debug_zval_dump($a);
+var_dump($a);
$a = array(array());
$b =& $a;
$a[0][0] = $a;
-debug_zval_dump($a);
+var_dump($a);
?>
---EXPECTF--
-array(1) refcount(%d){
+--EXPECT--
+array(1) {
[0]=>
- array(1) refcount(%d){
- [0]=>
- array(1) refcount(%d){
- [0]=>
- *RECURSION*
- }
+ array(0) {
}
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- array(1) refcount(%d){
+ array(1) {
[0]=>
- array(1) refcount(%d){
+ array(1) {
[0]=>
- array(1) refcount(%d){
- [0]=>
- array(1) refcount(%d){
- [0]=>
- *RECURSION*
- }
+ array(0) {
}
}
}
diff --git a/Zend/tests/gc_036.phpt b/Zend/tests/gc_036.phpt
new file mode 100644
index 0000000000..67f9a45465
--- /dev/null
+++ b/Zend/tests/gc_036.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GC 036: Memleaks in self-referenced array
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+function &foo() {
+ $a = [];
+ $a[] =& $a;
+ return $a;
+}
+function bar() {
+ gc_collect_cycles();
+}
+bar(foo());
+echo "ok\n";
+?>
+--EXPECT--
+ok
diff --git a/Zend/tests/gc_037.phpt b/Zend/tests/gc_037.phpt
new file mode 100644
index 0000000000..268f8f184d
--- /dev/null
+++ b/Zend/tests/gc_037.phpt
@@ -0,0 +1,34 @@
+--TEST--
+GC 037: gc_status()
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+$a = array();
+$a[] =& $a;
+unset($a);
+var_dump(gc_status());
+gc_collect_cycles();
+gc_collect_cycles();
+var_dump(gc_status());
+--EXPECT--
+array(4) {
+ ["runs"]=>
+ int(0)
+ ["collected"]=>
+ int(0)
+ ["threshold"]=>
+ int(10001)
+ ["roots"]=>
+ int(1)
+}
+array(4) {
+ ["runs"]=>
+ int(1)
+ ["collected"]=>
+ int(1)
+ ["threshold"]=>
+ int(10001)
+ ["roots"]=>
+ int(0)
+}
diff --git a/Zend/tests/gc_038.phpt b/Zend/tests/gc_038.phpt
new file mode 100644
index 0000000000..737025ae2d
--- /dev/null
+++ b/Zend/tests/gc_038.phpt
@@ -0,0 +1,132 @@
+--TEST--
+GC 038: Garbage created by compound assignment operators (e.g. +=)
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+function test_add() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x += 5;
+ $n = gc_collect_cycles();
+ echo "+=\t$n\n";
+}
+test_add();
+
+function test_sub() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x -= 5;
+ $n = gc_collect_cycles();
+ echo "-=\t$n\n";
+}
+test_sub();
+
+function test_mul() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x *= 5;
+ $n = gc_collect_cycles();
+ echo "*=\t$n\n";
+}
+test_mul();
+
+function test_div() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x /= 5;
+ $n = gc_collect_cycles();
+ echo "/=\t$n\n";
+}
+test_div();
+
+function test_mod() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x %= 5;
+ $n = gc_collect_cycles();
+ echo "%=\t$n\n";
+}
+test_mod();
+
+function test_sl() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x <<= 5;
+ $n = gc_collect_cycles();
+ echo "<<=\t$n\n";
+}
+test_sl();
+
+function test_sr() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x >>= 5;
+ $n = gc_collect_cycles();
+ echo ">>=\t$n\n";
+}
+test_sr();
+
+function test_or() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x |= 1;
+ $n = gc_collect_cycles();
+ echo "|=\t$n\n";
+}
+test_or();
+
+function test_and() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x &= 1;
+ $n = gc_collect_cycles();
+ echo "&=\t$n\n";
+}
+test_and();
+
+function test_xor() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x ^= 1;
+ $n = gc_collect_cycles();
+ echo "^=\t$n\n";
+}
+test_xor();
+
+function test_pow() {
+ $x = new stdClass;
+ $x->x= $x;
+ @$x **= 1;
+ $n = gc_collect_cycles();
+ echo "**=\t$n\n";
+}
+test_pow();
+
+class Y {
+ function __toString() {
+ return "y";
+ }
+}
+function test_concat() {
+ $x = new Y;
+ $x->x= $x;
+ @$x .= "x";
+ $n = gc_collect_cycles();
+ echo ".=\t$n\n";
+}
+test_concat();
+?>
+--EXPECT--
++= 1
+-= 1
+*= 1
+/= 1
+%= 1
+<<= 1
+>>= 1
+|= 1
+&= 1
+^= 1
+**= 1
+.= 1
diff --git a/Zend/tests/gc_039.phpt b/Zend/tests/gc_039.phpt
new file mode 100644
index 0000000000..0837e7e01e
--- /dev/null
+++ b/Zend/tests/gc_039.phpt
@@ -0,0 +1,15 @@
+--TEST--
+GC 039: Garbage created by replacing argument send by reference
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+zend.enable_gc = 1
+--FILE--
+<?php
+$out = new stdClass;
+$out->x = $out;
+mb_parse_str("a=b", $out);
+var_dump(gc_collect_cycles());
+?>
+--EXPECT--
+int(1)
diff --git a/Zend/tests/gc_042.phpt b/Zend/tests/gc_042.phpt
index a7c40fe1ff..c8dfc0ef86 100644
--- a/Zend/tests/gc_042.phpt
+++ b/Zend/tests/gc_042.phpt
@@ -17,10 +17,12 @@ unset($t, $a);
gc_collect_cycles();
var_dump($x);
-// TODO: The destructor *should* be running here, but doesn't.
-// This works in PHP >= 7.3 though.
-
?>
---EXPECTF--
-Notice: Undefined variable: x in %s on line %d
-NULL
+--EXPECT--
+object(Test)#1 (1) {
+ ["x"]=>
+ object(stdClass)#2 (1) {
+ ["t"]=>
+ *RECURSION*
+ }
+}
diff --git a/Zend/tests/generators/bug74157.phpt b/Zend/tests/generators/bug74157.phpt
index d5f0233aec..e5b9111f78 100644
--- a/Zend/tests/generators/bug74157.phpt
+++ b/Zend/tests/generators/bug74157.phpt
@@ -15,7 +15,7 @@ foreach (a(range(1, 3)) as $a) {
var_dump($a);
}
?>
---EXPECTF--
+--EXPECT--
int(1)
int(2)
int(3)
diff --git a/Zend/tests/generators/bug76427.phpt b/Zend/tests/generators/bug76427.phpt
new file mode 100644
index 0000000000..09ec61a340
--- /dev/null
+++ b/Zend/tests/generators/bug76427.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #76427 (Segfault in zend_objects_store_put)
+--FILE--
+<?php
+$func = function () {
+ yield 2;
+};
+
+$a = new stdclass();
+$b = new stdclass();
+$a->b = $b;
+$b->a = $a;
+
+$func = $a->func = $func();
+
+unset($b);
+unset($a);
+unset($func);
+
+var_dump(gc_collect_cycles());
+
+?>
+--EXPECT--
+int(4)
diff --git a/Zend/tests/generators/errors/serialize_unserialize_error.phpt b/Zend/tests/generators/errors/serialize_unserialize_error.phpt
index fc0647395d..aa962eb99a 100644
--- a/Zend/tests/generators/errors/serialize_unserialize_error.phpt
+++ b/Zend/tests/generators/errors/serialize_unserialize_error.phpt
@@ -35,7 +35,7 @@ Stack trace:
Warning: Erroneous data format for unserializing 'Generator' in %sserialize_unserialize_error.php on line %d
-Notice: unserialize(): Error at offset 19 of 20 bytes in %sserialize_unserialize_error.php on line %s
+Notice: unserialize(): Error at offset 19 of 20 bytes in %sserialize_unserialize_error.php on line %d
bool(false)
Exception: Unserialization of 'Generator' is not allowed in %s:%d
Stack trace:
diff --git a/Zend/tests/generators/finally/return_return.phpt b/Zend/tests/generators/finally/return_return.phpt
index 02e2739de7..194fc93de7 100644
--- a/Zend/tests/generators/finally/return_return.phpt
+++ b/Zend/tests/generators/finally/return_return.phpt
@@ -27,7 +27,7 @@ $gen = gen();
$gen->rewind(); // force run
?>
---EXPECTF--
+--EXPECT--
before return
before return in inner finally
outer finally run
diff --git a/Zend/tests/generators/generator_with_type_check.phpt b/Zend/tests/generators/generator_with_type_check.phpt
index 2aa16532dc..12e6d46d76 100644
--- a/Zend/tests/generators/generator_with_type_check.phpt
+++ b/Zend/tests/generators/generator_with_type_check.phpt
@@ -6,7 +6,7 @@ function gen(array $a) { yield; }
gen(42);
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to gen() must be of the type array, integer given, called in %sgenerator_with_type_check.php on line 3 and defined in %sgenerator_with_type_check.php:2
+Fatal error: Uncaught TypeError: Argument 1 passed to gen() must be of the type array, int given, called in %sgenerator_with_type_check.php on line 3 and defined in %sgenerator_with_type_check.php:2
Stack trace:
#0 %sgenerator_with_type_check.php(3): gen(42)
#1 {main}
diff --git a/Zend/tests/generators/generator_with_type_check_2.phpt b/Zend/tests/generators/generator_with_type_check_2.phpt
index d8ea4fbf0d..ba1216224c 100644
--- a/Zend/tests/generators/generator_with_type_check_2.phpt
+++ b/Zend/tests/generators/generator_with_type_check_2.phpt
@@ -18,5 +18,5 @@ try {
}
?>
--EXPECTF--
-Argument 1 passed to gen() must be of the type array, integer given, called in %sgenerator_with_type_check_2.php on line 4
-Argument 1 passed to gen() must be of the type array, integer given, called in %sgenerator_with_type_check_2.php on line 10
+Argument 1 passed to gen() must be of the type array, int given, called in %sgenerator_with_type_check_2.php on line 4
+Argument 1 passed to gen() must be of the type array, int given, called in %sgenerator_with_type_check_2.php on line 10
diff --git a/Zend/tests/generators/get_return.phpt b/Zend/tests/generators/get_return.phpt
index 0d3e32af14..d1815ff183 100644
--- a/Zend/tests/generators/get_return.phpt
+++ b/Zend/tests/generators/get_return.phpt
@@ -68,7 +68,7 @@ $gen = gen6();
var_dump($gen->getReturn());
?>
---EXPECTF--
+--EXPECT--
int(42)
int(24)
int(42)
diff --git a/Zend/tests/get_class_methods_001.phpt b/Zend/tests/get_class_methods_001.phpt
index 877b41cbcd..d0d51220aa 100644
--- a/Zend/tests/get_class_methods_001.phpt
+++ b/Zend/tests/get_class_methods_001.phpt
@@ -26,7 +26,7 @@ var_dump(get_class_methods('Y'));
Y::test();
?>
---EXPECTF--
+--EXPECT--
array(1) {
[0]=>
string(1) "a"
diff --git a/Zend/tests/get_class_methods_002.phpt b/Zend/tests/get_class_methods_002.phpt
index b95d43d3e1..c049c1ced3 100644
--- a/Zend/tests/get_class_methods_002.phpt
+++ b/Zend/tests/get_class_methods_002.phpt
@@ -23,7 +23,7 @@ class B implements A {
new B;
?>
---EXPECTF--
+--EXPECT--
array(2) {
[0]=>
string(1) "a"
diff --git a/Zend/tests/get_defined_vars.phpt b/Zend/tests/get_defined_vars.phpt
index e999bd291d..8fe32c8937 100644
--- a/Zend/tests/get_defined_vars.phpt
+++ b/Zend/tests/get_defined_vars.phpt
@@ -3,7 +3,7 @@ Testing get_defined_vars() Function
--FILE--
<?php
/* Prototype: array get_defined_vars(void);
- * Description: Returns a multidimentional array of all defined variables.
+ * Description: Returns a multidimensional array of all defined variables.
*/
/* Various variables definitions used for testing of the function */
@@ -64,7 +64,7 @@ func1();
echo "\nDone";
?>
---EXPECTF--
+--EXPECT--
*** Displaying various variables through the array captured by the get_defined_vars function call ***
int(1)
float(22.33)
diff --git a/Zend/tests/get_required_files.phpt b/Zend/tests/get_required_files.phpt
index c2ba368884..eedd21b875 100644
--- a/Zend/tests/get_required_files.phpt
+++ b/Zend/tests/get_required_files.phpt
@@ -12,5 +12,5 @@ var_dump($files);
--EXPECTF--
array(1) {
[0]=>
- %string|unicode%(%d)%s
+ string(%d)%s
}
diff --git a/Zend/tests/grammar/bug78441.phpt b/Zend/tests/grammar/bug78441.phpt
new file mode 100644
index 0000000000..af05ecf1d8
--- /dev/null
+++ b/Zend/tests/grammar/bug78441.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #78441 (Parse error due to heredoc identifier followed by digit)
+--FILE--
+<?php
+echo <<<FOO
+FOO4
+FOO, PHP_EOL;
+
+echo <<<FOO
+bar
+FOO4
+FOO, PHP_EOL;
+
+echo <<<'FOO'
+bar
+FOO4
+FOO, PHP_EOL;
+?>
+--EXPECT--
+FOO4
+bar
+FOO4
+bar
+FOO4
diff --git a/Zend/tests/grammar/regression_001.phpt b/Zend/tests/grammar/regression_001.phpt
index 1de19c8216..657b36b853 100644
--- a/Zend/tests/grammar/regression_001.phpt
+++ b/Zend/tests/grammar/regression_001.phpt
@@ -22,7 +22,7 @@ Foo::
);
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
Foo::function
Foo::function
Foo::function
diff --git a/Zend/tests/grammar/regression_002.phpt b/Zend/tests/grammar/regression_002.phpt
index 68091778dc..52ca62d6ba 100644
--- a/Zend/tests/grammar/regression_002.phpt
+++ b/Zend/tests/grammar/regression_002.phpt
@@ -14,7 +14,7 @@ var_dump(Foo:: CLASS);
var_dump(Foo::
CLASS);
---EXPECTF--
+--EXPECT--
string(3) "Foo"
string(3) "Foo"
string(3) "Foo"
diff --git a/Zend/tests/grammar/regression_006.phpt b/Zend/tests/grammar/regression_006.phpt
index fac02d2b87..072148ca56 100644
--- a/Zend/tests/grammar/regression_006.phpt
+++ b/Zend/tests/grammar/regression_006.phpt
@@ -19,7 +19,7 @@ echo Obj::
USE, PHP_EOL;
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
declare
return
function
diff --git a/Zend/tests/grammar/regression_007.phpt b/Zend/tests/grammar/regression_007.phpt
index 7773d8fc7e..b691ccaef9 100644
--- a/Zend/tests/grammar/regression_007.phpt
+++ b/Zend/tests/grammar/regression_007.phpt
@@ -28,7 +28,7 @@ Foo::{'new'}();
var_dump(Foo::use);
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
Foo::new
Foo::new
Foo::new
diff --git a/Zend/tests/grammar/regression_008.phpt b/Zend/tests/grammar/regression_008.phpt
index 52e14d2946..57ae510722 100644
--- a/Zend/tests/grammar/regression_008.phpt
+++ b/Zend/tests/grammar/regression_008.phpt
@@ -12,7 +12,7 @@ $friday = new Friday;
echo "$friday->require ($friday->require) {$friday->require}", PHP_EOL;
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
fun (fun) fun
Done
diff --git a/Zend/tests/grammar/regression_009.phpt b/Zend/tests/grammar/regression_009.phpt
index c648c02a6c..45fc81bcb8 100644
--- a/Zend/tests/grammar/regression_009.phpt
+++ b/Zend/tests/grammar/regression_009.phpt
@@ -12,5 +12,5 @@ class Foo
}
echo PHP_EOL, "Done", PHP_EOL;
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/grammar/regression_010.phpt b/Zend/tests/grammar/regression_010.phpt
index fa7fb18535..e5e65e3a85 100644
--- a/Zend/tests/grammar/regression_010.phpt
+++ b/Zend/tests/grammar/regression_010.phpt
@@ -8,5 +8,5 @@ interface A{}
class B implements\A {}
echo "Done", PHP_EOL;
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/grammar/regression_013.phpt b/Zend/tests/grammar/regression_013.phpt
index 369ff1c8ad..9f5b3e16f1 100644
--- a/Zend/tests/grammar/regression_013.phpt
+++ b/Zend/tests/grammar/regression_013.phpt
@@ -8,5 +8,5 @@ class A { function foo() { "{${$a}}"; } function list() {} }
echo "Done", PHP_EOL;
?>
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/grammar/semi_reserved_001.phpt b/Zend/tests/grammar/semi_reserved_001.phpt
index f74afcb6fe..68b35d3f22 100644
--- a/Zend/tests/grammar/semi_reserved_001.phpt
+++ b/Zend/tests/grammar/semi_reserved_001.phpt
@@ -161,7 +161,7 @@ $obj->__DIR__();
$obj->__NAMESPACE__();
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
Obj::empty
Obj::callable
Obj::class
diff --git a/Zend/tests/grammar/semi_reserved_002.phpt b/Zend/tests/grammar/semi_reserved_002.phpt
index 8eab9104ac..4aa0f27e5e 100644
--- a/Zend/tests/grammar/semi_reserved_002.phpt
+++ b/Zend/tests/grammar/semi_reserved_002.phpt
@@ -159,7 +159,7 @@ Obj::__DIR__();
Obj::__NAMESPACE__();
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
Obj::empty
Obj::callable
Obj::class
diff --git a/Zend/tests/grammar/semi_reserved_003.phpt b/Zend/tests/grammar/semi_reserved_003.phpt
index d63824017e..8e459a636f 100644
--- a/Zend/tests/grammar/semi_reserved_003.phpt
+++ b/Zend/tests/grammar/semi_reserved_003.phpt
@@ -165,7 +165,7 @@ echo $obj->__halt_compiler, PHP_EOL;
echo "\nDone\n";
?>
---EXPECTF--
+--EXPECT--
empty
callable
class
diff --git a/Zend/tests/grammar/semi_reserved_004.phpt b/Zend/tests/grammar/semi_reserved_004.phpt
index f5c2915f1c..5a625a608b 100644
--- a/Zend/tests/grammar/semi_reserved_004.phpt
+++ b/Zend/tests/grammar/semi_reserved_004.phpt
@@ -161,7 +161,7 @@ echo Obj::$__NAMESPACE__, PHP_EOL;
echo Obj::$__halt_compiler, PHP_EOL;
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
empty
callable
class
diff --git a/Zend/tests/grammar/semi_reserved_005.phpt b/Zend/tests/grammar/semi_reserved_005.phpt
index 6407597362..2cf7709b15 100644
--- a/Zend/tests/grammar/semi_reserved_005.phpt
+++ b/Zend/tests/grammar/semi_reserved_005.phpt
@@ -157,7 +157,7 @@ echo Obj::__DIR__, PHP_EOL;
echo Obj::__NAMESPACE__, PHP_EOL;
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
empty
callable
trait
diff --git a/Zend/tests/grammar/semi_reserved_006.phpt b/Zend/tests/grammar/semi_reserved_006.phpt
index 6657fd92cf..634ba51285 100644
--- a/Zend/tests/grammar/semi_reserved_006.phpt
+++ b/Zend/tests/grammar/semi_reserved_006.phpt
@@ -58,7 +58,7 @@ Foo::byebye();
Foo::farewell();
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
TraitA::catch
TraitA::list
TraitB::throw
diff --git a/Zend/tests/grammar/semi_reserved_007.phpt b/Zend/tests/grammar/semi_reserved_007.phpt
index e712fdf304..64e55a8e2a 100644
--- a/Zend/tests/grammar/semi_reserved_007.phpt
+++ b/Zend/tests/grammar/semi_reserved_007.phpt
@@ -25,7 +25,7 @@ class Bar extends Foo {
new Bar;
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
From Foo::__construct:
self
parent
diff --git a/Zend/tests/grammar/semi_reserved_008.phpt b/Zend/tests/grammar/semi_reserved_008.phpt
index f48c459671..fe478323f8 100644
--- a/Zend/tests/grammar/semi_reserved_008.phpt
+++ b/Zend/tests/grammar/semi_reserved_008.phpt
@@ -61,7 +61,7 @@ Foo /**/
attempt();
echo PHP_EOL, "Done", PHP_EOL;
---EXPECTF--
+--EXPECT--
TraitB::try
Done
diff --git a/Zend/tests/grammar/semi_reserved_009.phpt b/Zend/tests/grammar/semi_reserved_009.phpt
index 8200e95b35..98ff4ee8f0 100644
--- a/Zend/tests/grammar/semi_reserved_009.phpt
+++ b/Zend/tests/grammar/semi_reserved_009.phpt
@@ -18,7 +18,7 @@ class Foo
Foo::try();
echo PHP_EOL, "Done", PHP_EOL;
---EXPECTF--
+--EXPECT--
TraitA::as
Done
diff --git a/Zend/tests/grammar/semi_reserved_010.phpt b/Zend/tests/grammar/semi_reserved_010.phpt
index 5bfa8c605e..951db73b85 100644
--- a/Zend/tests/grammar/semi_reserved_010.phpt
+++ b/Zend/tests/grammar/semi_reserved_010.phpt
@@ -24,7 +24,7 @@ class Foo
Foo::insteadof();
echo PHP_EOL, "Done", PHP_EOL;
---EXPECTF--
+--EXPECT--
TraitB::insteadof
Done
diff --git a/Zend/tests/heredoc_009.phpt b/Zend/tests/heredoc_009.phpt
deleted file mode 100644
index 38f5d282f0..0000000000
--- a/Zend/tests/heredoc_009.phpt
+++ /dev/null
@@ -1,42 +0,0 @@
---TEST--
-Torture the T_END_HEREDOC rules (heredoc)
---FILE--
-<?php
-
-require_once 'nowdoc.inc';
-
-print <<<ENDOFHEREDOC
-ENDOFHEREDOC ;
- ENDOFHEREDOC;
-ENDOFHEREDOC
- ENDOFHEREDOC
-$ENDOFHEREDOC;
-
-ENDOFHEREDOC;
-
-$x = <<<ENDOFHEREDOC
-ENDOFHEREDOC ;
- ENDOFHEREDOC;
-ENDOFHEREDOC
- ENDOFHEREDOC
-$ENDOFHEREDOC;
-
-ENDOFHEREDOC;
-
-print "{$x}";
-
-?>
---EXPECTF--
-Notice: Undefined variable: ENDOFHEREDOC in %s on line %d
-ENDOFHEREDOC ;
- ENDOFHEREDOC;
-ENDOFHEREDOC
- ENDOFHEREDOC
-;
-
-Notice: Undefined variable: ENDOFHEREDOC in %s on line %d
-ENDOFHEREDOC ;
- ENDOFHEREDOC;
-ENDOFHEREDOC
- ENDOFHEREDOC
-;
diff --git a/Zend/tests/heredoc_010.phpt b/Zend/tests/heredoc_010.phpt
deleted file mode 100644
index 5aa0433bcf..0000000000
--- a/Zend/tests/heredoc_010.phpt
+++ /dev/null
@@ -1,32 +0,0 @@
---TEST--
-Torture the T_END_HEREDOC rules with variable expansions (heredoc)
---FILE--
-<?php
-
-require_once 'nowdoc.inc';
-$fooledYou = '';
-
-print <<<ENDOFHEREDOC
-{$fooledYou}ENDOFHEREDOC{$fooledYou}
-ENDOFHEREDOC{$fooledYou}
-{$fooledYou}ENDOFHEREDOC
-
-ENDOFHEREDOC;
-
-$x = <<<ENDOFHEREDOC
-{$fooledYou}ENDOFHEREDOC{$fooledYou}
-ENDOFHEREDOC{$fooledYou}
-{$fooledYou}ENDOFHEREDOC
-
-ENDOFHEREDOC;
-
-print "{$x}";
-
-?>
---EXPECT--
-ENDOFHEREDOC
-ENDOFHEREDOC
-ENDOFHEREDOC
-ENDOFHEREDOC
-ENDOFHEREDOC
-ENDOFHEREDOC
diff --git a/Zend/tests/heredoc_017.phpt b/Zend/tests/heredoc_017.phpt
deleted file mode 100644
index 6c4b8f3cde..0000000000
--- a/Zend/tests/heredoc_017.phpt
+++ /dev/null
@@ -1,17 +0,0 @@
---TEST--
-Testinh heredoc syntax
---FILE--
-<?php
-
-$a = <<<A
- A;
-;
- A;
-\;
-A;
-
-var_dump(strlen($a) == 12);
-
-?>
---EXPECT--
-bool(true)
diff --git a/Zend/tests/heredoc_018.phpt b/Zend/tests/heredoc_018.phpt
deleted file mode 100644
index c10e9c1c4e..0000000000
--- a/Zend/tests/heredoc_018.phpt
+++ /dev/null
@@ -1,17 +0,0 @@
---TEST--
-Testing heredoc with tabs before identifier
---FILE--
-<?php
-
-$heredoc = <<< A
-
-foo
-
- A;
-A;
-
-var_dump(strlen($heredoc) == 9);
-
-?>
---EXPECT--
-bool(true)
diff --git a/Zend/tests/indirect_call_array_004.phpt b/Zend/tests/indirect_call_array_004.phpt
index 350f720648..07d8a09215 100644
--- a/Zend/tests/indirect_call_array_004.phpt
+++ b/Zend/tests/indirect_call_array_004.phpt
@@ -61,7 +61,7 @@ catch (Exception $e) {
}
?>
---EXPECTF--
+--EXPECT--
foo
From foo::__callStatic:
123
diff --git a/Zend/tests/inherit_internal_static.phpt b/Zend/tests/inherit_internal_static.phpt
new file mode 100644
index 0000000000..4716717f15
--- /dev/null
+++ b/Zend/tests/inherit_internal_static.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Inherit internal static property into userland class
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip requires zend-test'); ?>
+--FILE--
+<?php
+
+class Test extends _ZendTestClass {
+}
+
+var_dump(Test::$_StaticProp);
+_ZendTestClass::$_StaticProp = 42;
+var_dump(Test::$_StaticProp);
+
+?>
+--EXPECT--
+NULL
+int(42)
diff --git a/Zend/tests/instanceof_const.phpt b/Zend/tests/instanceof_const.phpt
new file mode 100644
index 0000000000..f662d91603
--- /dev/null
+++ b/Zend/tests/instanceof_const.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Instanceof on literals returns false
+--FILE--
+<?php
+
+var_dump("abc" instanceof stdclass);
+
+?>
+--EXPECT--
+bool(false)
diff --git a/Zend/tests/int_overflow_32bit.phpt b/Zend/tests/int_overflow_32bit.phpt
index 9d91985f23..cfbf059630 100644
--- a/Zend/tests/int_overflow_32bit.phpt
+++ b/Zend/tests/int_overflow_32bit.phpt
@@ -20,7 +20,7 @@ foreach ($doubles as $d) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(-2147483648)
int(-2147483647)
int(-2147483638)
diff --git a/Zend/tests/int_underflow_64bit.phpt b/Zend/tests/int_underflow_64bit.phpt
index 48a43a3ca3..40a6dff9ec 100644
--- a/Zend/tests/int_underflow_64bit.phpt
+++ b/Zend/tests/int_underflow_64bit.phpt
@@ -20,7 +20,7 @@ foreach ($doubles as $d) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(-9223372036854775808)
int(-9223372036854775808)
int(-9223372036854775808)
diff --git a/Zend/tests/inter_04.phpt b/Zend/tests/inter_04.phpt
index f0278d04f6..97fddf73b2 100644
--- a/Zend/tests/inter_04.phpt
+++ b/Zend/tests/inter_04.phpt
@@ -17,5 +17,5 @@ interface c extends a, b {
echo "done!\n";
?>
---EXPECTF--
+--EXPECT--
done!
diff --git a/Zend/tests/isset_str_offset.phpt b/Zend/tests/isset_str_offset.phpt
index d693f80a52..6be0f227a4 100644
--- a/Zend/tests/isset_str_offset.phpt
+++ b/Zend/tests/isset_str_offset.phpt
@@ -16,8 +16,8 @@ var_dump(isset($str[5])); // 1
var_dump(isset($str[8]));
var_dump(isset($str[10000]));
// non-numeric offsets
-print "- string ---\n";
-var_dump(isset($str['-1']));
+print "- string literal ---\n";
+var_dump(isset($str['-1'])); // 3
var_dump(isset($str['-10']));
var_dump(isset($str['0']));
var_dump(isset($str['1']));
@@ -25,6 +25,15 @@ var_dump(isset($str['4'])); // 0
var_dump(isset($str['1.5']));
var_dump(isset($str['good']));
var_dump(isset($str['3 and a half']));
+print "- string variable ---\n";
+var_dump(isset($str[$key = '-1'])); // 3
+var_dump(isset($str[$key = '-10']));
+var_dump(isset($str[$key = '0']));
+var_dump(isset($str[$key = '1']));
+var_dump(isset($str[$key = '4'])); // 0
+var_dump(isset($str[$key = '1.5']));
+var_dump(isset($str[$key = 'good']));
+var_dump(isset($str[$key = '3 and a half']));
print "- bool ---\n";
var_dump(isset($str[true]));
var_dump(isset($str[false]));
@@ -61,7 +70,16 @@ bool(true)
bool(true)
bool(false)
bool(false)
-- string ---
+- string literal ---
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+- string variable ---
bool(true)
bool(false)
bool(true)
diff --git a/Zend/tests/jump12.phpt b/Zend/tests/jump12.phpt
index 10bebc25fc..3c244d6181 100644
--- a/Zend/tests/jump12.phpt
+++ b/Zend/tests/jump12.phpt
@@ -13,7 +13,7 @@ c:
print "ok!\n";
goto b;
?>
---EXPECTF--
+--EXPECT--
ok!
ok!
ok!
diff --git a/Zend/tests/list/list_reference_001.phpt b/Zend/tests/list/list_reference_001.phpt
new file mode 100644
index 0000000000..07ebbb64ce
--- /dev/null
+++ b/Zend/tests/list/list_reference_001.phpt
@@ -0,0 +1,88 @@
+--TEST--
+"Reference Unpacking - General" list()
+--FILE--
+<?php
+$arr = array(1, array(2));
+list(&$a, list(&$b)) = $arr;
+var_dump($a, $b);
+var_dump($arr);
+
+$arr = array(1, array(2));
+list($a, &$b) = $arr;
+var_dump($arr);
+
+$arr = array(1, array(2));
+[&$a, [&$b]] = $arr;
+var_dump($a, $b);
+var_dump($arr);
+
+$arr = array(1, array(2));
+[&$a, [&$b], &$c] = $arr;
+var_dump($a, $b, $c);
+var_dump($arr);
+
+$arr = array("one" => 1, "two" => array(2));
+["one" => &$a, "two" => [&$b], "three" => &$c] = $arr;
+var_dump($a, $b, $c);
+var_dump($arr);
+?>
+--EXPECT--
+int(1)
+int(2)
+array(2) {
+ [0]=>
+ &int(1)
+ [1]=>
+ array(1) {
+ [0]=>
+ &int(2)
+ }
+}
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ &array(1) {
+ [0]=>
+ int(2)
+ }
+}
+int(1)
+int(2)
+array(2) {
+ [0]=>
+ &int(1)
+ [1]=>
+ array(1) {
+ [0]=>
+ &int(2)
+ }
+}
+int(1)
+int(2)
+NULL
+array(3) {
+ [0]=>
+ &int(1)
+ [1]=>
+ array(1) {
+ [0]=>
+ &int(2)
+ }
+ [2]=>
+ &NULL
+}
+int(1)
+int(2)
+NULL
+array(3) {
+ ["one"]=>
+ &int(1)
+ ["two"]=>
+ array(1) {
+ [0]=>
+ &int(2)
+ }
+ ["three"]=>
+ &NULL
+}
diff --git a/Zend/tests/list/list_reference_002.phpt b/Zend/tests/list/list_reference_002.phpt
new file mode 100644
index 0000000000..32aad686d1
--- /dev/null
+++ b/Zend/tests/list/list_reference_002.phpt
@@ -0,0 +1,20 @@
+--TEST--
+"Reference Unpacking - New Reference" list()
+--FILE--
+<?php
+$arr = array(new stdclass);
+list(&$a, &$b) = $arr;
+var_dump($a, $b);
+var_dump($arr);
+?>
+--EXPECTF--
+object(stdClass)#%d (0) {
+}
+NULL
+array(2) {
+ [0]=>
+ &object(stdClass)#%d (0) {
+ }
+ [1]=>
+ &NULL
+}
diff --git a/Zend/tests/list/list_reference_003.phpt b/Zend/tests/list/list_reference_003.phpt
new file mode 100644
index 0000000000..9c903407d5
--- /dev/null
+++ b/Zend/tests/list/list_reference_003.phpt
@@ -0,0 +1,73 @@
+--TEST--
+"Reference Unpacking - From Functions" list()
+--FILE--
+<?php
+$arr = [1, 2];
+function no_ref($a) {
+ return $a;
+}
+
+function no_ref_by_ref(&$a) {
+ return $a;
+}
+
+function &ref_return(&$a) {
+ return $a;
+}
+
+function &ref_return_global() {
+ global $arr;
+ return $arr;
+}
+
+$a = [1, 2];
+[&$var] = no_ref($a);
+var_dump($var);
+var_dump($a);
+
+$a = [1, 2];
+[&$var] = no_ref_by_ref($a);
+var_dump($var);
+var_dump($a);
+
+$a = [1, 2];
+[&$var] = ref_return($a);
+var_dump($var);
+var_dump($a);
+
+[,&$var] = ref_return_global();
+var_dump($var);
+var_dump($arr);
+?>
+--EXPECTF--
+Notice: Attempting to set reference to non referenceable value in %s on line %d
+int(1)
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+}
+
+Notice: Attempting to set reference to non referenceable value in %s on line %d
+int(1)
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+}
+int(1)
+array(2) {
+ [0]=>
+ &int(1)
+ [1]=>
+ int(2)
+}
+int(2)
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ &int(2)
+}
diff --git a/Zend/tests/list/list_reference_004.phpt b/Zend/tests/list/list_reference_004.phpt
new file mode 100644
index 0000000000..5dd237a244
--- /dev/null
+++ b/Zend/tests/list/list_reference_004.phpt
@@ -0,0 +1,28 @@
+--TEST--
+"Reference Unpacking - Foreach" list()
+--FILE--
+<?php
+$coords = array(array(1, 2), array(3, 4));
+foreach ($coords as [&$x, $y]) {
+ $x++;
+ $y++;
+}
+var_dump($coords);
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ array(2) {
+ [0]=>
+ int(2)
+ [1]=>
+ int(2)
+ }
+ [1]=>
+ array(2) {
+ [0]=>
+ &int(4)
+ [1]=>
+ int(4)
+ }
+}
diff --git a/Zend/tests/list/list_reference_005.phpt b/Zend/tests/list/list_reference_005.phpt
new file mode 100644
index 0000000000..397f9013b5
--- /dev/null
+++ b/Zend/tests/list/list_reference_005.phpt
@@ -0,0 +1,73 @@
+--TEST--
+"Reference Unpacking - Class Property and Methods" list()
+--FILE--
+<?php
+class A {
+ public $a = [['hello']];
+ public $b = ['world'];
+
+ public function getVar() {
+ return $this->a;
+ }
+
+ public function &getVarRef() {
+ return $this->a;
+ }
+}
+
+class B {
+ static $a = [['world']];
+}
+
+$a = new A();
+[&$var] = $a->a;
+[&$var_too] = $a->b;
+var_dump($a->a);
+var_dump($a->b);
+
+$a = new A();
+[&$var] = $a->getVar();
+var_dump($a->a);
+
+$a = new A();
+[&$var] = $a->getVarRef();
+var_dump($a->a);
+
+[&$var] = B::$a;
+var_dump(B::$a);
+?>
+--EXPECTF--
+array(1) {
+ [0]=>
+ &array(1) {
+ [0]=>
+ string(5) "hello"
+ }
+}
+array(1) {
+ [0]=>
+ &string(5) "world"
+}
+
+Notice: Attempting to set reference to non referenceable value in %s on line %d
+array(1) {
+ [0]=>
+ array(1) {
+ [0]=>
+ string(5) "hello"
+ }
+}
+array(1) {
+ [0]=>
+ &array(1) {
+ [0]=>
+ string(5) "hello"
+ }
+}
+array(1) {
+ [0]=>
+ &array(1) {
+ [0]=>
+ string(5) "world"
+ }
+}
diff --git a/Zend/tests/list/list_reference_006.phpt b/Zend/tests/list/list_reference_006.phpt
new file mode 100644
index 0000000000..f85edf04a4
--- /dev/null
+++ b/Zend/tests/list/list_reference_006.phpt
@@ -0,0 +1,58 @@
+--TEST--
+"Reference Unpacking - Class ArrayAccess No Reference" list()
+--FILE--
+<?php
+class StorageNoRef implements ArrayAccess {
+ private $s = [];
+ function __construct(array $a) { $this->s = $a; }
+ function offsetSet ($k, $v) { $this->s[$k] = $v; }
+ function offsetGet ($k) { return $this->s[$k]; }
+ function offsetExists ($k) { return isset($this->s[$k]); }
+ function offsetUnset ($k) { unset($this->s[$k]); }
+}
+
+$a = new StorageNoRef([1, 2]);
+list(&$one, $two) = $a;
+var_dump($a);
+
+$a = new StorageNoRef([1, 2]);
+list(,,list($var)) = $a;
+var_dump($a);
+
+$a = new StorageNoRef(['one' => 1, 'two' => 2]);
+['one' => &$one, 'two' => $two] = $a;
+var_dump($a);
+?>
+--EXPECTF--
+Notice: Indirect modification of overloaded element of %s has no effect in %s on line %d
+object(StorageNoRef)#1 (1) {
+ ["s":"StorageNoRef":private]=>
+ array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ }
+}
+
+Notice: Undefined offset: 2 in %s on line %d
+object(StorageNoRef)#2 (1) {
+ ["s":"StorageNoRef":private]=>
+ array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ }
+}
+
+Notice: Indirect modification of overloaded element of %s has no effect in %s on line %d
+object(StorageNoRef)#1 (1) {
+ ["s":"StorageNoRef":private]=>
+ array(2) {
+ ["one"]=>
+ int(1)
+ ["two"]=>
+ int(2)
+ }
+}
diff --git a/Zend/tests/list/list_reference_007.phpt b/Zend/tests/list/list_reference_007.phpt
new file mode 100644
index 0000000000..225ebff10f
--- /dev/null
+++ b/Zend/tests/list/list_reference_007.phpt
@@ -0,0 +1,75 @@
+--TEST--
+"Reference Unpacking - Class ArrayAccess With Reference" list()
+--FILE--
+<?php
+
+class StorageRef implements ArrayAccess {
+ private $s = [];
+ function __construct(array $a) { $this->s = $a; }
+ function offsetSet ($k, $v) { $this->s[$k] = $v; }
+ function &offsetGet ($k) { return $this->s[$k]; }
+ function offsetExists ($k) { return isset($this->s[$k]); }
+ function offsetUnset ($k) { unset($this->s[$k]); }
+}
+
+$a = new StorageRef([1, 2]);
+list(&$one, $two) = $a;
+var_dump($a);
+
+$a = new StorageRef([1, 2]);
+list(,,list($var)) = $a;
+var_dump($a);
+
+$a = new StorageRef([1, 2]);
+list(,,list(&$var)) = $a;
+var_dump($a);
+
+$a = new StorageRef(['one' => 1, 'two' => 2]);
+['one' => &$one, 'two' => $two] = $a;
+var_dump($a);
+
+?>
+--EXPECT--
+object(StorageRef)#1 (1) {
+ ["s":"StorageRef":private]=>
+ array(2) {
+ [0]=>
+ &int(1)
+ [1]=>
+ int(2)
+ }
+}
+object(StorageRef)#2 (1) {
+ ["s":"StorageRef":private]=>
+ array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ NULL
+ }
+}
+object(StorageRef)#1 (1) {
+ ["s":"StorageRef":private]=>
+ array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ array(1) {
+ [0]=>
+ &NULL
+ }
+ }
+}
+object(StorageRef)#2 (1) {
+ ["s":"StorageRef":private]=>
+ array(2) {
+ ["one"]=>
+ &int(1)
+ ["two"]=>
+ int(2)
+ }
+}
diff --git a/Zend/tests/list/list_reference_008.phpt b/Zend/tests/list/list_reference_008.phpt
new file mode 100644
index 0000000000..2c78984852
--- /dev/null
+++ b/Zend/tests/list/list_reference_008.phpt
@@ -0,0 +1,68 @@
+--TEST--
+"Reference Unpacking - Oddities" list()
+--FILE--
+<?php
+$a = 1;
+$b =& $a;
+$arr = [&$a, &$b];
+list(&$a, &$b) = $arr;
+var_dump($a, $b, $arr);
+$b++;
+var_dump($a, $b, $arr);
+unset($a, $b, $arr);
+
+/*
+ * $a is first set as a reference to the 0'th elem, '1'
+ * $a is then set to the value of the 1'st elem, '2'
+ * $arr would look like, [2,2]
+ * Increment $a, and it should be [3, 2]
+ */
+$arr = [1, 2];
+list(&$a, $a) = $arr;
+var_dump($a);
+$a++;
+var_dump($arr);
+unset($a, $arr);
+
+/*
+ * We do not allow references to the same variable of rhs.
+ */
+$a = [1, 2];
+$ref =& $a;
+list(&$a, &$b) = $a;
+var_dump($a, $b);
+$a++; $b++;
+var_dump($ref);
+?>
+--EXPECT--
+int(1)
+int(1)
+array(2) {
+ [0]=>
+ &int(1)
+ [1]=>
+ &int(1)
+}
+int(2)
+int(2)
+array(2) {
+ [0]=>
+ &int(2)
+ [1]=>
+ &int(2)
+}
+int(2)
+array(2) {
+ [0]=>
+ &int(3)
+ [1]=>
+ int(2)
+}
+int(1)
+int(2)
+array(2) {
+ [0]=>
+ &int(2)
+ [1]=>
+ &int(3)
+}
diff --git a/Zend/tests/list/list_reference_009.phpt b/Zend/tests/list/list_reference_009.phpt
new file mode 100644
index 0000000000..b60539e7f8
--- /dev/null
+++ b/Zend/tests/list/list_reference_009.phpt
@@ -0,0 +1,47 @@
+--TEST--
+"Reference Unpacking - VM Safety" list()
+--FILE--
+<?php
+$ary = [[0, 1]];
+[[
+ 0 => &$a,
+ ($ary["foo"] = 1) => &$b
+]] = $ary;
+
+var_dump($ary, $a, $b);
+unset($ary, $a, $b);
+
+$ary = [[0, 1]];
+[
+ 0 => &$a,
+ ($ary["foo"] = 1) => &$b
+] = $ary[0];
+var_dump($ary, $a, $b);
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ array(2) {
+ [0]=>
+ &int(0)
+ [1]=>
+ &int(1)
+ }
+ ["foo"]=>
+ int(1)
+}
+int(0)
+int(1)
+array(2) {
+ [0]=>
+ array(2) {
+ [0]=>
+ &int(0)
+ [1]=>
+ &int(1)
+ }
+ ["foo"]=>
+ int(1)
+}
+int(0)
+int(1)
diff --git a/Zend/tests/list/list_reference_010.phpt b/Zend/tests/list/list_reference_010.phpt
new file mode 100644
index 0000000000..8ceb344a33
--- /dev/null
+++ b/Zend/tests/list/list_reference_010.phpt
@@ -0,0 +1,8 @@
+--TEST--
+"Reference Unpacking - Compile Error (scalar)" list()
+--FILE--
+<?php
+list(&$foo) = [42];
+?>
+--EXPECTF--
+Fatal error: Cannot assign reference to non referencable value in %s on line %d
diff --git a/Zend/tests/list/list_reference_011.phpt b/Zend/tests/list/list_reference_011.phpt
new file mode 100644
index 0000000000..405f34f227
--- /dev/null
+++ b/Zend/tests/list/list_reference_011.phpt
@@ -0,0 +1,9 @@
+--TEST--
+"Reference Unpacking - Compile Error (const)" list()
+--FILE--
+<?php
+const FOO = 10;
+[&$f] = FOO;
+?>
+--EXPECTF--
+Fatal error: Cannot assign reference to non referencable value in %s on line %d
diff --git a/Zend/tests/list_009.phpt b/Zend/tests/list_009.phpt
deleted file mode 100644
index c28ca8000a..0000000000
--- a/Zend/tests/list_009.phpt
+++ /dev/null
@@ -1,14 +0,0 @@
---TEST--
-list with by-reference assignment should fail
---FILE--
-<?php
-
-$a = [1];
-[&$foo] = $a;
-$foo = 2;
-
-var_dump($a);
-
-?>
---EXPECTF--
-Fatal error: [] and list() assignments cannot be by reference in %s on line %d
diff --git a/Zend/tests/list_keyed_non_literals.phpt b/Zend/tests/list_keyed_non_literals.phpt
index 80f22eda22..7c6afe70b7 100644
--- a/Zend/tests/list_keyed_non_literals.phpt
+++ b/Zend/tests/list_keyed_non_literals.phpt
@@ -24,7 +24,7 @@ list(
var_dump($one, $two, $three);
?>
---EXPECTF--
+--EXPECT--
string(3) "one"
string(3) "two"
string(5) "three"
diff --git a/Zend/tests/list_self_assign.phpt b/Zend/tests/list_self_assign.phpt
index 4640912696..33993c50ca 100644
--- a/Zend/tests/list_self_assign.phpt
+++ b/Zend/tests/list_self_assign.phpt
@@ -1,5 +1,5 @@
--TEST--
-Test variable occuring on both LHS and RHS of list()
+Test variable occurring on both LHS and RHS of list()
--FILE--
<?php
diff --git a/Zend/tests/lsb_001.phpt b/Zend/tests/lsb_001.phpt
index 68582047d9..075109259a 100644
--- a/Zend/tests/lsb_001.phpt
+++ b/Zend/tests/lsb_001.phpt
@@ -48,7 +48,7 @@ echo ChildClass2::testClassConst() . "\n";
echo ChildClass2::testStaticFunction() . "\n";
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestClassStatic
TestClassConst
TestClassFunction
diff --git a/Zend/tests/lsb_002.phpt b/Zend/tests/lsb_002.phpt
index 75dcd1470e..1f433c3038 100644
--- a/Zend/tests/lsb_002.phpt
+++ b/Zend/tests/lsb_002.phpt
@@ -53,7 +53,7 @@ echo $childClass2->testClassConst() . "\n";
echo $childClass2->testStaticFunction() . "\n";
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestClassStatic
TestClassConst
TestClassFunction
diff --git a/Zend/tests/lsb_003.phpt b/Zend/tests/lsb_003.phpt
index 4e9fe1f7c8..a7a787e568 100644
--- a/Zend/tests/lsb_003.phpt
+++ b/Zend/tests/lsb_003.phpt
@@ -18,7 +18,7 @@ echo get_class($testClass) . "\n";
echo get_class($childClass) . "\n";
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestClass
ChildClass
==DONE==
diff --git a/Zend/tests/lsb_004.phpt b/Zend/tests/lsb_004.phpt
index 6baeba00bd..9583ef2547 100644
--- a/Zend/tests/lsb_004.phpt
+++ b/Zend/tests/lsb_004.phpt
@@ -15,7 +15,7 @@ echo TestClass::getClassName() . "\n";
echo ChildClass::getClassName() . "\n";
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestClass
ChildClass
==DONE==
diff --git a/Zend/tests/lsb_005.phpt b/Zend/tests/lsb_005.phpt
index 00647a5c70..a01ccd7ca9 100644
--- a/Zend/tests/lsb_005.phpt
+++ b/Zend/tests/lsb_005.phpt
@@ -36,7 +36,7 @@ TestA::test();
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestA
TestB
TestC
diff --git a/Zend/tests/lsb_010.phpt b/Zend/tests/lsb_010.phpt
index 2ac0306120..c6ef2d8614 100644
--- a/Zend/tests/lsb_010.phpt
+++ b/Zend/tests/lsb_010.phpt
@@ -29,7 +29,7 @@ unset($foo);
unset($fooChild);
?>
---EXPECTF--
+--EXPECT--
Foo::__construct
FooChild::__construct
Foo::__destruct
diff --git a/Zend/tests/lsb_015.phpt b/Zend/tests/lsb_015.phpt
index 036c4d9517..5c40c13160 100644
--- a/Zend/tests/lsb_015.phpt
+++ b/Zend/tests/lsb_015.phpt
@@ -68,7 +68,7 @@ echo "via B:\n";
B::myCatch();
?>
==DONE==
---EXPECTF--
+--EXPECT--
via A:
A
A
diff --git a/Zend/tests/lsb_016.phpt b/Zend/tests/lsb_016.phpt
index f19c6aada8..4c5fa3248e 100644
--- a/Zend/tests/lsb_016.phpt
+++ b/Zend/tests/lsb_016.phpt
@@ -34,7 +34,7 @@ $o->a = "b";
echo $o->a;
?>
==DONE==
---EXPECTF--
+--EXPECT--
TestChild
TestChild
TestChild
diff --git a/Zend/tests/lsb_019.phpt b/Zend/tests/lsb_019.phpt
index 92a444aee8..4073dac8d8 100644
--- a/Zend/tests/lsb_019.phpt
+++ b/Zend/tests/lsb_019.phpt
@@ -39,7 +39,7 @@ echo ChildClass1::testStaticFunction() . "\n";
echo ChildClass2::testStaticVar() . "\n";
echo ChildClass2::testStaticFunction() . "\n";
?>
---EXPECTF--
+--EXPECT--
TestClassStatic
TestClassFunction
ChildClassStatic
diff --git a/Zend/tests/lsb_020.phpt b/Zend/tests/lsb_020.phpt
index c1adbe4fa7..cc5b257c34 100644
--- a/Zend/tests/lsb_020.phpt
+++ b/Zend/tests/lsb_020.phpt
@@ -39,7 +39,7 @@ echo ChildClass1::testStaticFunction() . "\n";
echo ChildClass2::testStaticVar() . "\n";
echo ChildClass2::testStaticFunction() . "\n";
?>
---EXPECTF--
+--EXPECT--
TestClassStatic
TestClassFunction
ChildClassStatic
diff --git a/Zend/tests/lsb_021.phpt b/Zend/tests/lsb_021.phpt
index c591cfa230..a99ea4dd22 100644
--- a/Zend/tests/lsb_021.phpt
+++ b/Zend/tests/lsb_021.phpt
@@ -35,7 +35,7 @@ C::testForward();
C::testNoForward();
?>
---EXPECTF--
+--EXPECT--
C
C
C
diff --git a/Zend/tests/methods-on-non-objects-usort.phpt b/Zend/tests/methods-on-non-objects-usort.phpt
index 5547695f72..ff4ad7451c 100644
--- a/Zend/tests/methods-on-non-objects-usort.phpt
+++ b/Zend/tests/methods-on-non-objects-usort.phpt
@@ -19,7 +19,7 @@ usort($list, function($a, $b) use ($comparator) {
var_dump($list);
echo "Alive\n";
?>
---EXPECTF--
+--EXPECT--
int(0)
string(43) "Call to a member function compare() on null"
int(0)
diff --git a/Zend/tests/not_001.phpt b/Zend/tests/not_001.phpt
index 2d581f2ad7..2d7f85a8b4 100644
--- a/Zend/tests/not_001.phpt
+++ b/Zend/tests/not_001.phpt
@@ -16,7 +16,7 @@ var_dump(bin2hex($s1));
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(-24)
string(8) "8c90929a"
Done
diff --git a/Zend/tests/nowdoc_009.phpt b/Zend/tests/nowdoc_009.phpt
deleted file mode 100644
index fdc6e4e21d..0000000000
--- a/Zend/tests/nowdoc_009.phpt
+++ /dev/null
@@ -1,39 +0,0 @@
---TEST--
-Torture the T_END_NOWDOC rules (nowdoc)
---FILE--
-<?php
-
-require_once 'nowdoc.inc';
-
-print <<<'ENDOFNOWDOC'
-ENDOFNOWDOC ;
- ENDOFNOWDOC;
-ENDOFNOWDOC
- ENDOFNOWDOC
-$ENDOFNOWDOC;
-
-ENDOFNOWDOC;
-
-$x = <<<'ENDOFNOWDOC'
-ENDOFNOWDOC ;
- ENDOFNOWDOC;
-ENDOFNOWDOC
- ENDOFNOWDOC
-$ENDOFNOWDOC;
-
-ENDOFNOWDOC;
-
-print "{$x}";
-
-?>
---EXPECT--
-ENDOFNOWDOC ;
- ENDOFNOWDOC;
-ENDOFNOWDOC
- ENDOFNOWDOC
-$ENDOFNOWDOC;
-ENDOFNOWDOC ;
- ENDOFNOWDOC;
-ENDOFNOWDOC
- ENDOFNOWDOC
-$ENDOFNOWDOC;
diff --git a/Zend/tests/nowdoc_010.phpt b/Zend/tests/nowdoc_010.phpt
deleted file mode 100644
index 49ec560aa0..0000000000
--- a/Zend/tests/nowdoc_010.phpt
+++ /dev/null
@@ -1,32 +0,0 @@
---TEST--
-Torture the T_END_NOWDOC rules with variable expansions (nowdoc)
---FILE--
-<?php
-
-require_once 'nowdoc.inc';
-$fooledYou = '';
-
-print <<<'ENDOFNOWDOC'
-{$fooledYou}ENDOFNOWDOC{$fooledYou}
-ENDOFNOWDOC{$fooledYou}
-{$fooledYou}ENDOFNOWDOC
-
-ENDOFNOWDOC;
-
-$x = <<<'ENDOFNOWDOC'
-{$fooledYou}ENDOFNOWDOC{$fooledYou}
-ENDOFNOWDOC{$fooledYou}
-{$fooledYou}ENDOFNOWDOC
-
-ENDOFNOWDOC;
-
-print "{$x}";
-
-?>
---EXPECT--
-{$fooledYou}ENDOFNOWDOC{$fooledYou}
-ENDOFNOWDOC{$fooledYou}
-{$fooledYou}ENDOFNOWDOC
-{$fooledYou}ENDOFNOWDOC{$fooledYou}
-ENDOFNOWDOC{$fooledYou}
-{$fooledYou}ENDOFNOWDOC
diff --git a/Zend/tests/nowdoc_011.phpt b/Zend/tests/nowdoc_011.phpt
index 63bef94673..924125b1a2 100644
--- a/Zend/tests/nowdoc_011.phpt
+++ b/Zend/tests/nowdoc_011.phpt
@@ -16,5 +16,5 @@ THISMUSTNOTERROR;
print e::E . "\n";
?>
---EXPECTF--
+--EXPECT--
If you DON'T see this, something's wrong.
diff --git a/Zend/tests/ns_035.phpt b/Zend/tests/ns_035.phpt
index fcc771a74e..7fdf7d83f3 100644
--- a/Zend/tests/ns_035.phpt
+++ b/Zend/tests/ns_035.phpt
@@ -1,7 +1,5 @@
--TEST--
035: Name ambiguity in compile-time constant reference (php name)
---SKIPIF--
-<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
--FILE--
<?php
namespace A;
diff --git a/Zend/tests/ns_036.phpt b/Zend/tests/ns_036.phpt
index 245cf7d5b5..0458a38df0 100644
--- a/Zend/tests/ns_036.phpt
+++ b/Zend/tests/ns_036.phpt
@@ -1,7 +1,5 @@
--TEST--
036: Name ambiguity in compile-time constant reference (ns name)
---SKIPIF--
-<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
--FILE--
<?php
namespace A;
diff --git a/Zend/tests/ns_054.phpt b/Zend/tests/ns_054.phpt
index 54ab958611..c6dd2553f8 100644
--- a/Zend/tests/ns_054.phpt
+++ b/Zend/tests/ns_054.phpt
@@ -1,7 +1,5 @@
--TEST--
054: namespace and interfaces
---SKIPIF--
-<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
--FILE--
<?php
namespace test\ns1;
diff --git a/Zend/tests/ns_056.phpt b/Zend/tests/ns_056.phpt
index 2390608d4e..b61609793d 100644
--- a/Zend/tests/ns_056.phpt
+++ b/Zend/tests/ns_056.phpt
@@ -1,7 +1,5 @@
--TEST--
056: type-hint compatibility in namespaces
---SKIPIF--
-<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
--FILE--
<?php
namespace test\ns1;
diff --git a/Zend/tests/ns_059.phpt b/Zend/tests/ns_059.phpt
index 301a6fc830..87f1ea2ac9 100644
--- a/Zend/tests/ns_059.phpt
+++ b/Zend/tests/ns_059.phpt
@@ -4,6 +4,6 @@
<?php
const C = array();
var_dump(C);
---EXPECTF--
+--EXPECT--
array(0) {
}
diff --git a/Zend/tests/ns_077_6.phpt b/Zend/tests/ns_077_6.phpt
deleted file mode 100644
index 05235442e5..0000000000
--- a/Zend/tests/ns_077_6.phpt
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-077: Unknown compile-time constants in namespace
---FILE--
-<?php
-
-function foo($a = array(0 => \unknown))
-{
-}
-
-foo();
---EXPECTF--
-Fatal error: Uncaught Error: Undefined constant 'unknown' in %sns_077_%d.php:%d
-Stack trace:
-#0 %s(%d): foo()
-#1 {main}
- thrown in %sns_077_%d.php on line %d
diff --git a/Zend/tests/ns_089.phpt b/Zend/tests/ns_089.phpt
index 8408dd00c1..71c6b74a9b 100644
--- a/Zend/tests/ns_089.phpt
+++ b/Zend/tests/ns_089.phpt
@@ -42,7 +42,7 @@ namespace Fiz\Biz\Buz {
var_dump(BOZ);
var_dump(BAR);
}
---EXPECTF--
+--EXPECT--
Foo\Bar\Baz\A::__construct
Foo\Bar\Baz\B::__construct
Foo\Bar\Baz\C::__construct
diff --git a/Zend/tests/ns_090.phpt b/Zend/tests/ns_090.phpt
index c79dd4d5d7..166828c8cb 100644
--- a/Zend/tests/ns_090.phpt
+++ b/Zend/tests/ns_090.phpt
@@ -33,7 +33,7 @@ namespace Fiz\Biz\Buz {
var_dump(BOZ);
var_dump(BAR);
}
---EXPECTF--
+--EXPECT--
Foo\Bar\Baz\A::__construct
Foo\Bar\Baz\B::__construct
Foo\Bar\Baz\C::__construct
diff --git a/Zend/tests/ns_091.phpt b/Zend/tests/ns_091.phpt
index fafd34afd7..ee979025d2 100644
--- a/Zend/tests/ns_091.phpt
+++ b/Zend/tests/ns_091.phpt
@@ -14,6 +14,6 @@ namespace Fiz\Biz\Buz {
new A;
new B;
}
---EXPECTF--
+--EXPECT--
Foo\Bar\A::__construct
Foo\Bar\Baz\B::__construct
diff --git a/Zend/tests/ns_093.phpt b/Zend/tests/ns_093.phpt
index 7ca7a035b3..4452a6e175 100644
--- a/Zend/tests/ns_093.phpt
+++ b/Zend/tests/ns_093.phpt
@@ -20,5 +20,5 @@ use Foo\Bar\
};
echo "\nDone\n";
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/ns_095.phpt b/Zend/tests/ns_095.phpt
index 90bfe80f2a..521926330d 100644
--- a/Zend/tests/ns_095.phpt
+++ b/Zend/tests/ns_095.phpt
@@ -36,7 +36,7 @@ namespace Baz {
echo "\nDone\n";
}
?>
---EXPECTF--
+--EXPECT--
string(14) "Foo\Bar\ClassA"
string(14) "Foo\Bar\ClassB"
string(14) "Foo\Bar\ClassC"
diff --git a/Zend/tests/object_types/return_type_in_class.phpt b/Zend/tests/object_types/return_type_in_class.phpt
index 599b1a6ddc..c4c1dc0516 100644
--- a/Zend/tests/object_types/return_type_in_class.phpt
+++ b/Zend/tests/object_types/return_type_in_class.phpt
@@ -18,7 +18,7 @@ $three = new class extends Two {
};
$three->a();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, integer returned in %s:13
+Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, int returned in %s:13
Stack trace:
#0 %s(16): class@anonymous->a()
#1 {main}
diff --git a/Zend/tests/object_types/return_type_in_function.phpt b/Zend/tests/object_types/return_type_in_function.phpt
index e8f828c4bd..dc7e0463fd 100644
--- a/Zend/tests/object_types/return_type_in_function.phpt
+++ b/Zend/tests/object_types/return_type_in_function.phpt
@@ -8,7 +8,7 @@ function a() : object {
}
a();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of a() must be an object, integer returned in %s:4
+Fatal error: Uncaught TypeError: Return value of a() must be an object, int returned in %s:4
Stack trace:
#0 %s(6): a()
#1 {main}
diff --git a/Zend/tests/object_types/return_type_inheritance_in_class.phpt b/Zend/tests/object_types/return_type_inheritance_in_class.phpt
index 69e5af6580..a7316136fb 100644
--- a/Zend/tests/object_types/return_type_inheritance_in_class.phpt
+++ b/Zend/tests/object_types/return_type_inheritance_in_class.phpt
@@ -18,7 +18,7 @@ $three = new class extends Two {
};
$three->a();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, integer returned in %s:13
+Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, int returned in %s:13
Stack trace:
#0 %s(16): class@anonymous->a()
#1 {main}
diff --git a/Zend/tests/object_types/return_type_inheritance_in_interface.phpt b/Zend/tests/object_types/return_type_inheritance_in_interface.phpt
index 249c7ea002..4c8f6c08af 100644
--- a/Zend/tests/object_types/return_type_inheritance_in_interface.phpt
+++ b/Zend/tests/object_types/return_type_inheritance_in_interface.phpt
@@ -18,7 +18,7 @@ $three = new class implements Two {
};
$three->a();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, integer returned in %s:13
+Fatal error: Uncaught TypeError: Return value of class@anonymous::a() must be an object, int returned in %s:13
Stack trace:
#0 %s(16): class@anonymous->a()
#1 {main}
diff --git a/Zend/tests/object_types/return_type_reflection.phpt b/Zend/tests/object_types/return_type_reflection.phpt
index fe86fd87f7..bcb918287d 100644
--- a/Zend/tests/object_types/return_type_reflection.phpt
+++ b/Zend/tests/object_types/return_type_reflection.phpt
@@ -21,7 +21,7 @@ var_dump($returnTypeTwo->isBuiltin(), (string)$returnTypeTwo);
$returnTypea = (new ReflectionFunction('a'))->getReturnType();
var_dump($returnTypea->isBuiltin(), (string)$returnTypea);
---EXPECTF--
+--EXPECT--
bool(true)
string(6) "object"
bool(true)
diff --git a/Zend/tests/object_types/type_hint_in_class_method.phpt b/Zend/tests/object_types/type_hint_in_class_method.phpt
index 72b0f15704..f8814e4bbb 100644
--- a/Zend/tests/object_types/type_hint_in_class_method.phpt
+++ b/Zend/tests/object_types/type_hint_in_class_method.phpt
@@ -11,7 +11,7 @@ $one = new One();
$one->a(new One());
$one->a(123);
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to One::a() must be an object, integer given, called in %s:4
+Fatal error: Uncaught TypeError: Argument 1 passed to One::a() must be an object, int given, called in %s:4
Stack trace:
#0 %s(9): One->a(123)
#1 {main}
diff --git a/Zend/tests/object_types/type_hint_in_function.phpt b/Zend/tests/object_types/type_hint_in_function.phpt
index 7b6a63e8be..39e075efdb 100644
--- a/Zend/tests/object_types/type_hint_in_function.phpt
+++ b/Zend/tests/object_types/type_hint_in_function.phpt
@@ -9,7 +9,7 @@ function a(object $obj) {}
a(new A());
a(123);
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to a() must be an object, integer given, called in %s.php on line 7 and defined in %s:4
+Fatal error: Uncaught TypeError: Argument 1 passed to a() must be an object, int given, called in %s.php on line 7 and defined in %s:4
Stack trace:
#0 %s(7): a(123)
#1 {main}
diff --git a/Zend/tests/object_types/type_hint_reflection.phpt b/Zend/tests/object_types/type_hint_reflection.phpt
index c5059e0b68..6a4f27d8c9 100644
--- a/Zend/tests/object_types/type_hint_reflection.phpt
+++ b/Zend/tests/object_types/type_hint_reflection.phpt
@@ -21,7 +21,7 @@ var_dump($typeHintTwo->isBuiltin(), (string)$typeHintTwo);
$typeHinta = (new ReflectionFunction('a'))->getParameters()[0]->getType();
var_dump($typeHinta->isBuiltin(), (string)$typeHinta);
---EXPECTF--
+--EXPECT--
bool(true)
string(6) "object"
bool(true)
diff --git a/Zend/tests/objects_010.phpt b/Zend/tests/objects_010.phpt
index 036e6e22c0..19fbd1b0f0 100644
--- a/Zend/tests/objects_010.phpt
+++ b/Zend/tests/objects_010.phpt
@@ -12,5 +12,5 @@ class test {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
Done
diff --git a/Zend/tests/objects_018.phpt b/Zend/tests/objects_018.phpt
index ca5b4b8cde..98ea982940 100644
--- a/Zend/tests/objects_018.phpt
+++ b/Zend/tests/objects_018.phpt
@@ -17,5 +17,5 @@ interface Itest3 extends Itest, Itest2 {
echo "done!\n";
?>
---EXPECTF--
+--EXPECT--
done!
diff --git a/Zend/tests/objects_032.phpt b/Zend/tests/objects_032.phpt
index e5e3ecadb2..52a5e9fed9 100644
--- a/Zend/tests/objects_032.phpt
+++ b/Zend/tests/objects_032.phpt
@@ -26,7 +26,7 @@ var_dump($a);
?>
==DONE==
---EXPECTF--
+--EXPECT--
object(A)#1 (1) {
["foo"]=>
array(1) {
diff --git a/Zend/tests/objects_033.phpt b/Zend/tests/objects_033.phpt
new file mode 100644
index 0000000000..365edc3832
--- /dev/null
+++ b/Zend/tests/objects_033.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Ensure object comparison property order remains consistent
+--FILE--
+<?php
+
+// PHP4-5.3 object semantics had child properties added to an
+// object HashTable first, then parent, then grandparent, etc...
+// As of PHP 5.4 we use a packed C array to hold properties
+// which may or may not share the same ordering.
+// In the code snippet below, the print_r() has the side-effect
+// of materializing the properties shadow HashTable which
+// if used for comparison, results in the behavior consistent
+// with pre PHP-5.4.
+// This test ensures that the first comparison yields the same
+// result without shadow table materialization.
+
+class A { public $a; }
+class B extends A { public $b; }
+$a = new B(); $a->a = 0; $a->b = 1;
+$b = new B(); $b->a = 1; $b->b = 0;
+
+var_dump($a < $b);
+print_r($a, true);
+var_dump($a < $b);
+--EXPECT--
+bool(false)
+bool(false)
diff --git a/Zend/tests/oct_overflow_32bit.phpt b/Zend/tests/oct_overflow.phpt
index af312b07d7..13ac419511 100644
--- a/Zend/tests/oct_overflow_32bit.phpt
+++ b/Zend/tests/oct_overflow.phpt
@@ -2,8 +2,6 @@
testing integer overflow (32bit)
--INI--
precision=14
---SKIPIF--
-<?php if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only"); ?>
--FILE--
<?php
diff --git a/Zend/tests/offset_bool.phpt b/Zend/tests/offset_bool.phpt
index 8357f99fc0..a08dd5450c 100644
--- a/Zend/tests/offset_bool.phpt
+++ b/Zend/tests/offset_bool.phpt
@@ -24,7 +24,7 @@ var_dump($bool[$arr]);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
NULL
diff --git a/Zend/tests/offset_long.phpt b/Zend/tests/offset_long.phpt
index 88eae14361..98b9b0f08b 100644
--- a/Zend/tests/offset_long.phpt
+++ b/Zend/tests/offset_long.phpt
@@ -24,7 +24,7 @@ var_dump($long[$arr]);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
NULL
diff --git a/Zend/tests/offset_null.phpt b/Zend/tests/offset_null.phpt
index e9f77a788e..c6ad6561db 100644
--- a/Zend/tests/offset_null.phpt
+++ b/Zend/tests/offset_null.phpt
@@ -24,7 +24,7 @@ var_dump($null[$arr]);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
NULL
diff --git a/Zend/tests/or_001.phpt b/Zend/tests/or_001.phpt
index de09cee825..43453b409e 100644
--- a/Zend/tests/or_001.phpt
+++ b/Zend/tests/or_001.phpt
@@ -21,7 +21,7 @@ var_dump($s);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(8) "3337>755"
string(8) "3337>755"
string(4) "wou"
diff --git a/Zend/tests/overloaded_func_001.phpt b/Zend/tests/overloaded_func_001.phpt
index 0b7360e8f9..31585d505a 100644
--- a/Zend/tests/overloaded_func_001.phpt
+++ b/Zend/tests/overloaded_func_001.phpt
@@ -2,7 +2,7 @@
Overloaded function 001
--SKIPIF--
<?php
-if (!class_exists('_ZendTestClass')) die("skip needs class with overloaded function");
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/overloaded_func_002.phpt b/Zend/tests/overloaded_func_002.phpt
index 2762f41840..a02f1e8e37 100644
--- a/Zend/tests/overloaded_func_002.phpt
+++ b/Zend/tests/overloaded_func_002.phpt
@@ -2,7 +2,7 @@
Overloaded function 002
--SKIPIF--
<?php
-if (!class_exists('_ZendTestClass')) die("skip needs class with overloaded function");
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/overloaded_prop_assign_op_refs.phpt b/Zend/tests/overloaded_prop_assign_op_refs.phpt
new file mode 100644
index 0000000000..3f39f4d2dd
--- /dev/null
+++ b/Zend/tests/overloaded_prop_assign_op_refs.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Handling of assign-ops and incdecs on overloaded properties using &__get()
+--FILE--
+<?php
+
+class Test {
+ protected $a = 0;
+ protected $b = 0;
+ protected $c = 0;
+
+ public function &__get($name) {
+ echo "get($name)\n";
+ return $this->$name;
+ }
+
+ public function __set($name, $value) {
+ echo "set($name, $value)\n";
+ }
+}
+
+$test = new Test;
+
+var_dump($test->a += 1);
+var_dump($test->b++);
+var_dump(++$test->c);
+
+var_dump($test);
+
+?>
+--EXPECT--
+get(a)
+set(a, 1)
+int(1)
+get(b)
+set(b, 1)
+int(0)
+get(c)
+set(c, 1)
+int(1)
+object(Test)#1 (3) {
+ ["a":protected]=>
+ int(0)
+ ["b":protected]=>
+ int(0)
+ ["c":protected]=>
+ int(0)
+}
diff --git a/Zend/tests/return_types/003.phpt b/Zend/tests/return_types/003.phpt
index 676d668cb8..ed78d51823 100644
--- a/Zend/tests/return_types/003.phpt
+++ b/Zend/tests/return_types/003.phpt
@@ -7,7 +7,7 @@ function test1() : array {
}
test1();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of test1() must be of the type array, integer returned in %s:%d
+Fatal error: Uncaught TypeError: Return value of test1() must be of the type array, int returned in %s:%d
Stack trace:
#0 %s(%d): test1()
#1 {main}
diff --git a/Zend/tests/return_types/014.phpt b/Zend/tests/return_types/014.phpt
index 468979d5d9..655c5a9cc6 100644
--- a/Zend/tests/return_types/014.phpt
+++ b/Zend/tests/return_types/014.phpt
@@ -7,4 +7,4 @@ class Foo {
function __construct() : Foo {}
}
--EXPECTF--
-Fatal error: Constructor %s::%s() cannot declare a return type in %s on line %s
+Fatal error: Constructor %s::%s() cannot declare a return type in %s on line %d
diff --git a/Zend/tests/return_types/018.phpt b/Zend/tests/return_types/018.phpt
index 4e93e70ea1..2512c6cf49 100644
--- a/Zend/tests/return_types/018.phpt
+++ b/Zend/tests/return_types/018.phpt
@@ -7,4 +7,4 @@ class Foo {
function __destruct() : Foo {}
}
--EXPECTF--
-Fatal error: Destructor %s::%s() cannot declare a return type in %s on line %s
+Fatal error: Destructor %s::%s() cannot declare a return type in %s on line %d
diff --git a/Zend/tests/return_types/019.phpt b/Zend/tests/return_types/019.phpt
index f665ebde78..166b624563 100644
--- a/Zend/tests/return_types/019.phpt
+++ b/Zend/tests/return_types/019.phpt
@@ -7,4 +7,4 @@ class Foo {
function __clone() : Foo {}
}
--EXPECTF--
-Fatal error: %s::%s() cannot declare a return type in %s on line %s
+Fatal error: %s::%s() cannot declare a return type in %s on line %d
diff --git a/Zend/tests/return_types/022.phpt b/Zend/tests/return_types/022.phpt
index cf5bb4f672..b0686ea8ab 100644
--- a/Zend/tests/return_types/022.phpt
+++ b/Zend/tests/return_types/022.phpt
@@ -11,5 +11,5 @@ $test = function() use($foo) : Closure {
$callable = $test();
var_dump($callable());
---EXPECTF--
+--EXPECT--
string(3) "bar"
diff --git a/Zend/tests/return_types/023.phpt b/Zend/tests/return_types/023.phpt
index 70202bce58..e8e8732ef1 100644
--- a/Zend/tests/return_types/023.phpt
+++ b/Zend/tests/return_types/023.phpt
@@ -9,4 +9,4 @@ class Foo {
--EXPECTF--
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Foo has a deprecated constructor in %s on line %d
-Fatal error: Constructor %s::%s() cannot declare a return type in %s on line %s
+Fatal error: Constructor %s::%s() cannot declare a return type in %s on line %d
diff --git a/Zend/tests/return_types/030.phpt b/Zend/tests/return_types/030.phpt
index 0550f6f40b..fc41fa6ee6 100644
--- a/Zend/tests/return_types/030.phpt
+++ b/Zend/tests/return_types/030.phpt
@@ -16,7 +16,7 @@ foo(0);
ok
ok
-Fatal error: Uncaught TypeError: Return value of foo() must be of the type array or null, integer returned in %s030.php:3
+Fatal error: Uncaught TypeError: Return value of foo() must be of the type array or null, int returned in %s030.php:3
Stack trace:
#0 %s030.php(10): foo(0)
#1 {main}
diff --git a/Zend/tests/return_types/bug70557.phpt b/Zend/tests/return_types/bug70557.phpt
index 8cc123a581..cb4eb498b9 100644
--- a/Zend/tests/return_types/bug70557.phpt
+++ b/Zend/tests/return_types/bug70557.phpt
@@ -16,4 +16,4 @@ try {
}
?>
--EXPECT--
-string(72) "Return value of getNumber() must be of the type integer, string returned"
+string(68) "Return value of getNumber() must be of the type int, string returned"
diff --git a/Zend/tests/return_types/internal_functions001.phpt b/Zend/tests/return_types/internal_functions001.phpt
index 5dfd2784da..7ec5b9c08f 100644
--- a/Zend/tests/return_types/internal_functions001.phpt
+++ b/Zend/tests/return_types/internal_functions001.phpt
@@ -2,7 +2,7 @@
Return type for internal functions
--SKIPIF--
<?php
-if (!function_exists('zend_test_array_return')) die('skip');
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
// Internal function return types are only checked in debug builds
if (!PHP_DEBUG) die('skip requires debug build');
?>
diff --git a/Zend/tests/return_types/internal_functions002.phpt b/Zend/tests/return_types/internal_functions002.phpt
index 0daf3481c8..531b6c452d 100644
--- a/Zend/tests/return_types/internal_functions002.phpt
+++ b/Zend/tests/return_types/internal_functions002.phpt
@@ -2,7 +2,7 @@
Return type for internal functions 2
--SKIPIF--
<?php
-if (!function_exists('zend_test_nullable_array_return')) die('skip');
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
--FILE--
<?php
zend_test_nullable_array_return();
diff --git a/Zend/tests/return_types/internal_functions003.phpt b/Zend/tests/return_types/internal_functions003.phpt
new file mode 100644
index 0000000000..a7e71204fa
--- /dev/null
+++ b/Zend/tests/return_types/internal_functions003.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Return type for internal functions 3: Void return type
+--SKIPIF--
+<?php
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+--FILE--
+<?php
+var_dump(zend_test_void_return());
+?>
+--EXPECT--
+NULL
diff --git a/Zend/tests/return_types/reflection001.phpt b/Zend/tests/return_types/reflection001.phpt
index 4c84b6524f..c2ff253cdb 100644
--- a/Zend/tests/return_types/reflection001.phpt
+++ b/Zend/tests/return_types/reflection001.phpt
@@ -1,9 +1,5 @@
--TEST--
Return type and Reflection::export()
---SKIPIF--
-<?php
-if (!extension_loaded('reflection')) print 'skip';
-?>
--FILE--
<?php
@@ -14,6 +10,7 @@ class A {
}
ReflectionClass::export("A");
+?>
--EXPECTF--
Class [ <user> class A ] {
@@ %sreflection001.php 3-7
diff --git a/Zend/tests/return_types/return_reference_separation.phpt b/Zend/tests/return_types/return_reference_separation.phpt
index ae7312b591..0151e5ec31 100644
--- a/Zend/tests/return_types/return_reference_separation.phpt
+++ b/Zend/tests/return_types/return_reference_separation.phpt
@@ -24,7 +24,7 @@ var_dump(test3($a));
var_dump($a);
?>
---EXPECTF--
+--EXPECT--
string(3) "123"
int(123)
string(3) "123"
diff --git a/Zend/tests/return_types/rfc001.phpt b/Zend/tests/return_types/rfc001.phpt
index 6a17525b72..3fdbf3443c 100644
--- a/Zend/tests/return_types/rfc001.phpt
+++ b/Zend/tests/return_types/rfc001.phpt
@@ -9,7 +9,7 @@ function get_config(): array {
get_config();
--EXPECTF--
-Fatal error: Uncaught TypeError: Return value of get_config() must be of the type array, integer returned in %s:%d
+Fatal error: Uncaught TypeError: Return value of get_config() must be of the type array, int returned in %s:%d
Stack trace:
#0 %s(%d): get_config()
#1 {main}
diff --git a/Zend/tests/return_types/rfc002.phpt b/Zend/tests/return_types/rfc002.phpt
index d7c7d28fd0..a2c326c24a 100644
--- a/Zend/tests/return_types/rfc002.phpt
+++ b/Zend/tests/return_types/rfc002.phpt
@@ -7,5 +7,5 @@ function answer(): int {
}
var_dump(answer());
---EXPECTF--
+--EXPECT--
int(42)
diff --git a/Zend/tests/settype_bool.phpt b/Zend/tests/settype_bool.phpt
index 4413996724..06b003ac86 100644
--- a/Zend/tests/settype_bool.phpt
+++ b/Zend/tests/settype_bool.phpt
@@ -36,7 +36,7 @@ foreach ($vars as $var) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
bool(true)
bool(true)
bool(false)
diff --git a/Zend/tests/settype_null.phpt b/Zend/tests/settype_null.phpt
index ddf3601914..e98b71ae8a 100644
--- a/Zend/tests/settype_null.phpt
+++ b/Zend/tests/settype_null.phpt
@@ -36,7 +36,7 @@ foreach ($vars as $var) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
NULL
diff --git a/Zend/tests/this_in_extract.phpt b/Zend/tests/this_in_extract.phpt
index de8da3d0a5..9903d7d794 100644
--- a/Zend/tests/this_in_extract.phpt
+++ b/Zend/tests/this_in_extract.phpt
@@ -3,15 +3,17 @@ $this re-assign in extract()
--FILE--
<?php
function foo() {
- extract(["this"=>42]);
- var_dump($this);
+ try {
+ extract(["this"=>42, "a"=>24]);
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ var_dump($a);
}
foo();
?>
--EXPECTF--
-Fatal error: Uncaught Error: Cannot re-assign $this in %sthis_in_extract.php:3
-Stack trace:
-#0 %sthis_in_extract.php(3): extract(Array)
-#1 %sthis_in_extract.php(6): foo()
-#2 {main}
- thrown in %sthis_in_extract.php on line 3
+Cannot re-assign $this
+
+Notice: Undefined variable: a in %s on line %d
+NULL
diff --git a/Zend/tests/traits/bug55554c.phpt b/Zend/tests/traits/bug55554c.phpt
index ddb6e66d19..420689259e 100644
--- a/Zend/tests/traits/bug55554c.phpt
+++ b/Zend/tests/traits/bug55554c.phpt
@@ -40,5 +40,5 @@ class ReportCollision {
echo "ReportCollision: ";
$o = new ReportCollision;
---EXPECTF--
+--EXPECT--
ReportCollision: New constructor executed
diff --git a/Zend/tests/traits/bug60217a.phpt b/Zend/tests/traits/bug60217a.phpt
index 2eb191c45e..20132370c1 100644
--- a/Zend/tests/traits/bug60217a.phpt
+++ b/Zend/tests/traits/bug60217a.phpt
@@ -21,5 +21,5 @@ class C {
$o = new C;
$o->foo();
---EXPECTF--
+--EXPECT--
C::foo() works.
diff --git a/Zend/tests/traits/bug61998.phpt b/Zend/tests/traits/bug61998.phpt
index 4e811ba67c..097073892f 100644
--- a/Zend/tests/traits/bug61998.phpt
+++ b/Zend/tests/traits/bug61998.phpt
@@ -57,7 +57,7 @@ $b->func2(); //from Bar
$b->newFunc2(); //from T2
$b->newFunc3(); //from T2
$b->func3(); //from Bar
---EXPECTF--
+--EXPECT--
From T1
From Foo
From T1
diff --git a/Zend/tests/traits/bug63911.phpt b/Zend/tests/traits/bug63911.phpt
new file mode 100644
index 0000000000..72892cdd34
--- /dev/null
+++ b/Zend/tests/traits/bug63911.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #63911 (Ignore conflicting trait methods originationg from identical sub traits)
+--FILE--
+<?php
+trait A
+{
+ public function a(){
+ echo 'Done';
+ }
+}
+trait B
+{
+ use A;
+}
+trait C
+{
+ use A;
+}
+class D
+{
+ use B, C;
+}
+
+(new D)->a();
+--EXPECT--
+Done
diff --git a/Zend/tests/traits/bug65576a.phpt b/Zend/tests/traits/bug65576a.phpt
index 5f2e3c5076..51d2463808 100644
--- a/Zend/tests/traits/bug65576a.phpt
+++ b/Zend/tests/traits/bug65576a.phpt
@@ -7,7 +7,7 @@ trait T
{
public function __construct()
{
- echo "Trait contructor\n";
+ echo "Trait constructor\n";
}
}
@@ -26,4 +26,4 @@ class B extends A
new B();
--EXPECT--
-Trait contructor
+Trait constructor
diff --git a/Zend/tests/traits/bug65576b.phpt b/Zend/tests/traits/bug65576b.phpt
index 772196c481..c13ce8c2e1 100644
--- a/Zend/tests/traits/bug65576b.phpt
+++ b/Zend/tests/traits/bug65576b.phpt
@@ -8,7 +8,7 @@ trait T
public function __construct()
{
parent::__construct();
- echo "Trait contructor\n";
+ echo "Trait constructor\n";
}
}
@@ -28,4 +28,4 @@ class B extends A
new B();
--EXPECT--
Parent constructor
-Trait contructor
+Trait constructor
diff --git a/Zend/tests/traits/bug69579.phpt b/Zend/tests/traits/bug69579.phpt
index 009bddadca..94387ce3cd 100644
--- a/Zend/tests/traits/bug69579.phpt
+++ b/Zend/tests/traits/bug69579.phpt
@@ -2,7 +2,7 @@
Bug #69579 (Internal trait double-free)
--SKIPIF--
<?php
-if (!trait_exists('_ZendTestTrait')) die("skip requires internal trait");
+if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/traits/bug74922.phpt b/Zend/tests/traits/bug74922.phpt
new file mode 100644
index 0000000000..16272b8f68
--- /dev/null
+++ b/Zend/tests/traits/bug74922.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #74922 (Composed class has fatal error with duplicate, equal const properties)
+--FILE--
+<?php
+
+const VALUE = true;
+
+trait Foo {public $var = VALUE;}
+trait Bar {public $var = VALUE;}
+class Baz {use Foo, Bar;}
+
+echo "DONE";
+
+?>
+--EXPECT--
+DONE
diff --git a/Zend/tests/traits/bug74922a.phpt b/Zend/tests/traits/bug74922a.phpt
new file mode 100644
index 0000000000..40617bcdc8
--- /dev/null
+++ b/Zend/tests/traits/bug74922a.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #74922 (Composed class has fatal error with duplicate, equal const properties)
+--FILE--
+<?php
+
+const VALUE = true;
+
+trait Foo {public $var = VALUE;}
+trait Bar {public $var = true;}
+class Baz {use Foo, Bar;}
+
+echo "DONE";
+
+?>
+--EXPECT--
+DONE
diff --git a/Zend/tests/traits/bug74922b.inc b/Zend/tests/traits/bug74922b.inc
new file mode 100644
index 0000000000..b64ee21985
--- /dev/null
+++ b/Zend/tests/traits/bug74922b.inc
@@ -0,0 +1,9 @@
+<?php
+
+namespace Bug74922;
+
+const FOO = 'foo';
+
+trait T1 {
+ public $var = FOO;
+}
diff --git a/Zend/tests/traits/bug74922b.phpt b/Zend/tests/traits/bug74922b.phpt
new file mode 100644
index 0000000000..9a0f23546a
--- /dev/null
+++ b/Zend/tests/traits/bug74922b.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #74922 (Composed class has fatal error with duplicate, equal const properties)
+--FILE--
+<?php
+
+require('bug74922b.inc');
+
+trait T2 {public $var = Bug74922\FOO;}
+class Baz {use Bug74922\T1, T2;}
+
+echo "DONE";
+
+?>
+--EXPECT--
+DONE
diff --git a/Zend/tests/traits/bug74922c.phpt b/Zend/tests/traits/bug74922c.phpt
new file mode 100644
index 0000000000..367bbf4eab
--- /dev/null
+++ b/Zend/tests/traits/bug74922c.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #74922 (Composed class has fatal error with duplicate, equal const properties)
+--FILE--
+<?php
+
+trait T {
+ public $x = self::X;
+}
+trait T2 {
+ public $x = self::X;
+}
+class C {
+ use T, T2;
+ const X = 42;
+}
+var_dump((new C)->x);
+
+?>
+--EXPECT--
+int(42)
diff --git a/Zend/tests/traits/bug75607.phpt b/Zend/tests/traits/bug75607.phpt
index a3a10425f4..e466e6333b 100644
--- a/Zend/tests/traits/bug75607.phpt
+++ b/Zend/tests/traits/bug75607.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #75607 (Comparision of initial static properties failing)
+Bug #75607 (Comparison of initial static properties failing)
--FILE--
<?php
diff --git a/Zend/tests/traits/bug75607a.phpt b/Zend/tests/traits/bug75607a.phpt
index 2989814f39..12b555f728 100644
--- a/Zend/tests/traits/bug75607a.phpt
+++ b/Zend/tests/traits/bug75607a.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #75607 (Comparision of initial static properties failing)
+Bug #75607 (Comparison of initial static properties failing)
--FILE--
<?php
diff --git a/Zend/tests/traits/bug76539.phpt b/Zend/tests/traits/bug76539.phpt
new file mode 100644
index 0000000000..51a75cdaf6
--- /dev/null
+++ b/Zend/tests/traits/bug76539.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #76539 (Trait attribute is set incorrectly when using self::class with another string)
+--FILE--
+<?php
+trait MyTrait {
+ protected $attr = self::class . 'Test';
+
+ public function test() {
+ echo $this->attr, PHP_EOL;
+ }
+}
+
+class A {
+ use MyTrait;
+}
+
+class B {
+ use MyTrait;
+}
+
+(new A())->test();
+(new B())->test();
+?>
+--EXPECT--
+ATest
+BTest
diff --git a/Zend/tests/traits/bug76700.phpt b/Zend/tests/traits/bug76700.phpt
new file mode 100644
index 0000000000..a9797f3c9e
--- /dev/null
+++ b/Zend/tests/traits/bug76700.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #76700 (false-positive "Error: Call to protected method" when using trait aliases)
+--FILE--
+<?php
+trait T1
+{
+ protected function aa() { echo 123; }
+}
+
+trait T2
+{
+ use T1 {
+ aa as public;
+ }
+}
+
+class A
+{
+ use T1;
+}
+
+class B extends A
+{
+ use T2;
+}
+
+$b = new B();
+$b->aa();
+--EXPECT--
+123
diff --git a/Zend/tests/traits/bug76773.phpt b/Zend/tests/traits/bug76773.phpt
new file mode 100644
index 0000000000..683952025d
--- /dev/null
+++ b/Zend/tests/traits/bug76773.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #76773 (Traits used on the parent are ignored for child classes)
+--FILE--
+<?php
+
+trait MyTrait
+{
+ public function hello()
+ {
+ echo __CLASS__, "\n";
+
+ if (\is_callable(array('parent', __FUNCTION__))) {
+ parent::hello();
+ }
+ }
+}
+
+class ParentClass
+{
+ use MyTrait;
+}
+
+class ChildClass extends ParentClass
+{
+ use MyTrait;
+}
+
+$c = new ChildClass();
+$c->hello();
+--EXPECT--
+ChildClass
+ParentClass
diff --git a/Zend/tests/traits/bugs/abstract-methods02.phpt b/Zend/tests/traits/bugs/abstract-methods02.phpt
index 75acda45ba..73bb65d179 100644
--- a/Zend/tests/traits/bugs/abstract-methods02.phpt
+++ b/Zend/tests/traits/bugs/abstract-methods02.phpt
@@ -22,5 +22,5 @@ class TraitsTest {
$test = new TraitsTest();
$test->hello();
?>
---EXPECTF--
+--EXPECT--
Hello
diff --git a/Zend/tests/traits/bugs/abstract-methods03.phpt b/Zend/tests/traits/bugs/abstract-methods03.phpt
index 6d791e07dc..b871bc8e4b 100644
--- a/Zend/tests/traits/bugs/abstract-methods03.phpt
+++ b/Zend/tests/traits/bugs/abstract-methods03.phpt
@@ -18,5 +18,5 @@ class TraitsTest {
$test = new TraitsTest();
$test->hello();
?>
---EXPECTF--
+--EXPECT--
Hello
diff --git a/Zend/tests/traits/bugs/abstract-methods04.phpt b/Zend/tests/traits/bugs/abstract-methods04.phpt
index d80e3dcdce..d15bdd9473 100644
--- a/Zend/tests/traits/bugs/abstract-methods04.phpt
+++ b/Zend/tests/traits/bugs/abstract-methods04.phpt
@@ -32,5 +32,5 @@ $test = new TraitsTest2();
$test->hello();
?>
---EXPECTF--
+--EXPECT--
HelloHello
diff --git a/Zend/tests/traits/bugs/alias-semantics.phpt b/Zend/tests/traits/bugs/alias-semantics.phpt
index 272050788a..eec2de1aff 100644
--- a/Zend/tests/traits/bugs/alias-semantics.phpt
+++ b/Zend/tests/traits/bugs/alias-semantics.phpt
@@ -19,5 +19,5 @@ $test->a();
$test->b();
?>
---EXPECTF--
+--EXPECT--
AA
diff --git a/Zend/tests/traits/bugs/alias-semantics02.phpt b/Zend/tests/traits/bugs/alias-semantics02.phpt
index 250aacafdf..bcd75d9cf9 100644
--- a/Zend/tests/traits/bugs/alias-semantics02.phpt
+++ b/Zend/tests/traits/bugs/alias-semantics02.phpt
@@ -21,5 +21,5 @@ $test->a();
$test->b();
?>
---EXPECTF--
+--EXPECT--
AA
diff --git a/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt b/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt
index 5d82220671..1029dee634 100644
--- a/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt
+++ b/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt
@@ -27,5 +27,5 @@ class TraitsTest {
$test = new TraitsTest();
$test->hello();
?>
---EXPECTF--
+--EXPECT--
Hello
diff --git a/Zend/tests/traits/conflict002.phpt b/Zend/tests/traits/conflict002.phpt
index 23270c3da3..1327de1458 100644
--- a/Zend/tests/traits/conflict002.phpt
+++ b/Zend/tests/traits/conflict002.phpt
@@ -28,5 +28,5 @@ class TheWorldIsNotEnough {
$o = new TheWorldIsNotEnough();
$o->sayHello(); // echos Hello Universe!
?>
---EXPECTF--
+--EXPECT--
Hello Universe!
diff --git a/Zend/tests/traits/flattening001.phpt b/Zend/tests/traits/flattening001.phpt
index 3b17833a31..db72182bb3 100644
--- a/Zend/tests/traits/flattening001.phpt
+++ b/Zend/tests/traits/flattening001.phpt
@@ -36,7 +36,7 @@ $o->setText('bar');
var_dump($o->getText());
?>
---EXPECTF--
+--EXPECT--
string(4) "test"
string(3) "foo"
string(3) "bar"
diff --git a/Zend/tests/traits/flattening002.phpt b/Zend/tests/traits/flattening002.phpt
index 56621a4a21..810681072b 100644
--- a/Zend/tests/traits/flattening002.phpt
+++ b/Zend/tests/traits/flattening002.phpt
@@ -24,5 +24,5 @@ class MyHelloWorld extends Base {
$o = new MyHelloWorld();
$o->sayHello();
?>
---EXPECTF--
+--EXPECT--
Hello World!
diff --git a/Zend/tests/traits/flattening003.phpt b/Zend/tests/traits/flattening003.phpt
index 53e0043a7b..0b4d87a295 100644
--- a/Zend/tests/traits/flattening003.phpt
+++ b/Zend/tests/traits/flattening003.phpt
@@ -28,5 +28,5 @@ $o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
---EXPECTF--
+--EXPECT--
Hello World!
diff --git a/Zend/tests/traits/inheritance001.phpt b/Zend/tests/traits/inheritance001.phpt
index d5f64c9a35..60c5fcfc0b 100644
--- a/Zend/tests/traits/inheritance001.phpt
+++ b/Zend/tests/traits/inheritance001.phpt
@@ -20,5 +20,5 @@ class TheWorldIsNotEnough {
$o = new TheWorldIsNotEnough();
$o->sayHello(); // echos Hello Universe!
?>
---EXPECTF--
+--EXPECT--
Hello Universe!
diff --git a/Zend/tests/traits/inheritance002.phpt b/Zend/tests/traits/inheritance002.phpt
index 89bfef0826..31c63a0f25 100644
--- a/Zend/tests/traits/inheritance002.phpt
+++ b/Zend/tests/traits/inheritance002.phpt
@@ -23,5 +23,5 @@ class MyHelloWorld extends Base {
$o = new MyHelloWorld();
$o->sayHello();
?>
---EXPECTF--
+--EXPECT--
World!
diff --git a/Zend/tests/traits/language001.phpt b/Zend/tests/traits/language001.phpt
index e85dd5fb2f..fd9ec2ddc2 100644
--- a/Zend/tests/traits/language001.phpt
+++ b/Zend/tests/traits/language001.phpt
@@ -17,5 +17,5 @@ class TraitsTest {
$test = new TraitsTest();
$test->hello();
?>
---EXPECTF--
+--EXPECT--
Hello
diff --git a/Zend/tests/traits/language002.phpt b/Zend/tests/traits/language002.phpt
index 0093d88735..2f336b8b8b 100644
--- a/Zend/tests/traits/language002.phpt
+++ b/Zend/tests/traits/language002.phpt
@@ -28,5 +28,5 @@ $o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
---EXPECTF--
+--EXPECT--
Hello World!
diff --git a/Zend/tests/traits/language003.phpt b/Zend/tests/traits/language003.phpt
index 0dc095f8e1..9525b65b3a 100644
--- a/Zend/tests/traits/language003.phpt
+++ b/Zend/tests/traits/language003.phpt
@@ -25,5 +25,5 @@ class MyHelloWorld {
$o = new MyHelloWorld();
$o->saySomething();
?>
---EXPECTF--
+--EXPECT--
Hello
diff --git a/Zend/tests/traits/language004.phpt b/Zend/tests/traits/language004.phpt
index cd4f03a1df..76959d011d 100644
--- a/Zend/tests/traits/language004.phpt
+++ b/Zend/tests/traits/language004.phpt
@@ -27,5 +27,5 @@ $o = new MyHelloWorld();
$o->saySomething();
$o->sayWorld();
?>
---EXPECTF--
+--EXPECT--
Hello World
diff --git a/Zend/tests/traits/language005.phpt b/Zend/tests/traits/language005.phpt
index 5cd519f621..762c1e4ac5 100644
--- a/Zend/tests/traits/language005.phpt
+++ b/Zend/tests/traits/language005.phpt
@@ -36,5 +36,5 @@ $t->bigTalk();
$t->talk();
?>
---EXPECTF--
+--EXPECT--
bAB
diff --git a/Zend/tests/traits/language006.phpt b/Zend/tests/traits/language006.phpt
index 6afd75ee89..2ed2fa9c21 100644
--- a/Zend/tests/traits/language006.phpt
+++ b/Zend/tests/traits/language006.phpt
@@ -27,5 +27,5 @@ $o->setWorld(' World!');
$o->sayHelloWorld();
?>
---EXPECTF--
+--EXPECT--
Hello World!
diff --git a/Zend/tests/traits/language007.phpt b/Zend/tests/traits/language007.phpt
index 860d829b75..67cb7f86c2 100644
--- a/Zend/tests/traits/language007.phpt
+++ b/Zend/tests/traits/language007.phpt
@@ -26,5 +26,5 @@ $o->sayHello();
$o->sayWorld();
?>
---EXPECTF--
+--EXPECT--
Hello World!
diff --git a/Zend/tests/traits/language009.phpt b/Zend/tests/traits/language009.phpt
index b44dfa661a..0672532195 100644
--- a/Zend/tests/traits/language009.phpt
+++ b/Zend/tests/traits/language009.phpt
@@ -32,5 +32,5 @@ $t = new MyClass;
$t->foo();
?>
---EXPECTF--
+--EXPECT--
b
diff --git a/Zend/tests/traits/language012.phpt b/Zend/tests/traits/language012.phpt
index 439099d93a..3fe7fb8e62 100644
--- a/Zend/tests/traits/language012.phpt
+++ b/Zend/tests/traits/language012.phpt
@@ -22,6 +22,6 @@ $o->inc();
$o->inc();
?>
---EXPECTF--
+--EXPECT--
1
2
diff --git a/Zend/tests/traits/language013.phpt b/Zend/tests/traits/language013.phpt
index ec245b3fee..d3de644756 100644
--- a/Zend/tests/traits/language013.phpt
+++ b/Zend/tests/traits/language013.phpt
@@ -30,7 +30,7 @@ $p->inc();
$p->inc();
?>
---EXPECTF--
+--EXPECT--
1
2
1
diff --git a/Zend/tests/traits/property001.phpt b/Zend/tests/traits/property001.phpt
index eb1c5a520e..291037da07 100644
--- a/Zend/tests/traits/property001.phpt
+++ b/Zend/tests/traits/property001.phpt
@@ -1,5 +1,5 @@
--TEST--
-Potentially conflicting properties should result in a strict notice. Property use is discorage for traits that are supposed to enable maintainable code reuse. Accessor methods are the language supported idiom for this.
+"Potentially" conflicting trait properties do not result in a strict standards notice anymore
--FILE--
<?php
error_reporting(E_ALL);
@@ -13,15 +13,12 @@ trait THello2 {
}
echo "PRE-CLASS-GUARD-TraitsTest\n";
-error_reporting(E_ALL & ~E_STRICT); // ensuring that it is only for E_STRICT
class TraitsTest {
use THello1;
use THello2;
}
-error_reporting(E_ALL | E_STRICT);
-
echo "PRE-CLASS-GUARD-TraitsTest2\n";
class TraitsTest2 {
@@ -32,7 +29,7 @@ class TraitsTest2 {
var_dump(property_exists('TraitsTest', 'foo'));
var_dump(property_exists('TraitsTest2', 'foo'));
?>
---EXPECTF--
+--EXPECT--
PRE-CLASS-GUARD-TraitsTest
PRE-CLASS-GUARD-TraitsTest2
bool(true)
diff --git a/Zend/tests/traits/property002.phpt b/Zend/tests/traits/property002.phpt
index d33c3199a4..ecd04fb332 100644
--- a/Zend/tests/traits/property002.phpt
+++ b/Zend/tests/traits/property002.phpt
@@ -2,7 +2,6 @@
Non-conflicting properties should work just fine.
--FILE--
<?php
-error_reporting(E_ALL);
trait THello1 {
public $hello = "hello";
@@ -26,7 +25,7 @@ var_dump(property_exists('TraitsTest', 'world'));
$t = new TraitsTest;
$t->test();
?>
---EXPECTF--
+--EXPECT--
bool(true)
bool(true)
hello World!
diff --git a/Zend/tests/traits/property003.phpt b/Zend/tests/traits/property003.phpt
index cf64d4d370..5a2863cfe1 100644
--- a/Zend/tests/traits/property003.phpt
+++ b/Zend/tests/traits/property003.phpt
@@ -2,7 +2,6 @@
Conflicting properties with different visibility modifiers should result in a fatal error, since this indicates that the code is incompatible.
--FILE--
<?php
-error_reporting(E_ALL);
trait THello1 {
public $hello;
diff --git a/Zend/tests/traits/property004.phpt b/Zend/tests/traits/property004.phpt
index 9d7d0aa72c..53dca02e02 100644
--- a/Zend/tests/traits/property004.phpt
+++ b/Zend/tests/traits/property004.phpt
@@ -2,7 +2,6 @@
Conflicting properties with different initial values are considered incompatible.
--FILE--
<?php
-error_reporting(E_ALL);
trait THello1 {
public $hello = "foo";
diff --git a/Zend/tests/traits/property005.phpt b/Zend/tests/traits/property005.phpt
index 135f28a342..5bdbfcdaba 100644
--- a/Zend/tests/traits/property005.phpt
+++ b/Zend/tests/traits/property005.phpt
@@ -1,8 +1,7 @@
--TEST--
-The same rules are applied for properties that are defined in the class hierarchy. Thus, if the properties are compatible, a notice is issued, if not a fatal error occures.
+The same rules are applied for properties that are defined in the class hierarchy. Thus, if the properties are incompatible a fatal error occurs.
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
private $hello;
diff --git a/Zend/tests/traits/property006.phpt b/Zend/tests/traits/property006.phpt
index 0dd80d8ba2..bbb364e8fc 100644
--- a/Zend/tests/traits/property006.phpt
+++ b/Zend/tests/traits/property006.phpt
@@ -1,8 +1,7 @@
--TEST--
-Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consitent with normal inheritance handling.
+Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consistent with normal inheritance handling.
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
private $hello;
@@ -29,7 +28,7 @@ class Notice extends Base {
}
echo "POST-CLASS-GUARD2\n";
?>
---EXPECTF--
+--EXPECT--
PRE-CLASS-GUARD
POST-CLASS-GUARD
POST-CLASS-GUARD2
diff --git a/Zend/tests/traits/property007.phpt b/Zend/tests/traits/property007.phpt
index bdaca61ef2..ae52ef08e3 100644
--- a/Zend/tests/traits/property007.phpt
+++ b/Zend/tests/traits/property007.phpt
@@ -1,8 +1,7 @@
--TEST--
-Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consitent with normal inheritance handling.
+Introducing new private variables of the same name in a subclass is ok, and does not lead to any output. That is consistent with normal inheritance handling.
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class Base {
protected $hello;
@@ -28,7 +27,7 @@ class Notice extends Base {
}
echo "POST-CLASS-GUARD2\n";
?>
---EXPECTF--
+--EXPECT--
PRE-CLASS-GUARD
POST-CLASS-GUARD
POST-CLASS-GUARD2
diff --git a/Zend/tests/traits/property008.phpt b/Zend/tests/traits/property008.phpt
index c81ab3c001..ff265be2a0 100644
--- a/Zend/tests/traits/property008.phpt
+++ b/Zend/tests/traits/property008.phpt
@@ -2,7 +2,6 @@
Handling of private fields with traits needs to have same semantics as with normal inheritance.
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class BaseWithPropA {
private $hello = 0;
@@ -41,7 +40,7 @@ $b = new SubclassB;
var_dump($b);
?>
---EXPECTF--
+--EXPECT--
object(SubclassClassicInheritance)#1 (2) {
["hello":"SubclassClassicInheritance":private]=>
int(0)
diff --git a/Zend/tests/traits/property009.phpt b/Zend/tests/traits/property009.phpt
index 26eca0b940..1b05382c0d 100644
--- a/Zend/tests/traits/property009.phpt
+++ b/Zend/tests/traits/property009.phpt
@@ -2,7 +2,6 @@
Handling of public fields with traits needs to have same semantics as with normal inheritance, however, we do add strict warnings since it is easier to run into something unexpeted with changing traits.
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
class BaseWithPropA {
public $hello = 0;
@@ -41,7 +40,7 @@ $b = new SubclassB;
var_dump($b);
?>
---EXPECTF--
+--EXPECT--
object(SubclassClassicInheritance)#1 (1) {
["hello"]=>
int(0)
diff --git a/Zend/tests/try/catch_finally_001.phpt b/Zend/tests/try/catch_finally_001.phpt
index 0ae27cd480..0fa1404bcb 100644
--- a/Zend/tests/try/catch_finally_001.phpt
+++ b/Zend/tests/try/catch_finally_001.phpt
@@ -21,7 +21,7 @@ foo();
echo "\n";
foo(true);
?>
---EXPECTF--
+--EXPECT--
try
finally
end
diff --git a/Zend/tests/try/catch_finally_002.phpt b/Zend/tests/try/catch_finally_002.phpt
index c54477ff8c..07a576f2e5 100644
--- a/Zend/tests/try/catch_finally_002.phpt
+++ b/Zend/tests/try/catch_finally_002.phpt
@@ -15,7 +15,7 @@ function foo () {
var_dump(foo());
?>
---EXPECTF--
+--EXPECT--
try
finally
int(1)
diff --git a/Zend/tests/try/catch_finally_003.phpt b/Zend/tests/try/catch_finally_003.phpt
index 24e468d335..610d701872 100644
--- a/Zend/tests/try/catch_finally_003.phpt
+++ b/Zend/tests/try/catch_finally_003.phpt
@@ -32,7 +32,7 @@ function &bar($a) {
var_dump(foo("para"));
var_dump(bar("para"));
?>
---EXPECTF--
+--EXPECT--
string(3) "try"
string(7) "finally"
string(7) "finally"
diff --git a/Zend/tests/try/catch_finally_005.phpt b/Zend/tests/try/catch_finally_005.phpt
index c2fd55df27..7671d05df5 100644
--- a/Zend/tests/try/catch_finally_005.phpt
+++ b/Zend/tests/try/catch_finally_005.phpt
@@ -17,5 +17,5 @@ function foo ($a) {
var_dump(foo("para"));
?>
---EXPECTF--
+--EXPECT--
int(3)
diff --git a/Zend/tests/try/finally_goto_003.phpt b/Zend/tests/try/finally_goto_003.phpt
index 8529ff7865..9f4115fee6 100644
--- a/Zend/tests/try/finally_goto_003.phpt
+++ b/Zend/tests/try/finally_goto_003.phpt
@@ -11,5 +11,5 @@ test:
}
echo "okey";
?>
---EXPECTF--
+--EXPECT--
okey
diff --git a/Zend/tests/try/try_catch_finally_001.phpt b/Zend/tests/try/try_catch_finally_001.phpt
index 3d478f461a..641bb25442 100644
--- a/Zend/tests/try/try_catch_finally_001.phpt
+++ b/Zend/tests/try/try_catch_finally_001.phpt
@@ -32,5 +32,5 @@ function foo () {
var_dump(foo());
?>
---EXPECTF--
+--EXPECT--
1234int(1)
diff --git a/Zend/tests/try/try_catch_finally_002.phpt b/Zend/tests/try/try_catch_finally_002.phpt
index 79efcb3de8..07904fb158 100644
--- a/Zend/tests/try/try_catch_finally_002.phpt
+++ b/Zend/tests/try/try_catch_finally_002.phpt
@@ -38,5 +38,5 @@ function foo () {
var_dump(foo());
?>
---EXPECTF--
+--EXPECT--
123456int(7)
diff --git a/Zend/tests/try/try_catch_finally_003.phpt b/Zend/tests/try/try_catch_finally_003.phpt
index 7ec8ec82db..4d285eedb8 100644
--- a/Zend/tests/try/try_catch_finally_003.phpt
+++ b/Zend/tests/try/try_catch_finally_003.phpt
@@ -32,5 +32,5 @@ function foo () {
var_dump(foo());
?>
---EXPECTF--
+--EXPECT--
1234int(4)
diff --git a/Zend/tests/try/try_catch_finally_004.phpt b/Zend/tests/try/try_catch_finally_004.phpt
index eb8d0966a1..05318e0774 100644
--- a/Zend/tests/try/try_catch_finally_004.phpt
+++ b/Zend/tests/try/try_catch_finally_004.phpt
@@ -24,7 +24,7 @@ try {
}
var_dump("end");
?>
---EXPECTF--
+--EXPECT--
string(3) "try"
string(7) "finally"
string(8) "finally2"
diff --git a/Zend/tests/try/try_catch_finally_005.phpt b/Zend/tests/try/try_catch_finally_005.phpt
index dafeb6bbe0..9ff21c3e8b 100644
--- a/Zend/tests/try/try_catch_finally_005.phpt
+++ b/Zend/tests/try/try_catch_finally_005.phpt
@@ -39,7 +39,7 @@ for ($i = 0; $i < 3; $i ++) {
}
?>
---EXPECTF--
+--EXPECT--
string(5) "break"
string(9) "continue1"
string(9) "continue1"
diff --git a/Zend/tests/try/try_catch_finally_006.phpt b/Zend/tests/try/try_catch_finally_006.phpt
index 66db8cd97c..d6466ab5a7 100644
--- a/Zend/tests/try/try_catch_finally_006.phpt
+++ b/Zend/tests/try/try_catch_finally_006.phpt
@@ -28,7 +28,7 @@ var_dump(foo());
var_dump(foo(new Exception()));
?>
---EXPECTF--
+--EXPECT--
string(8) "finally1"
string(8) "finally2"
string(5) "label"
diff --git a/Zend/tests/try/try_catch_finally_007.phpt b/Zend/tests/try/try_catch_finally_007.phpt
index df8db61c90..7c2d5ea125 100644
--- a/Zend/tests/try/try_catch_finally_007.phpt
+++ b/Zend/tests/try/try_catch_finally_007.phpt
@@ -34,7 +34,7 @@ var_dump(foo());
var_dump(foo(true));
?>
---EXPECTF--
+--EXPECT--
string(8) "finally1"
string(7) "catched"
string(8) "finally2"
diff --git a/Zend/tests/try/try_finally_006.phpt b/Zend/tests/try/try_finally_006.phpt
index f53e6b5bc1..58113465e0 100644
--- a/Zend/tests/try/try_finally_006.phpt
+++ b/Zend/tests/try/try_finally_006.phpt
@@ -21,6 +21,6 @@ label:
foo();
?>
---EXPECTF--
+--EXPECT--
label
okey
diff --git a/Zend/tests/type_declarations/array_001.phpt b/Zend/tests/type_declarations/array_001.phpt
index 8fc368e288..c3315849a2 100644
--- a/Zend/tests/type_declarations/array_001.phpt
+++ b/Zend/tests/type_declarations/array_001.phpt
@@ -12,7 +12,7 @@ foo(123);
--EXPECTF--
3
-Fatal error: Uncaught TypeError: Argument 1 passed to foo() must be of the type array, integer given, called in %s on line 7 and defined in %s:2
+Fatal error: Uncaught TypeError: Argument 1 passed to foo() must be of the type array, int given, called in %s on line 7 and defined in %s:2
Stack trace:
#0 %s(%d): foo(123)
#1 {main}
diff --git a/Zend/tests/type_declarations/default_boolean_hint_values.phpt b/Zend/tests/type_declarations/default_boolean_hint_values.phpt
index 6ba262848d..6711de7733 100644
--- a/Zend/tests/type_declarations/default_boolean_hint_values.phpt
+++ b/Zend/tests/type_declarations/default_boolean_hint_values.phpt
@@ -11,6 +11,6 @@ function foo(bool $x = true, bool $y = false) {
foo();
?>
---EXPECTF--
+--EXPECT--
bool(true)
bool(false)
diff --git a/Zend/tests/type_declarations/explicit_weak_include_strict.phpt b/Zend/tests/type_declarations/explicit_weak_include_strict.phpt
index fb53d8ce11..9773775ae4 100644
--- a/Zend/tests/type_declarations/explicit_weak_include_strict.phpt
+++ b/Zend/tests/type_declarations/explicit_weak_include_strict.phpt
@@ -11,7 +11,7 @@ require 'weak_include_strict_2.inc';
// calls within that file should stay strict, despite being included by weak file
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type integer, float given, called in %sweak_include_strict_2.inc on line 9 and defined in %sweak_include_strict_2.inc:5
+Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type int, float given, called in %sweak_include_strict_2.inc on line 9 and defined in %sweak_include_strict_2.inc:5
Stack trace:
#0 %s(%d): takes_int(1)
#1 %s(%d): require('%s')
diff --git a/Zend/tests/type_declarations/internal_function_strict_mode.phpt b/Zend/tests/type_declarations/internal_function_strict_mode.phpt
index 4e792fa8d1..a9e7c9a56b 100644
--- a/Zend/tests/type_declarations/internal_function_strict_mode.phpt
+++ b/Zend/tests/type_declarations/internal_function_strict_mode.phpt
@@ -26,9 +26,9 @@ try {
}
?>
---EXPECTF--
+--EXPECT--
*** Trying Ord With Integer
-*** Caught ord() expects parameter 1 to be string, integer given
+*** Caught ord() expects parameter 1 to be string, int given
*** Trying Array Map With Invalid Callback
*** Caught array_map() expects parameter 1 to be a valid callback, first array member is not a valid class name or object
*** Trying Strlen With Float
diff --git a/Zend/tests/type_declarations/iterable_001.phpt b/Zend/tests/type_declarations/iterable_001.phpt
index c6f2a0765d..b6755c49b9 100644
--- a/Zend/tests/type_declarations/iterable_001.phpt
+++ b/Zend/tests/type_declarations/iterable_001.phpt
@@ -44,4 +44,4 @@ object(ArrayIterator)#1 (1) {
int(3)
}
}
-Argument 1 passed to test() must be iterable, integer given, called in %s on line %d
+Argument 1 passed to test() must be iterable, int given, called in %s on line %d
diff --git a/Zend/tests/type_declarations/iterable_003.phpt b/Zend/tests/type_declarations/iterable_003.phpt
index 8c91c993d0..e5e6af9ae8 100644
--- a/Zend/tests/type_declarations/iterable_003.phpt
+++ b/Zend/tests/type_declarations/iterable_003.phpt
@@ -29,4 +29,4 @@ array(0) {
}
object(Generator)#2 (0) {
}
-Return value of baz() must be iterable, integer returned
+Return value of baz() must be iterable, int returned
diff --git a/Zend/tests/type_declarations/scalar_basic.phpt b/Zend/tests/type_declarations/scalar_basic.phpt
index a8dc4818ed..1253f48c16 100644
--- a/Zend/tests/type_declarations/scalar_basic.phpt
+++ b/Zend/tests/type_declarations/scalar_basic.phpt
@@ -78,16 +78,16 @@ E_NOTICE: A non well formed numeric value encountered on line %d
int(1)
*** Trying string(1) "a"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying string(0) ""
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying int(%d)
int(%d)
*** Trying float(NAN)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying bool(true)
int(1)
@@ -96,22 +96,22 @@ int(1)
int(0)
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, array given, called in %s on line %d
*** Trying object(stdClass)#%s (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying object(Stringable)#%s (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying resource(%d) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, resource given, called in %s on line %d
Testing 'float' type:
@@ -256,21 +256,21 @@ bool(true)
bool(false)
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, array given, called in %s on line %d
*** Trying object(stdClass)#%s (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying object(Stringable)#%s (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying resource(%d) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, resource given, called in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_constant_defaults.phpt b/Zend/tests/type_declarations/scalar_constant_defaults.phpt
index 2982d9b2af..b9076c6b52 100644
--- a/Zend/tests/type_declarations/scalar_constant_defaults.phpt
+++ b/Zend/tests/type_declarations/scalar_constant_defaults.phpt
@@ -64,7 +64,7 @@ echo "Testing int with null null constant" . PHP_EOL;
var_dump(int_val_default_null(null));
?>
---EXPECTF--
+--EXPECT--
Testing int val
int(10)
Testing float val
diff --git a/Zend/tests/type_declarations/scalar_constant_defaults_error.phpt b/Zend/tests/type_declarations/scalar_constant_defaults_error.phpt
index dcbb3e87f4..750edb77fa 100644
--- a/Zend/tests/type_declarations/scalar_constant_defaults_error.phpt
+++ b/Zend/tests/type_declarations/scalar_constant_defaults_error.phpt
@@ -13,7 +13,7 @@ var_dump(int_val());
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to int_val() must be of the type integer, string given, called in %s on line %d and defined in %s:%d
+Fatal error: Uncaught TypeError: Argument 1 passed to int_val() must be of the type int, string given, called in %s on line %d and defined in %s:%d
Stack trace:
#0 %s(%d): int_val()
#1 {main}
diff --git a/Zend/tests/type_declarations/scalar_null.phpt b/Zend/tests/type_declarations/scalar_null.phpt
index 6b9930f297..767e36e914 100644
--- a/Zend/tests/type_declarations/scalar_null.phpt
+++ b/Zend/tests/type_declarations/scalar_null.phpt
@@ -37,13 +37,13 @@ echo PHP_EOL . "Done";
?>
--EXPECTF--
Testing int:
-*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, null given, called in %s on line %d
Testing float:
*** Caught Argument 1 passed to {closure}() must be of the type float, null given, called in %s on line %d
Testing string:
*** Caught Argument 1 passed to {closure}() must be of the type string, null given, called in %s on line %d
Testing bool:
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, null given, called in %s on line %d
Testing int nullable:
NULL
Testing float nullable:
diff --git a/Zend/tests/type_declarations/scalar_return_basic.phpt b/Zend/tests/type_declarations/scalar_return_basic.phpt
index 4e0650e7e9..dd7a3daf85 100644
--- a/Zend/tests/type_declarations/scalar_return_basic.phpt
+++ b/Zend/tests/type_declarations/scalar_return_basic.phpt
@@ -76,30 +76,30 @@ int(1)
E_NOTICE: A non well formed numeric value encountered on line %d
int(1)
*** Trying string(1) "a"
-*** Caught Return value of {closure}() must be of the type integer, string returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, string returned in %s on line %d
*** Trying string(0) ""
-*** Caught Return value of {closure}() must be of the type integer, string returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, string returned in %s on line %d
*** Trying int(2147483647)
int(2147483647)
*** Trying float(NAN)
-*** Caught Return value of {closure}() must be of the type integer, float returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, float returned in %s on line %d
*** Trying bool(true)
int(1)
*** Trying bool(false)
int(0)
*** Trying NULL
-*** Caught Return value of {closure}() must be of the type integer, null returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, null returned in %s on line %d
*** Trying array(0) {
}
-*** Caught Return value of {closure}() must be of the type integer, array returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, array returned in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Return value of {closure}() must be of the type integer, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, object returned in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Return value of {closure}() must be of the type integer, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, object returned in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Return value of {closure}() must be of the type integer, resource returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, resource returned in %s on line %d
Testing 'float' type:
*** Trying int(1)
@@ -200,17 +200,17 @@ bool(true)
*** Trying bool(false)
bool(false)
*** Trying NULL
-*** Caught Return value of {closure}() must be of the type boolean, null returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, null returned in %s on line %d
*** Trying array(0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, array returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, array returned in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, object returned in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, object returned in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Return value of {closure}() must be of the type boolean, resource returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, resource returned in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt b/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
index e8f69bc699..bec8925676 100644
--- a/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
+++ b/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
@@ -76,30 +76,30 @@ int(1)
E_NOTICE: A non well formed numeric value encountered on line %d
int(1)
*** Trying string(1) "a"
-*** Caught Return value of {closure}() must be of the type integer, string returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, string returned in %s on line %d
*** Trying string(0) ""
-*** Caught Return value of {closure}() must be of the type integer, string returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, string returned in %s on line %d
*** Trying int(9223372036854775807)
int(9223372036854775807)
*** Trying float(NAN)
-*** Caught Return value of {closure}() must be of the type integer, float returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, float returned in %s on line %d
*** Trying bool(true)
int(1)
*** Trying bool(false)
int(0)
*** Trying NULL
-*** Caught Return value of {closure}() must be of the type integer, null returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, null returned in %s on line %d
*** Trying array(0) {
}
-*** Caught Return value of {closure}() must be of the type integer, array returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, array returned in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Return value of {closure}() must be of the type integer, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, object returned in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Return value of {closure}() must be of the type integer, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, object returned in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Return value of {closure}() must be of the type integer, resource returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type int, resource returned in %s on line %d
Testing 'float' type:
*** Trying int(1)
@@ -200,17 +200,17 @@ bool(true)
*** Trying bool(false)
bool(false)
*** Trying NULL
-*** Caught Return value of {closure}() must be of the type boolean, null returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, null returned in %s on line %d
*** Trying array(0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, array returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, array returned in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, object returned in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Return value of {closure}() must be of the type boolean, object returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, object returned in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Return value of {closure}() must be of the type boolean, resource returned in %s on line %d
+*** Caught Return value of {closure}() must be of the type bool, resource returned in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_strict.phpt b/Zend/tests/type_declarations/scalar_strict.phpt
index 40b036e1d4..4230558b01 100644
--- a/Zend/tests/type_declarations/scalar_strict.phpt
+++ b/Zend/tests/type_declarations/scalar_strict.phpt
@@ -70,52 +70,52 @@ Testing 'int' type:
int(1)
*** Trying string(1) "1"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying float(1)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying float(1.5)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying string(2) "1a"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying string(1) "a"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying string(0) ""
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying int(2147483647)
int(2147483647)
*** Trying float(NAN)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, array given, called in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, resource given, called in %s on line %d
Testing 'float' type:
@@ -147,10 +147,10 @@ float(2147483647)
float(NAN)
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying NULL
*** Caught Argument 1 passed to {closure}() must be of the type float, null given, called in %s on line %d
@@ -173,7 +173,7 @@ float(NAN)
Testing 'string' type:
*** Trying int(1)
-*** Caught Argument 1 passed to {closure}() must be of the type string, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, int given, called in %s on line %d
*** Trying string(1) "1"
string(1) "1"
@@ -194,16 +194,16 @@ string(1) "a"
string(0) ""
*** Trying int(2147483647)
-*** Caught Argument 1 passed to {closure}() must be of the type string, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, int given, called in %s on line %d
*** Trying float(NAN)
*** Caught Argument 1 passed to {closure}() must be of the type string, float given, called in %s on line %d
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying NULL
*** Caught Argument 1 passed to {closure}() must be of the type string, null given, called in %s on line %d
@@ -226,31 +226,31 @@ string(0) ""
Testing 'bool' type:
*** Trying int(1)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, int given, called in %s on line %d
*** Trying string(1) "1"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying float(1)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying float(1.5)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying string(2) "1a"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying string(1) "a"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying string(0) ""
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying int(2147483647)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, int given, called in %s on line %d
*** Trying float(NAN)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying bool(true)
bool(true)
@@ -259,21 +259,21 @@ bool(true)
bool(false)
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, array given, called in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, resource given, called in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_strict_64bit.phpt b/Zend/tests/type_declarations/scalar_strict_64bit.phpt
index 3e748ede34..b2559afae9 100644
--- a/Zend/tests/type_declarations/scalar_strict_64bit.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_64bit.phpt
@@ -70,52 +70,52 @@ Testing 'int' type:
int(1)
*** Trying string(1) "1"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying float(1)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying float(1.5)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying string(2) "1a"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying string(1) "a"
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying string(0) ""
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying int(9223372036854775807)
int(9223372036854775807)
*** Trying float(NAN)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, array given, called in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type integer, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, resource given, called in %s on line %d
Testing 'float' type:
@@ -147,10 +147,10 @@ float(9.2233720368548E+18)
float(NAN)
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying NULL
*** Caught Argument 1 passed to {closure}() must be of the type float, null given, called in %s on line %d
@@ -173,7 +173,7 @@ float(NAN)
Testing 'string' type:
*** Trying int(1)
-*** Caught Argument 1 passed to {closure}() must be of the type string, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, int given, called in %s on line %d
*** Trying string(1) "1"
string(1) "1"
@@ -194,16 +194,16 @@ string(1) "a"
string(0) ""
*** Trying int(9223372036854775807)
-*** Caught Argument 1 passed to {closure}() must be of the type string, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, int given, called in %s on line %d
*** Trying float(NAN)
*** Caught Argument 1 passed to {closure}() must be of the type string, float given, called in %s on line %d
*** Trying bool(true)
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying bool(false)
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying NULL
*** Caught Argument 1 passed to {closure}() must be of the type string, null given, called in %s on line %d
@@ -226,31 +226,31 @@ string(0) ""
Testing 'bool' type:
*** Trying int(1)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, int given, called in %s on line %d
*** Trying string(1) "1"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying float(1)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying float(1.5)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying string(2) "1a"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying string(1) "a"
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying string(0) ""
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying int(9223372036854775807)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, int given, called in %s on line %d
*** Trying float(NAN)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying bool(true)
bool(true)
@@ -259,21 +259,21 @@ bool(true)
bool(false)
*** Trying NULL
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, null given, called in %s on line %d
*** Trying array(0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, array given, called in %s on line %d
*** Trying object(stdClass)#6 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying object(Stringable)#7 (0) {
}
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying resource(5) of type (stream)
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, resource given, called in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_strict_basic.phpt b/Zend/tests/type_declarations/scalar_strict_basic.phpt
index 3ee94a2059..87da5f9328 100644
--- a/Zend/tests/type_declarations/scalar_strict_basic.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_basic.phpt
@@ -68,28 +68,28 @@ Testing 'int' type:
int(1)
*** Trying float value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, float given, called in %s on line %d
*** Trying string value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
*** Trying true value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying false value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, bool given, called in %s on line %d
*** Trying null value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, null given, called in %s on line %d
*** Trying array value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, array given, called in %s on line %d
*** Trying object value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
*** Trying resource value
-*** Caught Argument 1 passed to {closure}() must be of the type integer, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type int, resource given, called in %s on line %d
Testing 'float' type:
@@ -103,10 +103,10 @@ float(1)
*** Caught Argument 1 passed to {closure}() must be of the type float, string given, called in %s on line %d
*** Trying true value
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying false value
-*** Caught Argument 1 passed to {closure}() must be of the type float, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type float, bool given, called in %s on line %d
*** Trying null value
*** Caught Argument 1 passed to {closure}() must be of the type float, null given, called in %s on line %d
@@ -123,7 +123,7 @@ float(1)
Testing 'string' type:
*** Trying integer value
-*** Caught Argument 1 passed to {closure}() must be of the type string, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, int given, called in %s on line %d
*** Trying float value
*** Caught Argument 1 passed to {closure}() must be of the type string, float given, called in %s on line %d
@@ -132,10 +132,10 @@ Testing 'string' type:
string(1) "1"
*** Trying true value
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying false value
-*** Caught Argument 1 passed to {closure}() must be of the type string, boolean given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type string, bool given, called in %s on line %d
*** Trying null value
*** Caught Argument 1 passed to {closure}() must be of the type string, null given, called in %s on line %d
@@ -152,13 +152,13 @@ string(1) "1"
Testing 'bool' type:
*** Trying integer value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, integer given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, int given, called in %s on line %d
*** Trying float value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, float given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, float given, called in %s on line %d
*** Trying string value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, string given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, string given, called in %s on line %d
*** Trying true value
bool(true)
@@ -167,15 +167,15 @@ bool(true)
bool(false)
*** Trying null value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, null given, called in %s on line %d
*** Trying array value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, array given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, array given, called in %s on line %d
*** Trying object value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, object given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
*** Trying resource value
-*** Caught Argument 1 passed to {closure}() must be of the type boolean, resource given, called in %s on line %d
+*** Caught Argument 1 passed to {closure}() must be of the type bool, resource given, called in %s on line %d
Done
diff --git a/Zend/tests/type_declarations/scalar_strict_declaration_placement_005.phpt b/Zend/tests/type_declarations/scalar_strict_declaration_placement_005.phpt
index 3228c03fe5..88b21be082 100644
--- a/Zend/tests/type_declarations/scalar_strict_declaration_placement_005.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_declaration_placement_005.phpt
@@ -10,5 +10,5 @@ namespace Foo;
var_dump(strlen("abc"));
?>
---EXPECTF--
+--EXPECT--
int(3)
diff --git a/Zend/tests/type_declarations/scalar_strict_declaration_placement_006.phpt b/Zend/tests/type_declarations/scalar_strict_declaration_placement_006.phpt
index 69e7775eed..e0644482cb 100644
--- a/Zend/tests/type_declarations/scalar_strict_declaration_placement_006.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_declaration_placement_006.phpt
@@ -21,5 +21,5 @@ namespace Foo;
var_dump(strlen("abc"));
?>
---EXPECTF--
+--EXPECT--
int(3)
diff --git a/Zend/tests/type_declarations/scalar_strict_declaration_placement_007.phpt b/Zend/tests/type_declarations/scalar_strict_declaration_placement_007.phpt
index 519d75dde1..9afef254a9 100644
--- a/Zend/tests/type_declarations/scalar_strict_declaration_placement_007.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_declaration_placement_007.phpt
@@ -21,5 +21,5 @@ namespace Foo;
var_dump(strlen("abc"));
?>
---EXPECTF--
+--EXPECT--
int(3)
diff --git a/Zend/tests/type_declarations/strict_call_weak.phpt b/Zend/tests/type_declarations/strict_call_weak.phpt
index aa0530b9ae..d8dc93bc1e 100644
--- a/Zend/tests/type_declarations/strict_call_weak.phpt
+++ b/Zend/tests/type_declarations/strict_call_weak.phpt
@@ -13,7 +13,7 @@ require 'strict_call_weak_2.inc';
function_declared_in_weak_mode(1.0);
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to function_declared_in_weak_mode() must be of the type integer, float given, called in %sstrict_call_weak.php on line 10 and defined in %sstrict_call_weak_2.inc:5
+Fatal error: Uncaught TypeError: Argument 1 passed to function_declared_in_weak_mode() must be of the type int, float given, called in %sstrict_call_weak.php on line 10 and defined in %sstrict_call_weak_2.inc:5
Stack trace:
#0 %s(%d): function_declared_in_weak_mode(1)
#1 {main}
diff --git a/Zend/tests/type_declarations/strict_call_weak_explicit.phpt b/Zend/tests/type_declarations/strict_call_weak_explicit.phpt
index 1e234ab32d..e083d586e6 100644
--- a/Zend/tests/type_declarations/strict_call_weak_explicit.phpt
+++ b/Zend/tests/type_declarations/strict_call_weak_explicit.phpt
@@ -13,7 +13,7 @@ require 'strict_call_weak_explicit_2.inc';
function_declared_in_weak_mode(1.0);
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to function_declared_in_weak_mode() must be of the type integer, float given, called in %sstrict_call_weak_explicit.php on line 10 and defined in %sstrict_call_weak_explicit_2.inc:5
+Fatal error: Uncaught TypeError: Argument 1 passed to function_declared_in_weak_mode() must be of the type int, float given, called in %sstrict_call_weak_explicit.php on line 10 and defined in %sstrict_call_weak_explicit_2.inc:5
Stack trace:
#0 %s(%d): function_declared_in_weak_mode(1)
#1 {main}
diff --git a/Zend/tests/type_declarations/strict_include_explicit_weak.phpt b/Zend/tests/type_declarations/strict_include_explicit_weak.phpt
index a42d633f47..997bdf77b4 100644
--- a/Zend/tests/type_declarations/strict_include_explicit_weak.phpt
+++ b/Zend/tests/type_declarations/strict_include_explicit_weak.phpt
@@ -10,5 +10,5 @@ require 'strict_include_explicit_weak_2.inc';
// calls within that file should stay weak, despite being included by strict fille
?>
---EXPECTF--
+--EXPECT--
Success!
diff --git a/Zend/tests/type_declarations/strict_include_weak.phpt b/Zend/tests/type_declarations/strict_include_weak.phpt
index ce29db7e75..f90f1f14c4 100644
--- a/Zend/tests/type_declarations/strict_include_weak.phpt
+++ b/Zend/tests/type_declarations/strict_include_weak.phpt
@@ -10,5 +10,5 @@ require 'strict_include_weak_2.inc';
// calls within that file should stay weak, despite being included by strict file
?>
---EXPECTF--
+--EXPECT--
Success!
diff --git a/Zend/tests/type_declarations/weak_include_strict.phpt b/Zend/tests/type_declarations/weak_include_strict.phpt
index e49485dbe5..52f5f55cdb 100644
--- a/Zend/tests/type_declarations/weak_include_strict.phpt
+++ b/Zend/tests/type_declarations/weak_include_strict.phpt
@@ -11,7 +11,7 @@ require 'weak_include_strict_2.inc';
// calls within that file should stay strict, despite being included by weak file
?>
--EXPECTF--
-Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type integer, float given, called in %sweak_include_strict_2.inc on line 9 and defined in %sweak_include_strict_2.inc:5
+Fatal error: Uncaught TypeError: Argument 1 passed to takes_int() must be of the type int, float given, called in %sweak_include_strict_2.inc on line 9 and defined in %sweak_include_strict_2.inc:5
Stack trace:
#0 %s(%d): takes_int(1)
#1 %s(%d): require('%s')
diff --git a/Zend/tests/typehints/bug76198.phpt b/Zend/tests/typehints/bug76198.phpt
new file mode 100644
index 0000000000..fcaefbbec3
--- /dev/null
+++ b/Zend/tests/typehints/bug76198.phpt
@@ -0,0 +1,13 @@
+--TEST--
+"iterable" must not be fully qualified
+--FILE--
+<?php
+
+function foo(): \iterable {
+ return [];
+}
+var_dump(foo());
+
+?>
+--EXPECTF--
+Fatal error: Type declaration 'iterable' must be unqualified in %s on line %d
diff --git a/Zend/tests/typehints/fully_qualified_scalar.phpt b/Zend/tests/typehints/fully_qualified_scalar.phpt
index d780b44dcd..84c9dee636 100644
--- a/Zend/tests/typehints/fully_qualified_scalar.phpt
+++ b/Zend/tests/typehints/fully_qualified_scalar.phpt
@@ -10,4 +10,4 @@ foo(1);
?>
--EXPECTF--
-Fatal error: Scalar type declaration 'int' must be unqualified in %s on line %d
+Fatal error: Type declaration 'int' must be unqualified in %s on line %d
diff --git a/Zend/tests/typehints/namespace_relative_scalar.phpt b/Zend/tests/typehints/namespace_relative_scalar.phpt
index 1bc91788cc..096d047387 100644
--- a/Zend/tests/typehints/namespace_relative_scalar.phpt
+++ b/Zend/tests/typehints/namespace_relative_scalar.phpt
@@ -8,4 +8,4 @@ test(0);
?>
--EXPECTF--
-Fatal error: Scalar type declaration 'int' must be unqualified in %s on line %d
+Fatal error: Type declaration 'int' must be unqualified in %s on line %d
diff --git a/Zend/tests/typehints/or_null.phpt b/Zend/tests/typehints/or_null.phpt
index 8c20052165..552db7d058 100644
--- a/Zend/tests/typehints/or_null.phpt
+++ b/Zend/tests/typehints/or_null.phpt
@@ -231,27 +231,27 @@ TypeError: Argument 1 passed to loadedInterface() must implement interface RealI
Stack trace:
#0 %s(26): loadedInterface(Object(stdClass))
#1 {main}
-TypeError: Argument 1 passed to unloadedClass() must be an instance of I\Dont\Exist or null, integer given, called in %s on line 32 and defined in %s:5
+TypeError: Argument 1 passed to unloadedClass() must be an instance of I\Dont\Exist or null, int given, called in %s on line 32 and defined in %s:5
Stack trace:
#0 %s(32): unloadedClass(1)
#1 {main}
-TypeError: Argument 1 passed to loadedClass() must be an instance of RealClass or null, integer given, called in %s on line 38 and defined in %s:16
+TypeError: Argument 1 passed to loadedClass() must be an instance of RealClass or null, int given, called in %s on line 38 and defined in %s:16
Stack trace:
#0 %s(38): loadedClass(1)
#1 {main}
-TypeError: Argument 1 passed to loadedInterface() must implement interface RealInterface or be null, integer given, called in %s on line 44 and defined in %s:17
+TypeError: Argument 1 passed to loadedInterface() must implement interface RealInterface or be null, int given, called in %s on line 44 and defined in %s:17
Stack trace:
#0 %s(44): loadedInterface(1)
#1 {main}
-TypeError: Argument 1 passed to callableF() must be callable or null, integer given, called in %s on line 52 and defined in %s:49
+TypeError: Argument 1 passed to callableF() must be callable or null, int given, called in %s on line 52 and defined in %s:49
Stack trace:
#0 %s(52): callableF(1)
#1 {main}
-TypeError: Argument 1 passed to iterableF() must be iterable or null, integer given, called in %s on line 60 and defined in %s:57
+TypeError: Argument 1 passed to iterableF() must be iterable or null, int given, called in %s on line 60 and defined in %s:57
Stack trace:
#0 %s(60): iterableF(1)
#1 {main}
-TypeError: Argument 1 passed to intF() must be of the type integer or null, object given, called in %s on line 68 and defined in %s:65
+TypeError: Argument 1 passed to intF() must be of the type int or null, object given, called in %s on line 68 and defined in %s:65
Stack trace:
#0 %s(68): intF(Object(stdClass))
#1 {main}
@@ -267,27 +267,27 @@ TypeError: Return value of returnLoadedInterface() must implement interface Real
Stack trace:
#0 %s(98): returnLoadedInterface()
#1 {main}
-TypeError: Return value of returnUnloadedClassScalar() must be an instance of I\Dont\Exist or null, integer returned in %s:104
+TypeError: Return value of returnUnloadedClassScalar() must be an instance of I\Dont\Exist or null, int returned in %s:104
Stack trace:
#0 %s(108): returnUnloadedClassScalar()
#1 {main}
-TypeError: Return value of returnLoadedClassScalar() must be an instance of RealClass or null, integer returned in %s:114
+TypeError: Return value of returnLoadedClassScalar() must be an instance of RealClass or null, int returned in %s:114
Stack trace:
#0 %s(118): returnLoadedClassScalar()
#1 {main}
-TypeError: Return value of returnLoadedInterfaceScalar() must implement interface RealInterface or be null, integer returned in %s:124
+TypeError: Return value of returnLoadedInterfaceScalar() must implement interface RealInterface or be null, int returned in %s:124
Stack trace:
#0 %s(128): returnLoadedInterfaceScalar()
#1 {main}
-TypeError: Return value of returnCallable() must be callable or null, integer returned in %s:134
+TypeError: Return value of returnCallable() must be callable or null, int returned in %s:134
Stack trace:
#0 %s(138): returnCallable()
#1 {main}
-TypeError: Return value of returnIterable() must be iterable or null, integer returned in %s:144
+TypeError: Return value of returnIterable() must be iterable or null, int returned in %s:144
Stack trace:
#0 %s(148): returnIterable()
#1 {main}
-TypeError: Return value of returnInt() must be of the type integer or null, object returned in %s:154
+TypeError: Return value of returnInt() must be of the type int or null, object returned in %s:154
Stack trace:
#0 %s(158): returnInt()
#1 {main}
@@ -311,7 +311,7 @@ TypeError: Return value of returnMissingIterable() must be iterable or null, non
Stack trace:
#0 %s(203): returnMissingIterable()
#1 {main}
-TypeError: Return value of returnMissingInt() must be of the type integer or null, none returned in %s:209
+TypeError: Return value of returnMissingInt() must be of the type int or null, none returned in %s:209
Stack trace:
#0 %s(212): returnMissingInt()
#1 {main}
diff --git a/Zend/tests/unexpected_ref_bug.phpt b/Zend/tests/unexpected_ref_bug.phpt
index 61fe1aa5b1..ba61ee582a 100644
--- a/Zend/tests/unexpected_ref_bug.phpt
+++ b/Zend/tests/unexpected_ref_bug.phpt
@@ -14,5 +14,5 @@ $my_var=array(1,2,3);
$data = call_user_func_array("implode",array(&$my_var, new StdClass()));
echo "Done.\n";
?>
---EXPECTF--
+--EXPECT--
Done.
diff --git a/Zend/tests/unset_cv08.phpt b/Zend/tests/unset_cv08.phpt
index 9b8ab1520f..0798ca48ed 100644
--- a/Zend/tests/unset_cv08.phpt
+++ b/Zend/tests/unset_cv08.phpt
@@ -9,7 +9,7 @@ echo $a;
echo $b;
echo "ok\n";
?>
---EXPECTF--
+--EXPECT--
ok
ok
ok
diff --git a/Zend/tests/unset_cv10.phpt b/Zend/tests/unset_cv10.phpt
index 3b943d8b6a..335463b0ca 100644
--- a/Zend/tests/unset_cv10.phpt
+++ b/Zend/tests/unset_cv10.phpt
@@ -1,7 +1,5 @@
--TEST--
unset() CV 10 (unset() of global variable in ArrayObject::offsetUnset($GLOBALS))
---SKIPIF--
-<?php if (!extension_loaded("spl")) print "skip SPL extension required"; ?>
--FILE--
<?php
$a = new ArrayObject($GLOBALS);
diff --git a/Zend/tests/use_const/shadow_core.phpt b/Zend/tests/use_const/shadow_core.phpt
index 7d8bcbd189..5dbf396e63 100644
--- a/Zend/tests/use_const/shadow_core.phpt
+++ b/Zend/tests/use_const/shadow_core.phpt
@@ -11,6 +11,6 @@ var_dump(PHP_VERSION);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(42)
Done
diff --git a/Zend/tests/variadic/typehint_error.phpt b/Zend/tests/variadic/typehint_error.phpt
index 153161a09d..d9a5ea291f 100644
--- a/Zend/tests/variadic/typehint_error.phpt
+++ b/Zend/tests/variadic/typehint_error.phpt
@@ -33,7 +33,7 @@ array(3) {
}
}
-Fatal error: Uncaught TypeError: Argument 3 passed to test() must be of the type array, integer given, called in %s:%d
+Fatal error: Uncaught TypeError: Argument 3 passed to test() must be of the type array, int given, called in %s:%d
Stack trace:
#0 %s(%d): test(Array, Array, 2)
#1 {main}
diff --git a/Zend/tests/variadic/typehint_suppressed_error.phpt b/Zend/tests/variadic/typehint_suppressed_error.phpt
index ef217b2be0..ebc44c38b1 100644
--- a/Zend/tests/variadic/typehint_suppressed_error.phpt
+++ b/Zend/tests/variadic/typehint_suppressed_error.phpt
@@ -15,4 +15,4 @@ try {
?>
--EXPECTF--
-string(%d) "Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d"
+string(%d) "Argument 3 passed to test() must be of the type array, int given, called in %s on line %d"
diff --git a/Zend/tests/xor_001.phpt b/Zend/tests/xor_001.phpt
index afcd6e76ec..1a6d0fb633 100644
--- a/Zend/tests/xor_001.phpt
+++ b/Zend/tests/xor_001.phpt
@@ -11,6 +11,6 @@ var_dump($c);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(1)
Done
diff --git a/Zend/tests/xor_002.phpt b/Zend/tests/xor_002.phpt
index ae07dfc031..cbcfa3a959 100644
--- a/Zend/tests/xor_002.phpt
+++ b/Zend/tests/xor_002.phpt
@@ -29,7 +29,7 @@ var_dump(bin2hex($s));
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(6) "030107"
string(6) "030107"
string(8) "070a1e11"
diff --git a/Zend/tests/xor_003.phpt b/Zend/tests/xor_003.phpt
index 8b15025ec6..4ed98f3415 100644
--- a/Zend/tests/xor_003.phpt
+++ b/Zend/tests/xor_003.phpt
@@ -12,7 +12,7 @@ var_dump($f ^ $f);
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
int(1)
int(0)
int(0)
diff --git a/Zend/tests/zend_operators.phpt b/Zend/tests/zend_operators.phpt
index b07f259ae1..769640bf10 100644
--- a/Zend/tests/zend_operators.phpt
+++ b/Zend/tests/zend_operators.phpt
@@ -1,7 +1,7 @@
--TEST--
Operator precedence
--FILE--
-<?php /* $Id$ */
+<?php
var_dump((object)1 instanceof stdClass);
var_dump(! (object)1 instanceof Exception);
diff --git a/Zend/tests/zend_signed_multiply-32bit.phpt b/Zend/tests/zend_signed_multiply-32bit.phpt
index 3f37cbac19..991cf5e891 100644
--- a/Zend/tests/zend_signed_multiply-32bit.phpt
+++ b/Zend/tests/zend_signed_multiply-32bit.phpt
@@ -8,7 +8,7 @@ var_dump(0x8000 * -0xffff);
var_dump(0x8001 * 0xfffe);
var_dump(0x8001 * -0xffff);
?>
---EXPECTF--
+--EXPECT--
int(-2147450880)
int(2147483646)
float(-2147516415)
diff --git a/Zend/tests/zend_signed_multiply-64bit-2.phpt b/Zend/tests/zend_signed_multiply-64bit-2.phpt
index 30ca6a58e7..aa8ee47db6 100644
--- a/Zend/tests/zend_signed_multiply-64bit-2.phpt
+++ b/Zend/tests/zend_signed_multiply-64bit-2.phpt
@@ -13,7 +13,7 @@ for($c = 0; $c <= 16; $c++) {
echo "-----------\n";
}
?>
---EXPECTF--
+--EXPECT--
int(-16)
int(-922337203685477580)
float(1.4757395258968E+19)
diff --git a/Zend/tests/zend_signed_multiply-64bit.phpt b/Zend/tests/zend_signed_multiply-64bit.phpt
index d392b2e78a..20ef277770 100644
--- a/Zend/tests/zend_signed_multiply-64bit.phpt
+++ b/Zend/tests/zend_signed_multiply-64bit.phpt
@@ -8,7 +8,7 @@ var_dump(0x80000000 * -0xffffffff);
var_dump(0x80000001 * 0xfffffffe);
var_dump(0x80000001 * -0xffffffff);
?>
---EXPECTF--
+--EXPECT--
int(-9223372034707292160)
int(9223372036854775806)
float(-9.2233720390023E+18)
diff --git a/Zend/tests/zend_strtod.phpt b/Zend/tests/zend_strtod.phpt
index f7089932f2..4530ce2e8c 100644
--- a/Zend/tests/zend_strtod.phpt
+++ b/Zend/tests/zend_strtod.phpt
@@ -11,7 +11,7 @@ var_dump("123123139932690.21688500" - "11399327900000000.21688500");
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
float(-100)
float(808792757210)
float(-4.5646456464565E+27)
diff --git a/Zend/zend.c b/Zend/zend.c
index 23cf94fcb2..18ec232262 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_extensions.h"
#include "zend_modules.h"
@@ -33,6 +31,7 @@
#include "zend_virtual_cwd.h"
#include "zend_smart_str.h"
#include "zend_smart_string.h"
+#include "zend_cpuinfo.h"
#ifdef ZTS
ZEND_API int compiler_globals_id;
@@ -75,13 +74,18 @@ ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint3
void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
ZEND_API char *(*zend_getenv)(char *name, size_t name_len);
-ZEND_API zend_string *(*zend_resolve_path)(const char *filename, int filename_len);
+ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
+ZEND_API int (*zend_post_startup_cb)(void) = NULL;
void (*zend_on_timeout)(int seconds);
static void (*zend_message_dispatcher_p)(zend_long message, const void *data);
static zval *(*zend_get_configuration_directive_p)(zend_string *name);
+#if ZEND_RC_DEBUG
+ZEND_API zend_bool zend_rc_debug = 0;
+#endif
+
static ZEND_INI_MH(OnUpdateErrorReporting) /* {{{ */
{
if (!new_value) {
@@ -95,16 +99,26 @@ static ZEND_INI_MH(OnUpdateErrorReporting) /* {{{ */
static ZEND_INI_MH(OnUpdateGCEnabled) /* {{{ */
{
- OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
+ zend_bool val;
- if (GC_G(gc_enabled)) {
- gc_init();
- }
+ val = zend_ini_parse_bool(new_value);
+ gc_enable(val);
return SUCCESS;
}
/* }}} */
+static ZEND_INI_DISP(zend_gc_enabled_displayer_cb) /* {{{ */
+{
+ if (gc_enabled()) {
+ ZEND_PUTS("On");
+ } else {
+ ZEND_PUTS("Off");
+ }
+}
+/* }}} */
+
+
static ZEND_INI_MH(OnUpdateScriptEncoding) /* {{{ */
{
if (!CG(multibyte)) {
@@ -130,7 +144,7 @@ static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
p = (zend_long *) (base+(size_t) mh_arg1);
- val = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value));
+ val = zend_atol(ZSTR_VAL(new_value), ZSTR_LEN(new_value));
if (stage != ZEND_INI_STAGE_STARTUP &&
stage != ZEND_INI_STAGE_SHUTDOWN &&
@@ -148,7 +162,7 @@ static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
ZEND_INI_BEGIN()
ZEND_INI_ENTRY("error_reporting", NULL, ZEND_INI_ALL, OnUpdateErrorReporting)
STD_ZEND_INI_ENTRY("zend.assertions", "1", ZEND_INI_ALL, OnUpdateAssertions, assertions, zend_executor_globals, executor_globals)
- STD_ZEND_INI_BOOLEAN("zend.enable_gc", "1", ZEND_INI_ALL, OnUpdateGCEnabled, gc_enabled, zend_gc_globals, gc_globals)
+ ZEND_INI_ENTRY3_EX("zend.enable_gc", "1", ZEND_INI_ALL, OnUpdateGCEnabled, NULL, NULL, NULL, zend_gc_enabled_displayer_cb)
STD_ZEND_INI_BOOLEAN("zend.multibyte", "0", ZEND_INI_PERDIR, OnUpdateBool, multibyte, zend_compiler_globals, compiler_globals)
ZEND_INI_ENTRY("zend.script_encoding", NULL, ZEND_INI_ALL, OnUpdateScriptEncoding)
STD_ZEND_INI_BOOLEAN("zend.detect_unicode", "1", ZEND_INI_ALL, OnUpdateBool, detect_unicode, zend_compiler_globals, compiler_globals)
@@ -197,6 +211,18 @@ ZEND_API size_t zend_spprintf(char **message, size_t max_len, const char *format
}
/* }}} */
+ZEND_API size_t zend_spprintf_unchecked(char **message, size_t max_len, const char *format, ...) /* {{{ */
+{
+ va_list arg;
+ size_t len;
+
+ va_start(arg, format);
+ len = zend_vspprintf(message, max_len, format, arg);
+ va_end(arg);
+ return len;
+}
+/* }}} */
+
ZEND_API zend_string *zend_vstrpprintf(size_t max_len, const char *format, va_list ap) /* {{{ */
{
smart_str buf = {0};
@@ -228,6 +254,18 @@ ZEND_API zend_string *zend_strpprintf(size_t max_len, const char *format, ...) /
}
/* }}} */
+ZEND_API zend_string *zend_strpprintf_unchecked(size_t max_len, const char *format, ...) /* {{{ */
+{
+ va_list arg;
+ zend_string *str;
+
+ va_start(arg, format);
+ str = zend_vstrpprintf(max_len, format, arg);
+ va_end(arg);
+ return str;
+}
+/* }}} */
+
static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent);
static void print_hash(smart_str *buf, HashTable *ht, int indent, zend_bool is_object) /* {{{ */
@@ -309,7 +347,7 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */
if (Z_TYPE_P(expr) == IS_STRING) {
return 0;
} else {
- ZVAL_STR(expr_copy, _zval_get_string_func(expr));
+ ZVAL_STR(expr_copy, zval_get_string_func(expr));
return 1;
}
}
@@ -317,14 +355,15 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */
ZEND_API size_t zend_print_zval(zval *expr, int indent) /* {{{ */
{
- zend_string *str = zval_get_string(expr);
+ zend_string *tmp_str;
+ zend_string *str = zval_get_tmp_string(expr, &tmp_str);
size_t len = ZSTR_LEN(str);
if (len != 0) {
zend_write(ZSTR_VAL(str), len);
}
- zend_string_release(str);
+ zend_tmp_string_release(tmp_str);
return len;
}
/* }}} */
@@ -334,16 +373,17 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
switch (Z_TYPE_P(expr)) {
case IS_ARRAY:
ZEND_PUTS("Array (");
- if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr)) &&
- ++Z_ARRVAL_P(expr)->u.v.nApplyCount>1) {
- ZEND_PUTS(" *RECURSION*");
- Z_ARRVAL_P(expr)->u.v.nApplyCount--;
- return;
+ if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
+ if (GC_IS_RECURSIVE(Z_ARRVAL_P(expr))) {
+ ZEND_PUTS(" *RECURSION*");
+ return;
+ }
+ GC_PROTECT_RECURSION(Z_ARRVAL_P(expr));
}
print_flat_hash(Z_ARRVAL_P(expr));
ZEND_PUTS(")");
- if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr))) {
- Z_ARRVAL_P(expr)->u.v.nApplyCount--;
+ if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
+ GC_UNPROTECT_RECURSION(Z_ARRVAL_P(expr));
}
break;
case IS_OBJECT:
@@ -351,9 +391,9 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
HashTable *properties = NULL;
zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr));
zend_printf("%s Object (", ZSTR_VAL(class_name));
- zend_string_release(class_name);
+ zend_string_release_ex(class_name, 0);
- if (Z_OBJ_APPLY_COUNT_P(expr) > 0) {
+ if (GC_IS_RECURSIVE(Z_OBJ_P(expr))) {
ZEND_PUTS(" *RECURSION*");
return;
}
@@ -362,9 +402,9 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
properties = Z_OBJPROP_P(expr);
}
if (properties) {
- Z_OBJ_INC_APPLY_COUNT_P(expr);
+ GC_PROTECT_RECURSION(Z_OBJ_P(expr));
print_flat_hash(properties);
- Z_OBJ_DEC_APPLY_COUNT_P(expr);
+ GC_UNPROTECT_RECURSION(Z_OBJ_P(expr));
}
ZEND_PUTS(")");
break;
@@ -373,7 +413,7 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
zend_print_flat_zval_r(Z_REFVAL_P(expr));
break;
default:
- zend_print_variable(expr);
+ zend_print_zval(expr, 0);
break;
}
}
@@ -384,15 +424,16 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
switch (Z_TYPE_P(expr)) {
case IS_ARRAY:
smart_str_appends(buf, "Array\n");
- if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr)) &&
- ++Z_ARRVAL_P(expr)->u.v.nApplyCount>1) {
- smart_str_appends(buf, " *RECURSION*");
- Z_ARRVAL_P(expr)->u.v.nApplyCount--;
- return;
+ if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
+ if (GC_IS_RECURSIVE(Z_ARRVAL_P(expr))) {
+ smart_str_appends(buf, " *RECURSION*");
+ return;
+ }
+ GC_PROTECT_RECURSION(Z_ARRVAL_P(expr));
}
print_hash(buf, Z_ARRVAL_P(expr), indent, 0);
- if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr))) {
- Z_ARRVAL_P(expr)->u.v.nApplyCount--;
+ if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
+ GC_UNPROTECT_RECURSION(Z_ARRVAL_P(expr));
}
break;
case IS_OBJECT:
@@ -402,10 +443,10 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr));
smart_str_appends(buf, ZSTR_VAL(class_name));
- zend_string_release(class_name);
+ zend_string_release_ex(class_name, 0);
smart_str_appends(buf, " Object\n");
- if (Z_OBJ_APPLY_COUNT_P(expr) > 0) {
+ if (GC_IS_RECURSIVE(Z_OBJ_P(expr))) {
smart_str_appends(buf, " *RECURSION*");
return;
}
@@ -413,9 +454,9 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
break;
}
- Z_OBJ_INC_APPLY_COUNT_P(expr);
+ GC_PROTECT_RECURSION(Z_OBJ_P(expr));
print_hash(buf, properties, indent, 1);
- Z_OBJ_DEC_APPLY_COUNT_P(expr);
+ GC_UNPROTECT_RECURSION(Z_OBJ_P(expr));
if (is_temp) {
zend_hash_destroy(properties);
@@ -429,11 +470,14 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
case IS_REFERENCE:
zend_print_zval_r_to_buf(buf, Z_REFVAL_P(expr), indent);
break;
+ case IS_STRING:
+ smart_str_append(buf, Z_STR_P(expr));
+ break;
default:
{
- zend_string *str = zval_get_string(expr);
+ zend_string *str = zval_get_string_func(expr);
smart_str_append(buf, str);
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
break;
}
@@ -453,7 +497,7 @@ ZEND_API void zend_print_zval_r(zval *expr, int indent) /* {{{ */
{
zend_string *str = zend_print_zval_r_to_str(expr, indent);
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
/* }}} */
@@ -498,19 +542,10 @@ static void zend_init_exception_op(void) /* {{{ */
{
memset(EG(exception_op), 0, sizeof(EG(exception_op)));
EG(exception_op)[0].opcode = ZEND_HANDLE_EXCEPTION;
- EG(exception_op)[0].op1_type = IS_UNUSED;
- EG(exception_op)[0].op2_type = IS_UNUSED;
- EG(exception_op)[0].result_type = IS_UNUSED;
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op));
EG(exception_op)[1].opcode = ZEND_HANDLE_EXCEPTION;
- EG(exception_op)[1].op1_type = IS_UNUSED;
- EG(exception_op)[1].op2_type = IS_UNUSED;
- EG(exception_op)[1].result_type = IS_UNUSED;
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+1);
EG(exception_op)[2].opcode = ZEND_HANDLE_EXCEPTION;
- EG(exception_op)[2].op1_type = IS_UNUSED;
- EG(exception_op)[2].op2_type = IS_UNUSED;
- EG(exception_op)[2].result_type = IS_UNUSED;
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+2);
}
/* }}} */
@@ -519,9 +554,6 @@ static void zend_init_call_trampoline_op(void) /* {{{ */
{
memset(&EG(call_trampoline_op), 0, sizeof(EG(call_trampoline_op)));
EG(call_trampoline_op).opcode = ZEND_CALL_TRAMPOLINE;
- EG(call_trampoline_op).op1_type = IS_UNUSED;
- EG(call_trampoline_op).op2_type = IS_UNUSED;
- EG(call_trampoline_op).result_type = IS_UNUSED;
ZEND_VM_SET_OPCODE_HANDLER(&EG(call_trampoline_op));
}
/* }}} */
@@ -536,9 +568,34 @@ static void auto_global_dtor(zval *zv) /* {{{ */
static void function_copy_ctor(zval *zv) /* {{{ */
{
zend_function *old_func = Z_FUNC_P(zv);
- Z_FUNC_P(zv) = pemalloc(sizeof(zend_internal_function), 1);
- memcpy(Z_FUNC_P(zv), old_func, sizeof(zend_internal_function));
- function_add_ref(Z_FUNC_P(zv));
+ zend_function *func = pemalloc(sizeof(zend_internal_function), 1);
+
+ Z_FUNC_P(zv) = func;
+ memcpy(func, old_func, sizeof(zend_internal_function));
+ function_add_ref(func);
+ if ((old_func->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS))
+ && old_func->common.arg_info) {
+ uint32_t i;
+ uint32_t num_args = old_func->common.num_args + 1;
+ zend_arg_info *arg_info = old_func->common.arg_info - 1;
+ zend_arg_info *new_arg_info;
+
+ if (old_func->common.fn_flags & ZEND_ACC_VARIADIC) {
+ num_args++;
+ }
+ new_arg_info = pemalloc(sizeof(zend_arg_info) * num_args, 1);
+ memcpy(new_arg_info, arg_info, sizeof(zend_arg_info) * num_args);
+ for (i = 0 ; i < num_args; i++) {
+ if (ZEND_TYPE_IS_CLASS(arg_info[i].type)) {
+ zend_string *name = zend_string_dup(ZEND_TYPE_NAME(arg_info[i].type), 1);
+
+ new_arg_info[i].type =
+ ZEND_TYPE_ENCODE_CLASS(
+ name, ZEND_TYPE_ALLOW_NULL(arg_info[i].type));
+ }
+ }
+ func->common.arg_info = new_arg_info + 1;
+ }
}
/* }}} */
@@ -681,8 +738,6 @@ static void php_scanner_globals_ctor(zend_php_scanner_globals *scanner_globals_p
}
/* }}} */
-void zend_init_opcodes_handlers(void);
-
static void module_destructor_zval(zval *zv) /* {{{ */
{
zend_module_entry *module = (zend_module_entry*)Z_PTR_P(zv);
@@ -696,8 +751,9 @@ static zend_bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
{
zval globals;
+ /* IS_ARRAY, but with ref-counter 1 and not IS_TYPE_REFCOUNTED */
ZVAL_ARR(&globals, &EG(symbol_table));
- Z_TYPE_INFO_P(&globals) = IS_ARRAY;
+ Z_TYPE_FLAGS_P(&globals) = 0;
ZVAL_NEW_REF(&globals, &globals);
zend_hash_update(&EG(symbol_table), name, &globals);
return 0;
@@ -717,6 +773,8 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
extern zend_php_scanner_globals language_scanner_globals;
#endif
+ zend_cpu_startup();
+
#ifdef ZEND_WIN32
php_win32_cp_set_by_id(65001);
#endif
@@ -780,7 +838,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
/* Set up the default garbage collection implementation. */
gc_collect_cycles = zend_gc_collect_cycles;
- zend_init_opcodes_handlers();
+ zend_vm_init();
/* set up version */
zend_version_info = strdup(ZEND_CORE_VERSION_INFO);
@@ -831,7 +889,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
zend_interned_strings_init();
zend_startup_builtin_functions();
zend_register_standard_constants();
- zend_register_auto_global(zend_string_init("GLOBALS", sizeof("GLOBALS") - 1, 1), 1, php_auto_globals_create_globals);
+ zend_register_auto_global(zend_string_init_interned("GLOBALS", sizeof("GLOBALS") - 1, 1), 1, php_auto_globals_create_globals);
#ifndef ZTS
zend_init_rsrc_plist();
@@ -866,7 +924,7 @@ void zend_register_standard_ini_entries(void) /* {{{ */
/* Unlink the global (r/o) copies of the class, function and constant tables,
* and use a fresh r/w copy for the startup thread
*/
-void zend_post_startup(void) /* {{{ */
+int zend_post_startup(void) /* {{{ */
{
#ifdef ZTS
zend_encoding **script_encoding_list;
@@ -896,11 +954,24 @@ void zend_post_startup(void) /* {{{ */
global_persistent_list = &EG(persistent_list);
zend_copy_ini_directives();
#endif
+
+ if (zend_post_startup_cb) {
+ int (*cb)(void) = zend_post_startup_cb;
+
+ zend_post_startup_cb = NULL;
+ if (cb() != SUCCESS) {
+ return FAILURE;
+ }
+ }
+
+ return SUCCESS;
}
/* }}} */
void zend_shutdown(void) /* {{{ */
{
+ zend_vm_dtor();
+
zend_destroy_rsrc_list(&EG(persistent_list));
zend_destroy_modules();
@@ -962,6 +1033,7 @@ ZEND_API ZEND_COLD void _zend_bailout(const char *filename, uint32_t lineno) /*
zend_output_debug_string(1, "%s(%d) : Bailed out without a bailout address!", filename, lineno);
exit(-1);
}
+ gc_protect(1);
CG(unclean_shutdown) = 1;
CG(active_class_entry) = NULL;
CG(in_compilation) = 0;
@@ -1271,7 +1343,7 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
orig_fake_scope = EG(fake_scope);
EG(fake_scope) = NULL;
- if (call_user_function_ex(CG(function_table), NULL, &orig_user_error_handler, &retval, 5, params, 1, NULL) == SUCCESS) {
+ if (call_user_function(CG(function_table), NULL, &orig_user_error_handler, &retval, 5, params) == SUCCESS) {
if (Z_TYPE(retval) != IS_UNDEF) {
if (Z_TYPE(retval) == IS_FALSE) {
zend_error_cb(type, error_filename, error_lineno, format, args);
@@ -1293,10 +1365,8 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
}
zval_ptr_dtor(&params[4]);
- zval_ptr_dtor(&params[3]);
zval_ptr_dtor(&params[2]);
zval_ptr_dtor(&params[1]);
- zval_ptr_dtor(&params[0]);
if (Z_TYPE(EG(user_error_handler)) == IS_UNDEF) {
ZVAL_COPY_VALUE(&EG(user_error_handler), &orig_user_error_handler);
@@ -1461,7 +1531,7 @@ ZEND_API void zend_try_exception_handler() /* {{{ */
ZVAL_OBJ(&params[0], old_exception);
ZVAL_COPY_VALUE(&orig_user_exception_handler, &EG(user_exception_handler));
- if (call_user_function_ex(CG(function_table), NULL, &orig_user_exception_handler, &retval2, 1, params, 1, NULL) == SUCCESS) {
+ if (call_user_function(CG(function_table), NULL, &orig_user_exception_handler, &retval2, 1, params) == SUCCESS) {
zval_ptr_dtor(&retval2);
if (EG(exception)) {
OBJ_RELEASE(EG(exception));
diff --git a/Zend/zend.h b/Zend/zend.h
index 74f68964c9..2f11552c21 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -12,17 +12,15 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_H
#define ZEND_H
-#define ZEND_VERSION "3.2.0"
+#define ZEND_VERSION "3.3.10-dev"
#define ZEND_ENGINE_3
@@ -86,20 +84,17 @@ typedef struct _zend_unserialize_data zend_unserialize_data;
typedef struct _zend_trait_method_reference {
zend_string *method_name;
- zend_class_entry *ce;
zend_string *class_name;
} zend_trait_method_reference;
typedef struct _zend_trait_precedence {
- zend_trait_method_reference *trait_method;
- union {
- zend_class_entry *ce;
- zend_string *class_name;
- } *exclude_from_classes;
+ zend_trait_method_reference trait_method;
+ uint32_t num_excludes;
+ zend_string *exclude_class_names[1];
} zend_trait_precedence;
typedef struct _zend_trait_alias {
- zend_trait_method_reference *trait_method;
+ zend_trait_method_reference trait_method;
/**
* name for method to be added
@@ -142,12 +137,15 @@ struct _zend_class_entry {
union _zend_function *serialize_func;
union _zend_function *unserialize_func;
- zend_class_iterator_funcs iterator_funcs;
+ /* allocated only if class implements Iterator or IteratorAggregate interface */
+ zend_class_iterator_funcs *iterator_funcs_ptr;
/* handlers */
- zend_object* (*create_object)(zend_class_entry *class_type);
+ union {
+ zend_object* (*create_object)(zend_class_entry *class_type);
+ int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type); /* a class implements this interface */
+ };
zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, int by_ref);
- int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type); /* a class implements this interface */
union _zend_function *(*get_static_method)(zend_class_entry *ce, zend_string* method);
/* serializer callbacks */
@@ -189,7 +187,7 @@ typedef struct _zend_utility_functions {
void (*printf_to_smart_string_function)(smart_string *buf, const char *format, va_list ap);
void (*printf_to_smart_str_function)(smart_str *buf, const char *format, va_list ap);
char *(*getenv_function)(char *name, size_t name_len);
- zend_string *(*resolve_path_function)(const char *filename, int filename_len);
+ zend_string *(*resolve_path_function)(const char *filename, size_t filename_len);
} zend_utility_functions;
typedef struct _zend_utility_values {
@@ -222,7 +220,7 @@ BEGIN_EXTERN_C()
int zend_startup(zend_utility_functions *utility_functions, char **extensions);
void zend_shutdown(void);
void zend_register_standard_ini_entries(void);
-void zend_post_startup(void);
+int zend_post_startup(void);
void zend_set_utility_values(zend_utility_values *utility_values);
ZEND_API ZEND_COLD void _zend_bailout(const char *filename, uint32_t lineno);
@@ -232,12 +230,21 @@ ZEND_API size_t zend_spprintf(char **message, size_t max_len, const char *format
ZEND_API zend_string *zend_vstrpprintf(size_t max_len, const char *format, va_list ap);
ZEND_API zend_string *zend_strpprintf(size_t max_len, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+/* Same as zend_spprintf and zend_strpprintf, without checking of format validity.
+ * For use with custom printf specifiers such as %H. */
+ZEND_API size_t zend_spprintf_unchecked(char **message, size_t max_len, const char *format, ...);
+ZEND_API zend_string *zend_strpprintf_unchecked(size_t max_len, const char *format, ...);
+
ZEND_API char *get_zend_version(void);
ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy);
ZEND_API size_t zend_print_zval(zval *expr, int indent);
ZEND_API void zend_print_zval_r(zval *expr, int indent);
ZEND_API zend_string *zend_print_zval_r_to_str(zval *expr, int indent);
ZEND_API void zend_print_flat_zval_r(zval *expr);
+
+#define zend_print_variable(var) \
+ zend_print_zval((var), 0)
+
ZEND_API ZEND_COLD void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
ZEND_API void zend_activate(void);
@@ -269,7 +276,8 @@ extern ZEND_API int (*zend_stream_open_function)(const char *filename, zend_file
extern void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
extern void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len);
-extern ZEND_API zend_string *(*zend_resolve_path)(const char *filename, int filename_len);
+extern ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
+extern ZEND_API int (*zend_post_startup_cb)(void);
ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
@@ -307,7 +315,6 @@ END_EXTERN_C()
typedef enum {
EH_NORMAL = 0,
- EH_SUPPRESS,
EH_THROW
} zend_error_handling_t;
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 604450e927..3d94fd5986 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -12,15 +12,13 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
| Andrei Zmievski <andrei@php.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_execute.h"
#include "zend_API.h"
@@ -45,67 +43,6 @@ static zend_module_entry **module_post_deactivate_handlers;
static zend_class_entry **class_cleanup_handlers;
-/* this function doesn't check for too many parameters */
-ZEND_API int zend_get_parameters(int ht, int param_count, ...) /* {{{ */
-{
- int arg_count;
- va_list ptr;
- zval **param, *param_ptr;
-
- param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
-
- if (param_count>arg_count) {
- return FAILURE;
- }
-
- va_start(ptr, param_count);
-
- while (param_count-->0) {
- param = va_arg(ptr, zval **);
- if (!Z_ISREF_P(param_ptr) && Z_REFCOUNT_P(param_ptr) > 1) {
- zval new_tmp;
-
- ZVAL_DUP(&new_tmp, param_ptr);
- Z_DELREF_P(param_ptr);
- ZVAL_COPY_VALUE(param_ptr, &new_tmp);
- }
- *param = param_ptr;
- param_ptr++;
- }
- va_end(ptr);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* Zend-optimized Extended functions */
-/* this function doesn't check for too many parameters */
-ZEND_API int zend_get_parameters_ex(int param_count, ...) /* {{{ */
-{
- int arg_count;
- va_list ptr;
- zval **param, *param_ptr;
-
- param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
-
- if (param_count>arg_count) {
- return FAILURE;
- }
-
- va_start(ptr, param_count);
- while (param_count-->0) {
- param = va_arg(ptr, zval **);
- *param = param_ptr;
- param_ptr++;
- }
- va_end(ptr);
-
- return SUCCESS;
-}
-/* }}} */
-
ZEND_API int _zend_get_parameters_array_ex(int param_count, zval *argument_array) /* {{{ */
{
zval *param_ptr;
@@ -141,9 +78,7 @@ ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array) /
}
while (param_count-->0) {
- if (Z_REFCOUNTED_P(param_ptr)) {
- Z_ADDREF_P(param_ptr);
- }
+ Z_TRY_ADDREF_P(param_ptr);
zend_hash_next_index_insert_new(Z_ARRVAL_P(argument_array), param_ptr);
param_ptr++;
}
@@ -168,9 +103,9 @@ ZEND_API char *zend_get_type_by_const(int type) /* {{{ */
case IS_FALSE:
case IS_TRUE:
case _IS_BOOL:
- return "boolean";
+ return "bool";
case IS_LONG:
- return "integer";
+ return "int";
case IS_DOUBLE:
return "float";
case IS_STRING:
@@ -189,6 +124,8 @@ ZEND_API char *zend_get_type_by_const(int type) /* {{{ */
return "array";
case IS_VOID:
return "void";
+ case _IS_NUMBER:
+ return "number";
default:
return "unknown";
}
@@ -232,13 +169,73 @@ ZEND_API zend_string *zend_zval_get_type(const zval *arg) /* {{{ */
}
/* }}} */
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_error(zend_bool throw_, int num_args, int min_num_args, int max_num_args) /* {{{ */
+ZEND_API ZEND_COLD int ZEND_FASTCALL zend_wrong_parameters_none_error(void) /* {{{ */
+{
+ int num_args = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
+ zend_function *active_function = EG(current_execute_data)->func;
+ const char *class_name = active_function->common.scope ? ZSTR_VAL(active_function->common.scope->name) : "";
+
+ zend_internal_argument_count_error(
+ ZEND_ARG_USES_STRICT_TYPES(),
+ "%s%s%s() expects %s %d parameter%s, %d given",
+ class_name, \
+ class_name[0] ? "::" : "", \
+ ZSTR_VAL(active_function->common.function_name),
+ "exactly",
+ 0,
+ "s",
+ num_args);
+ return FAILURE;
+}
+/* }}} */
+
+ZEND_API ZEND_COLD int ZEND_FASTCALL zend_wrong_parameters_none_exception(void) /* {{{ */
+{
+ int num_args = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
+ zend_function *active_function = EG(current_execute_data)->func;
+ const char *class_name = active_function->common.scope ? ZSTR_VAL(active_function->common.scope->name) : "";
+
+ zend_internal_argument_count_error(
+ 1,
+ "%s%s%s() expects %s %d parameter%s, %d given",
+ class_name, \
+ class_name[0] ? "::" : "", \
+ ZSTR_VAL(active_function->common.function_name),
+ "exactly",
+ 0,
+ "s",
+ num_args);
+ return FAILURE;
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_error(int min_num_args, int max_num_args) /* {{{ */
+{
+ int num_args = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
+ zend_function *active_function = EG(current_execute_data)->func;
+ const char *class_name = active_function->common.scope ? ZSTR_VAL(active_function->common.scope->name) : "";
+
+ zend_internal_argument_count_error(
+ ZEND_ARG_USES_STRICT_TYPES(),
+ "%s%s%s() expects %s %d parameter%s, %d given",
+ class_name, \
+ class_name[0] ? "::" : "", \
+ ZSTR_VAL(active_function->common.function_name),
+ min_num_args == max_num_args ? "exactly" : num_args < min_num_args ? "at least" : "at most",
+ num_args < min_num_args ? min_num_args : max_num_args,
+ (num_args < min_num_args ? min_num_args : max_num_args) == 1 ? "" : "s",
+ num_args);
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_exception(int min_num_args, int max_num_args) /* {{{ */
{
+ int num_args = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
zend_function *active_function = EG(current_execute_data)->func;
const char *class_name = active_function->common.scope ? ZSTR_VAL(active_function->common.scope->name) : "";
zend_internal_argument_count_error(
- throw_ || ZEND_ARG_USES_STRICT_TYPES(),
+ 1,
"%s%s%s() expects %s %d parameter%s, %d given",
class_name, \
class_name[0] ? "::" : "", \
@@ -250,7 +247,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_error(zend_boo
}
/* }}} */
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(zend_bool throw_, int num, zend_expected_type expected_type, zval *arg) /* {{{ */
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(int num, zend_expected_type expected_type, zval *arg) /* {{{ */
{
const char *space;
const char *class_name = get_active_class_name(&space);
@@ -259,36 +256,74 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(zend_bool
NULL
};
- zend_internal_type_error(throw_ || ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be %s, %s given",
+ zend_internal_type_error(ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be %s, %s given",
class_name, space, get_active_function_name(), num, expected_error[expected_type], zend_zval_type_name(arg));
}
/* }}} */
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(zend_bool throw_, int num, char *name, zval *arg) /* {{{ */
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_exception(int num, zend_expected_type expected_type, zval *arg) /* {{{ */
{
const char *space;
const char *class_name = get_active_class_name(&space);
+ static const char * const expected_error[] = {
+ Z_EXPECTED_TYPES(Z_EXPECTED_TYPE_STR)
+ NULL
+ };
- zend_internal_type_error(throw_ || ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be %s, %s given",
+ zend_internal_type_error(1, "%s%s%s() expects parameter %d to be %s, %s given",
+ class_name, space, get_active_function_name(), num, expected_error[expected_type], zend_zval_type_name(arg));
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(int num, char *name, zval *arg) /* {{{ */
+{
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
+
+ zend_internal_type_error(ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be %s, %s given",
class_name, space, get_active_function_name(), num, name, zend_zval_type_name(arg));
}
/* }}} */
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_, int severity, int num, char *error) /* {{{ */
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_exception(int num, char *name, zval *arg) /* {{{ */
{
const char *space;
const char *class_name = get_active_class_name(&space);
- if (severity == E_WARNING) {
- zend_internal_type_error(throw_ || ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be a valid callback, %s",
- class_name, space, get_active_function_name(), num, error);
- } else if (severity == E_ERROR) {
- zend_throw_error(zend_ce_type_error, "%s%s%s() expects parameter %d to be a valid callback, %s",
- class_name, space, get_active_function_name(), num, error);
- } else {
- zend_error(severity, "%s%s%s() expects parameter %d to be a valid callback, %s",
- class_name, space, get_active_function_name(), num, error);
- }
+ zend_internal_type_error(1, "%s%s%s() expects parameter %d to be %s, %s given",
+ class_name, space, get_active_function_name(), num, name, zend_zval_type_name(arg));
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int num, char *error) /* {{{ */
+{
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
+
+ zend_internal_type_error(ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be a valid callback, %s",
+ class_name, space, get_active_function_name(), num, error);
+ efree(error);
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, char *error) /* {{{ */
+{
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
+
+ zend_internal_type_error(1, "%s%s%s() expects parameter %d to be a valid callback, %s",
+ class_name, space, get_active_function_name(), num, error);
+ efree(error);
+}
+/* }}} */
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_deprecated(int num, char *error) /* {{{ */
+{
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
+
+ zend_error(E_DEPRECATED, "%s%s%s() expects parameter %d to be a valid callback, %s",
+ class_name, space, get_active_function_name(), num, error);
efree(error);
}
/* }}} */
@@ -494,12 +529,13 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest
zval rv;
zval *z = Z_OBJ_HANDLER_P(arg, get)(arg, &rv);
- Z_ADDREF_P(z);
if (Z_TYPE_P(z) != IS_OBJECT) {
- zval_dtor(arg);
- ZVAL_NULL(arg);
- if (!zend_make_printable_zval(z, arg)) {
+ zval_ptr_dtor(arg);
+ if (Z_TYPE_P(z) == IS_STRING) {
ZVAL_COPY_VALUE(arg, z);
+ } else {
+ ZVAL_STR(arg, zval_get_string_func(z));
+ zval_ptr_dtor(z);
}
*dest = Z_STR_P(arg);
return 1;
@@ -558,7 +594,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) {
- return "integer";
+ return "int";
}
}
break;
@@ -626,7 +662,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!zend_parse_arg_bool(arg, p, is_null, check_null)) {
- return "boolean";
+ return "bool";
}
}
break;
@@ -729,7 +765,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
if (check_null && Z_TYPE_P(arg) == IS_NULL) {
fci->size = 0;
- fcc->initialized = 0;
+ fcc->function_handler = 0;
break;
}
@@ -1084,15 +1120,6 @@ ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args, zval *this
}
/* }}} */
-/* Argument parsing API -- andrei */
-ZEND_API int _array_init(zval *arg, uint32_t size ZEND_FILE_LINE_DC) /* {{{ */
-{
- ZVAL_NEW_ARR(arg);
- _zend_hash_init(Z_ARRVAL_P(arg), size, ZVAL_PTR_DTOR, 0 ZEND_FILE_LINE_RELAY_CC);
- return SUCCESS;
-}
-/* }}} */
-
/* This function should be called after the constructor has been called
* because it may call __set from the uninitialized object otherwise. */
ZEND_API void zend_merge_properties(zval *obj, HashTable *properties) /* {{{ */
@@ -1118,74 +1145,46 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties) /* {{{ */
ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
{
if (!(class_type->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+ zend_class_entry *ce;
+ zend_class_constant *c;
+ zval *val;
+ zend_property_info *prop_info;
+
if (class_type->parent) {
if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) {
return FAILURE;
}
}
- if (!CE_STATIC_MEMBERS(class_type) && class_type->default_static_members_count) {
- /* initialize static members of internal class */
- int i;
- zval *p;
-
-#if ZTS
- CG(static_members_table)[(zend_intptr_t)(class_type->static_members_table)] = emalloc(sizeof(zval) * class_type->default_static_members_count);
-#else
- class_type->static_members_table = emalloc(sizeof(zval) * class_type->default_static_members_count);
-#endif
- for (i = 0; i < class_type->default_static_members_count; i++) {
- p = &class_type->default_static_members_table[i];
- if (Z_ISREF_P(p) &&
- class_type->parent &&
- i < class_type->parent->default_static_members_count &&
- p == &class_type->parent->default_static_members_table[i] &&
- Z_TYPE(CE_STATIC_MEMBERS(class_type->parent)[i]) != IS_UNDEF
- ) {
- zval *q = &CE_STATIC_MEMBERS(class_type->parent)[i];
-
- ZVAL_NEW_REF(q, q);
- ZVAL_COPY_VALUE(&CE_STATIC_MEMBERS(class_type)[i], q);
- Z_ADDREF_P(q);
- } else {
- ZVAL_DUP(&CE_STATIC_MEMBERS(class_type)[i], p);
+ ZEND_HASH_FOREACH_PTR(&class_type->constants_table, c) {
+ val = &c->value;
+ if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
+ if (UNEXPECTED(zval_update_constant_ex(val, c->ce) != SUCCESS)) {
+ return FAILURE;
}
}
- } else {
- zend_class_entry *ce;
- zend_class_constant *c;
- zval *val;
- zend_property_info *prop_info;
-
- ZEND_HASH_FOREACH_PTR(&class_type->constants_table, c) {
- val = &c->value;
- if (Z_CONSTANT_P(val)) {
- if (UNEXPECTED(zval_update_constant_ex(val, c->ce) != SUCCESS)) {
- return FAILURE;
- }
- }
- } ZEND_HASH_FOREACH_END();
+ } ZEND_HASH_FOREACH_END();
- ce = class_type;
- while (ce) {
- ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (prop_info->ce == ce) {
- if (prop_info->flags & ZEND_ACC_STATIC) {
- val = CE_STATIC_MEMBERS(class_type) + prop_info->offset;
- } else {
- val = (zval*)((char*)class_type->default_properties_table + prop_info->offset - OBJ_PROP_TO_OFFSET(0));
- }
- ZVAL_DEREF(val);
- if (Z_CONSTANT_P(val)) {
- if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) {
- return FAILURE;
- }
+ ce = class_type;
+ while (ce) {
+ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
+ if (prop_info->ce == ce) {
+ if (prop_info->flags & ZEND_ACC_STATIC) {
+ val = CE_STATIC_MEMBERS(class_type) + prop_info->offset;
+ } else {
+ val = (zval*)((char*)class_type->default_properties_table + prop_info->offset - OBJ_PROP_TO_OFFSET(0));
+ }
+ ZVAL_DEREF(val);
+ if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
+ if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) {
+ return FAILURE;
}
}
- } ZEND_HASH_FOREACH_END();
- ce = ce->parent;
- }
+ }
+ } ZEND_HASH_FOREACH_END();
+ ce = ce->parent;
}
+
class_type->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
}
@@ -1200,15 +1199,19 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas
zval *dst = object->properties_table;
zval *end = src + class_type->default_properties_count;
- do {
-#if ZTS
- ZVAL_DUP(dst, src);
-#else
- ZVAL_COPY(dst, src);
-#endif
- src++;
- dst++;
- } while (src != end);
+ if (UNEXPECTED(class_type->type == ZEND_INTERNAL_CLASS)) {
+ do {
+ ZVAL_COPY_OR_DUP(dst, src);
+ src++;
+ dst++;
+ } while (src != end);
+ } else {
+ do {
+ ZVAL_COPY(dst, src);
+ src++;
+ dst++;
+ } while (src != end);
+ }
object->properties = NULL;
}
}
@@ -1254,10 +1257,10 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
if (class_name && class_name[0] != '*') {
zend_string *cname = zend_string_init(class_name, strlen(class_name), 0);
EG(fake_scope) = zend_lookup_class(cname);
- zend_string_release(cname);
+ zend_string_release_ex(cname, 0);
}
property_info = zend_get_property_info(object->ce, pname, 1);
- zend_string_release(pname);
+ zend_string_release_ex(pname, 0);
EG(fake_scope) = prev_scope;
} else {
property_info = ZEND_WRONG_PROPERTY_INFO;
@@ -1298,7 +1301,7 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
* class and all props being public. If only a subset is given or the class
* has protected members then you need to merge the properties separately by
* calling zend_merge_properties(). */
-ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API int object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties) /* {{{ */
{
if (UNEXPECTED(class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) {
if (class_type->ce_flags & ZEND_ACC_INTERFACE) {
@@ -1335,104 +1338,103 @@ ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type
}
/* }}} */
-ZEND_API int _object_init_ex(zval *arg, zend_class_entry *class_type ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API int object_init_ex(zval *arg, zend_class_entry *class_type) /* {{{ */
{
- return _object_and_properties_init(arg, class_type, 0 ZEND_FILE_LINE_RELAY_CC);
+ return object_and_properties_init(arg, class_type, 0);
}
/* }}} */
-ZEND_API int _object_init(zval *arg ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API int object_init(zval *arg) /* {{{ */
{
- return _object_init_ex(arg, zend_standard_class_def ZEND_FILE_LINE_RELAY_CC);
+ ZVAL_OBJ(arg, zend_objects_new(zend_standard_class_def));
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_long_ex(zval *arg, const char *key, size_t key_len, zend_long n) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_LONG(&tmp, n);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_null_ex(zval *arg, const char *key, size_t key_len) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_NULL(&tmp);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_bool_ex(zval *arg, const char *key, size_t key_len, int b) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_BOOL(&tmp, b);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_resource_ex(zval *arg, const char *key, size_t key_len, zend_resource *r) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_RES(&tmp, r);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_double_ex(zval *arg, const char *key, size_t key_len, double d) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_DOUBLE(&tmp, d);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_STR(&tmp, str);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_STRING(&tmp, str);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length) /* {{{ */
{
- zval *ret, tmp;
+ zval tmp;
ZVAL_STRINGL(&tmp, str, length);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value) /* {{{ */
{
- zval *ret;
-
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, value);
- return ret ? SUCCESS : FAILURE;
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, value);
+ return SUCCESS;
}
/* }}} */
@@ -1441,7 +1443,8 @@ ZEND_API int add_index_long(zval *arg, zend_ulong index, zend_long n) /* {{{ */
zval tmp;
ZVAL_LONG(&tmp, n);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1450,7 +1453,8 @@ ZEND_API int add_index_null(zval *arg, zend_ulong index) /* {{{ */
zval tmp;
ZVAL_NULL(&tmp);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1459,7 +1463,8 @@ ZEND_API int add_index_bool(zval *arg, zend_ulong index, int b) /* {{{ */
zval tmp;
ZVAL_BOOL(&tmp, b);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1468,7 +1473,8 @@ ZEND_API int add_index_resource(zval *arg, zend_ulong index, zend_resource *r) /
zval tmp;
ZVAL_RES(&tmp, r);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1477,7 +1483,8 @@ ZEND_API int add_index_double(zval *arg, zend_ulong index, double d) /* {{{ */
zval tmp;
ZVAL_DOUBLE(&tmp, d);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1486,7 +1493,8 @@ ZEND_API int add_index_str(zval *arg, zend_ulong index, zend_string *str) /* {{{
zval tmp;
ZVAL_STR(&tmp, str);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1495,7 +1503,8 @@ ZEND_API int add_index_string(zval *arg, zend_ulong index, const char *str) /* {
zval tmp;
ZVAL_STRING(&tmp, str);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
@@ -1504,13 +1513,15 @@ ZEND_API int add_index_stringl(zval *arg, zend_ulong index, const char *str, siz
zval tmp;
ZVAL_STRINGL(&tmp, str, length);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+ return SUCCESS;
}
/* }}} */
ZEND_API int add_index_zval(zval *arg, zend_ulong index, zval *value) /* {{{ */
{
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, value) ? SUCCESS : FAILURE;
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, value);
+ return SUCCESS;
}
/* }}} */
@@ -1690,9 +1701,7 @@ ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
}
if (result) {
- if (Z_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
+ Z_TRY_ADDREF_P(result);
return SUCCESS;
} else {
return FAILURE;
@@ -1708,7 +1717,6 @@ ZEND_API int add_property_long_ex(zval *arg, const char *key, size_t key_len, ze
ZVAL_LONG(&tmp, n);
ZVAL_STRINGL(&z_key, key, key_len);
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
- zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
zval_ptr_dtor(&z_key);
return SUCCESS;
}
@@ -1722,7 +1730,6 @@ ZEND_API int add_property_bool_ex(zval *arg, const char *key, size_t key_len, ze
ZVAL_BOOL(&tmp, b);
ZVAL_STRINGL(&z_key, key, key_len);
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
- zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
zval_ptr_dtor(&z_key);
return SUCCESS;
}
@@ -1736,7 +1743,6 @@ ZEND_API int add_property_null_ex(zval *arg, const char *key, size_t key_len) /*
ZVAL_NULL(&tmp);
ZVAL_STRINGL(&z_key, key, key_len);
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
- zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
zval_ptr_dtor(&z_key);
return SUCCESS;
}
@@ -1764,7 +1770,6 @@ ZEND_API int add_property_double_ex(zval *arg, const char *key, size_t key_len,
ZVAL_DOUBLE(&tmp, d);
ZVAL_STRINGL(&z_key, key, key_len);
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
- zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
zval_ptr_dtor(&z_key);
return SUCCESS;
}
@@ -1846,13 +1851,13 @@ ZEND_API int zend_startup_module_ex(zend_module_entry *module) /* {{{ */
zend_str_tolower_copy(ZSTR_VAL(lcname), dep->name, name_len);
if ((req_mod = zend_hash_find_ptr(&module_registry, lcname)) == NULL || !req_mod->module_started) {
- zend_string_free(lcname);
+ zend_string_efree(lcname);
/* TODO: Check version relationship */
zend_error(E_CORE_WARNING, "Cannot load module '%s' because required module '%s' is not loaded", module->name, dep->name);
module->module_started = 0;
return FAILURE;
}
- zend_string_free(lcname);
+ zend_string_efree(lcname);
}
++dep;
}
@@ -2034,19 +2039,19 @@ ZEND_API zend_module_entry* zend_register_module_ex(zend_module_entry *module) /
zend_str_tolower_copy(ZSTR_VAL(lcname), dep->name, name_len);
if (zend_hash_exists(&module_registry, lcname) || zend_get_extension(dep->name)) {
- zend_string_free(lcname);
+ zend_string_efree(lcname);
/* TODO: Check version relationship */
zend_error(E_CORE_WARNING, "Cannot load module '%s' because conflicting module '%s' is already loaded", module->name, dep->name);
return NULL;
}
- zend_string_free(lcname);
+ zend_string_efree(lcname);
}
++dep;
}
}
name_len = strlen(module->name);
- lcname = zend_string_alloc(name_len, 1);
+ lcname = zend_string_alloc(name_len, module->type == MODULE_PERSISTENT);
zend_str_tolower_copy(ZSTR_VAL(lcname), module->name, name_len);
lcname = zend_new_interned_string(lcname);
@@ -2085,6 +2090,11 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce,
char lcname[16];
size_t name_len;
+ if (ZSTR_VAL(fptr->common.function_name)[0] != '_'
+ || ZSTR_VAL(fptr->common.function_name)[1] != '_') {
+ return;
+ }
+
/* we don't care if the function name is longer, in fact lowercasing only
* the beginning of the name speeds up the check process */
name_len = ZSTR_LEN(fptr->common.function_name);
@@ -2186,7 +2196,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
while (ptr->fname) {
fname_len = strlen(ptr->fname);
internal_function->handler = ptr->handler;
- internal_function->function_name = zend_new_interned_string(zend_string_init(ptr->fname, fname_len, 1));
+ internal_function->function_name = zend_string_init_interned(ptr->fname, fname_len, 1);
internal_function->scope = scope;
internal_function->prototype = NULL;
if (ptr->flags) {
@@ -2269,8 +2279,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
return FAILURE;
}
}
- lowercase_name = zend_string_alloc(fname_len, 1);
- zend_str_tolower_copy(ZSTR_VAL(lowercase_name), ptr->fname, fname_len);
+ lowercase_name = zend_string_tolower_ex(internal_function->function_name, type == MODULE_PERSISTENT);
lowercase_name = zend_new_interned_string(lowercase_name);
reg_function = malloc(sizeof(zend_internal_function));
memcpy(reg_function, &function, sizeof(zend_internal_function));
@@ -2316,7 +2325,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
class_name++;
allow_null = 1;
}
- str = zend_new_interned_string(zend_string_init(class_name, strlen(class_name), 1));
+ str = zend_string_init_interned(class_name, strlen(class_name), 1);
new_arg_info[i].type = ZEND_TYPE_ENCODE_CLASS(str, allow_null);
}
}
@@ -2329,6 +2338,8 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
*/
if ((fname_len == class_name_len) && !ctor && !memcmp(ZSTR_VAL(lowercase_name), lc_class_name, class_name_len+1)) {
ctor = reg_function;
+ } else if (ZSTR_VAL(lowercase_name)[0] != '_' || ZSTR_VAL(lowercase_name)[1] != '_') {
+ reg_function = NULL;
} else if (zend_string_equals_literal(lowercase_name, ZEND_CONSTRUCTOR_FUNC_NAME)) {
ctor = reg_function;
} else if (zend_string_equals_literal(lowercase_name, ZEND_DESTRUCTOR_FUNC_NAME)) {
@@ -2380,7 +2391,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
if (zend_hash_exists(target_function_table, lowercase_name)) {
zend_error(error_type, "Function registration failed - duplicate name - %s%s%s", scope ? ZSTR_VAL(scope->name) : "", scope ? "::" : "", ptr->fname);
}
- zend_string_free(lowercase_name);
+ zend_string_efree(lowercase_name);
ptr++;
}
zend_unregister_functions(functions, count, target_function_table);
@@ -2505,7 +2516,7 @@ ZEND_API void zend_unregister_functions(const zend_function_entry *functions, in
lowercase_name = zend_string_alloc(fname_len, 0);
zend_str_tolower_copy(ZSTR_VAL(lowercase_name), ptr->fname, fname_len);
zend_hash_del(target_function_table, lowercase_name);
- zend_string_free(lowercase_name);
+ zend_string_efree(lowercase_name);
ptr++;
i++;
}
@@ -2578,7 +2589,7 @@ void module_destructor(zend_module_entry *module) /* {{{ */
}
module->module_started=0;
- if (module->functions) {
+ if (module->type == MODULE_TEMPORARY && module->functions) {
zend_unregister_functions(module->functions, -1, NULL);
}
@@ -2704,7 +2715,7 @@ ZEND_API int zend_next_free_module(void) /* {{{ */
static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class_entry, uint32_t ce_flags) /* {{{ */
{
zend_class_entry *class_entry = malloc(sizeof(zend_class_entry));
- zend_string *lowercase_name = zend_string_alloc(ZSTR_LEN(orig_class_entry->name), 1);
+ zend_string *lowercase_name;
*class_entry = *orig_class_entry;
class_entry->type = ZEND_INTERNAL_CLASS;
@@ -2713,13 +2724,13 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class
class_entry->info.internal.module = EG(current_module);
if (class_entry->info.internal.builtin_functions) {
- zend_register_functions(class_entry, class_entry->info.internal.builtin_functions, &class_entry->function_table, MODULE_PERSISTENT);
+ zend_register_functions(class_entry, class_entry->info.internal.builtin_functions, &class_entry->function_table, EG(current_module)->type);
}
- zend_str_tolower_copy(ZSTR_VAL(lowercase_name), ZSTR_VAL(orig_class_entry->name), ZSTR_LEN(class_entry->name));
+ lowercase_name = zend_string_tolower_ex(orig_class_entry->name, EG(current_module)->type == MODULE_PERSISTENT);
lowercase_name = zend_new_interned_string(lowercase_name);
zend_hash_update_ptr(CG(class_table), lowercase_name, class_entry);
- zend_string_release(lowercase_name);
+ zend_string_release_ex(lowercase_name, 1);
return class_entry;
}
/* }}} */
@@ -2771,12 +2782,14 @@ ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *or
}
/* }}} */
-ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce) /* {{{ */
+ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, int persistent) /* {{{ */
{
zend_string *lcname;
- int persistent;
- persistent = ce->type != ZEND_USER_CLASS;
+ /* TODO: Move this out of here in 7.4. */
+ if (persistent && EG(current_module) && EG(current_module)->type == MODULE_TEMPORARY) {
+ persistent = 0;
+ }
if (name[0] == '\\') {
lcname = zend_string_alloc(name_len-1, persistent);
@@ -2790,7 +2803,7 @@ ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zen
lcname = zend_new_interned_string(lcname);
ce = zend_hash_add_ptr(CG(class_table), lcname, ce);
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
if (ce) {
ce->refcount++;
return SUCCESS;
@@ -2814,9 +2827,7 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, const char *name, int name_lengt
while (num_symbol_tables-- > 0) {
symbol_table = va_arg(symbol_table_list, HashTable *);
zend_hash_str_update(symbol_table, name, name_length, symbol);
- if (Z_REFCOUNTED_P(symbol)) {
- Z_ADDREF_P(symbol);
- }
+ Z_TRY_ADDREF_P(symbol);
}
va_end(symbol_table_list);
return SUCCESS;
@@ -2886,11 +2897,11 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* {
key = zend_string_alloc(class_name_length, 0);
zend_str_tolower_copy(ZSTR_VAL(key), class_name, class_name_length);
disabled_class = zend_hash_find_ptr(CG(class_table), key);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
if (!disabled_class) {
return FAILURE;
}
- INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new, NULL, NULL, NULL, NULL, NULL);
+ INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new);
disabled_class->create_object = display_disabled_class;
zend_hash_clean(&disabled_class->function_table);
return SUCCESS;
@@ -2962,14 +2973,14 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
if (object &&
instanceof_function(object->ce, scope) &&
- instanceof_function(scope, fcc->calling_scope)) {
+ instanceof_function(scope, ce)) {
fcc->object = object;
fcc->called_scope = object->ce;
} else {
- fcc->called_scope = fcc->calling_scope;
+ fcc->called_scope = ce;
}
} else {
- fcc->called_scope = fcc->object ? fcc->object->ce : fcc->calling_scope;
+ fcc->called_scope = fcc->object ? fcc->object->ce : ce;
}
*strict_class = 1;
ret = 1;
@@ -2981,7 +2992,7 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
}
/* }}} */
-static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, int strict_class, char **error) /* {{{ */
+static zend_always_inline int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, int strict_class, char **error) /* {{{ */
{
zend_class_entry *ce_org = fcc->calling_scope;
int retval = 0;
@@ -2992,47 +3003,36 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
HashTable *ftable;
int call_via_handler = 0;
zend_class_entry *scope;
+ zval *zv;
ALLOCA_FLAG(use_heap)
- if (error) {
- *error = NULL;
- }
-
fcc->calling_scope = NULL;
- fcc->function_handler = NULL;
if (!ce_org) {
+ zend_function *func;
zend_string *lmname;
- /* Skip leading \ */
- if (UNEXPECTED(Z_STRVAL_P(callable)[0] == '\\')) {
- ZSTR_ALLOCA_INIT(lmname, Z_STRVAL_P(callable) + 1, Z_STRLEN_P(callable) - 1, use_heap);
- } else {
- lmname = Z_STR_P(callable);
- }
/* Check if function with given name exists.
* This may be a compound name that includes namespace name */
- if (EXPECTED((fcc->function_handler = zend_hash_find_ptr(EG(function_table), lmname)) != NULL)) {
- if (lmname != Z_STR_P(callable)) {
- ZSTR_ALLOCA_FREE(lmname, use_heap);
- }
- fcc->initialized = 1;
- return 1;
+ if (UNEXPECTED(Z_STRVAL_P(callable)[0] == '\\')) {
+ /* Skip leading \ */
+ ZSTR_ALLOCA_ALLOC(lmname, Z_STRLEN_P(callable) - 1, use_heap);
+ zend_str_tolower_copy(ZSTR_VAL(lmname), Z_STRVAL_P(callable) + 1, Z_STRLEN_P(callable) - 1);
+ func = zend_fetch_function(lmname);
+ ZSTR_ALLOCA_FREE(lmname, use_heap);
} else {
- if (lmname == Z_STR_P(callable)) {
- ZSTR_ALLOCA_INIT(lmname, Z_STRVAL_P(callable), Z_STRLEN_P(callable), use_heap);
- } else {
- zend_string_forget_hash_val(lmname);
- }
- zend_str_tolower(ZSTR_VAL(lmname), ZSTR_LEN(lmname));
- if ((fcc->function_handler = zend_hash_find_ptr(EG(function_table), lmname)) != NULL) {
+ lmname = Z_STR_P(callable);
+ func = zend_fetch_function(lmname);
+ if (!func) {
+ ZSTR_ALLOCA_ALLOC(lmname, Z_STRLEN_P(callable), use_heap);
+ zend_str_tolower_copy(ZSTR_VAL(lmname), Z_STRVAL_P(callable), Z_STRLEN_P(callable));
+ func = zend_fetch_function(lmname);
ZSTR_ALLOCA_FREE(lmname, use_heap);
- fcc->initialized = 1;
- return 1;
}
}
- if (lmname != Z_STR_P(callable)) {
- ZSTR_ALLOCA_FREE(lmname, use_heap);
+ if (EXPECTED(func != NULL)) {
+ fcc->function_handler = func;
+ return 1;
}
}
@@ -3048,7 +3048,7 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
mlen = Z_STRLEN_P(callable) - clen - 2;
if (colon == Z_STRVAL_P(callable)) {
- if (error) zend_spprintf(error, 0, "invalid function name");
+ if (error) *error = estrdup("invalid function name");
return 0;
}
@@ -3062,10 +3062,10 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
cname = zend_string_init(Z_STRVAL_P(callable), clen, 0);
if (!zend_is_callable_check_class(cname, scope, fcc, &strict_class, error)) {
- zend_string_release(cname);
+ zend_string_release_ex(cname, 0);
return 0;
}
- zend_string_release(cname);
+ zend_string_release_ex(cname, 0);
ftable = &fcc->calling_scope->function_table;
if (ce_org && !instanceof_function(ce_org, fcc->calling_scope)) {
@@ -3095,19 +3095,23 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
if (fcc->function_handler) {
retval = 1;
}
- } else if ((fcc->function_handler = zend_hash_find_ptr(ftable, lmname)) != NULL) {
+ } else if ((zv = zend_hash_find(ftable, lmname)) != NULL) {
+ fcc->function_handler = Z_PTR_P(zv);
retval = 1;
if ((fcc->function_handler->op_array.fn_flags & ZEND_ACC_CHANGED) &&
!strict_class) {
scope = zend_get_executed_scope();
if (scope &&
instanceof_function(fcc->function_handler->common.scope, scope)) {
- zend_function *priv_fbc;
- if ((priv_fbc = zend_hash_find_ptr(&scope->function_table, lmname)) != NULL
- && priv_fbc->common.fn_flags & ZEND_ACC_PRIVATE
- && priv_fbc->common.scope == scope) {
- fcc->function_handler = priv_fbc;
+ zv = zend_hash_find(&scope->function_table, lmname);
+ if (zv != NULL) {
+ zend_function *priv_fbc = Z_PTR_P(zv);
+
+ if (priv_fbc->common.fn_flags & ZEND_ACC_PRIVATE
+ && priv_fbc->common.scope == scope) {
+ fcc->function_handler = priv_fbc;
+ }
}
}
}
@@ -3147,7 +3151,7 @@ get_function_via_handler:
if (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
if (fcc->function_handler->type != ZEND_OVERLOADED_FUNCTION &&
fcc->function_handler->common.function_name) {
- zend_string_release(fcc->function_handler->common.function_name);
+ zend_string_release_ex(fcc->function_handler->common.function_name, 0);
}
zend_free_trampoline(fcc->function_handler);
}
@@ -3247,15 +3251,12 @@ get_function_via_handler:
if (error) zend_spprintf(error, 0, "function '%s' does not exist", ZSTR_VAL(mname));
}
}
- zend_string_release(lmname);
- zend_string_release(mname);
+ zend_string_release_ex(lmname, 0);
+ zend_string_release_ex(mname, 0);
if (fcc->object) {
fcc->called_scope = fcc->object->ce;
}
- if (retval) {
- fcc->initialized = 1;
- }
return retval;
}
/* }}} */
@@ -3324,7 +3325,7 @@ try_again:
callable = Z_REFVAL_P(callable);
goto try_again;
default:
- return zval_get_string(callable);
+ return zval_get_string_func(callable);
}
}
/* }}} */
@@ -3335,10 +3336,11 @@ ZEND_API zend_string *zend_get_callable_name(zval *callable) /* {{{ */
}
/* }}} */
-static zend_bool zend_is_callable_impl(zval *callable, zend_object *object, uint32_t check_flags, zend_fcall_info_cache *fcc, char **error) /* {{{ */
+static zend_always_inline zend_bool zend_is_callable_impl(zval *callable, zend_object *object, uint32_t check_flags, zend_fcall_info_cache *fcc, char **error) /* {{{ */
{
zend_bool ret;
zend_fcall_info_cache fcc_local;
+ int strict_class = 0;
if (fcc == NULL) {
fcc = &fcc_local;
@@ -3347,7 +3349,6 @@ static zend_bool zend_is_callable_impl(zval *callable, zend_object *object, uint
*error = NULL;
}
- fcc->initialized = 0;
fcc->calling_scope = NULL;
fcc->called_scope = NULL;
fcc->function_handler = NULL;
@@ -3366,7 +3367,8 @@ again:
return 1;
}
- ret = zend_is_callable_check_func(check_flags, callable, fcc, 0, error);
+check_func:
+ ret = zend_is_callable_check_func(check_flags, callable, fcc, strict_class, error);
if (fcc == &fcc_local &&
fcc->function_handler &&
((fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) ||
@@ -3374,7 +3376,7 @@ again:
fcc->function_handler->type == ZEND_OVERLOADED_FUNCTION)) {
if (fcc->function_handler->type != ZEND_OVERLOADED_FUNCTION &&
fcc->function_handler->common.function_name) {
- zend_string_release(fcc->function_handler->common.function_name);
+ zend_string_release_ex(fcc->function_handler->common.function_name, 0);
}
zend_free_trampoline(fcc->function_handler);
}
@@ -3384,7 +3386,6 @@ again:
{
zval *method = NULL;
zval *obj = NULL;
- int strict_class = 0;
if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) {
obj = zend_hash_index_find(Z_ARRVAL_P(callable), 0);
@@ -3425,47 +3426,35 @@ again:
break;
}
- ret = zend_is_callable_check_func(check_flags, method, fcc, strict_class, error);
- if (fcc == &fcc_local &&
- fcc->function_handler &&
- ((fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) ||
- fcc->function_handler->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY ||
- fcc->function_handler->type == ZEND_OVERLOADED_FUNCTION)) {
- if (fcc->function_handler->type != ZEND_OVERLOADED_FUNCTION &&
- fcc->function_handler->common.function_name) {
- zend_string_release(fcc->function_handler->common.function_name);
- }
- zend_free_trampoline(fcc->function_handler);
- }
- return ret;
+ callable = method;
+ goto check_func;
} while (0);
if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) {
if (!obj || (!Z_ISREF_P(obj)?
(Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) :
(Z_TYPE_P(Z_REFVAL_P(obj)) != IS_STRING && Z_TYPE_P(Z_REFVAL_P(obj)) != IS_OBJECT))) {
- if (error) zend_spprintf(error, 0, "first array member is not a valid class name or object");
+ if (error) *error = estrdup("first array member is not a valid class name or object");
} else {
- if (error) zend_spprintf(error, 0, "second array member is not a valid method");
+ if (error) *error = estrdup("second array member is not a valid method");
}
} else {
- if (error) zend_spprintf(error, 0, "array must have exactly two members");
+ if (error) *error = estrdup("array must have exactly two members");
}
}
return 0;
case IS_OBJECT:
if (Z_OBJ_HANDLER_P(callable, get_closure) && Z_OBJ_HANDLER_P(callable, get_closure)(callable, &fcc->calling_scope, &fcc->function_handler, &fcc->object) == SUCCESS) {
fcc->called_scope = fcc->calling_scope;
- fcc->initialized = 1;
return 1;
}
- if (error) zend_spprintf(error, 0, "no array or string given");
+ if (error) *error = estrdup("no array or string given");
return 0;
case IS_REFERENCE:
callable = Z_REFVAL_P(callable);
goto again;
default:
- if (error) zend_spprintf(error, 0, "no array or string given");
+ if (error) *error = estrdup("no array or string given");
return 0;
}
}
@@ -3492,7 +3481,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam
if (zend_is_callable_ex(callable, NULL, IS_CALLABLE_STRICT, callable_name, &fcc, NULL)) {
if (Z_TYPE_P(callable) == IS_STRING && fcc.calling_scope) {
- zval_dtor(callable);
+ zval_ptr_dtor_str(callable);
array_init(callable);
add_next_index_str(callable, zend_string_copy(fcc.calling_scope->name));
add_next_index_str(callable, zend_string_copy(fcc.function_handler->common.function_name));
@@ -3502,7 +3491,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam
fcc.function_handler->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY ||
fcc.function_handler->type == ZEND_OVERLOADED_FUNCTION)) {
if (fcc.function_handler->type != ZEND_OVERLOADED_FUNCTION) {
- zend_string_release(fcc.function_handler->common.function_name);
+ zend_string_release_ex(fcc.function_handler->common.function_name, 0);
}
zend_free_trampoline(fcc.function_handler);
}
@@ -3587,9 +3576,7 @@ ZEND_API int zend_fcall_info_args_ex(zend_fcall_info *fci, zend_function *func,
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args), arg) {
if (func && !Z_ISREF_P(arg) && ARG_SHOULD_BE_SENT_BY_REF(func, n)) {
ZVAL_NEW_REF(params, arg);
- if (Z_REFCOUNTED_P(arg)) {
- Z_ADDREF_P(arg);
- }
+ Z_TRY_ADDREF_P(arg);
} else {
ZVAL_COPY(params, arg);
}
@@ -3699,27 +3686,43 @@ ZEND_API const char *zend_get_module_version(const char *module_name) /* {{{ */
lname = zend_string_alloc(name_len, 0);
zend_str_tolower_copy(ZSTR_VAL(lname), module_name, name_len);
module = zend_hash_find_ptr(&module_registry, lname);
- zend_string_free(lname);
+ zend_string_efree(lname);
return module ? module->version : NULL;
}
/* }}} */
+static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */
+{
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
+ Z_STR_P(zv) = zend_new_interned_string(Z_STR_P(zv));
+ if (ZSTR_IS_INTERNED(Z_STR_P(zv))) {
+ Z_TYPE_FLAGS_P(zv) = 0;
+ }
+ return Z_STR_P(zv);
+}
+
+static zend_always_inline zend_bool is_persistent_class(zend_class_entry *ce) {
+ return (ce->type & ZEND_INTERNAL_CLASS)
+ && ce->info.internal.module->type == MODULE_PERSISTENT;
+}
+
ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */
{
zend_property_info *property_info, *property_info_ptr;
if (ce->type == ZEND_INTERNAL_CLASS) {
property_info = pemalloc(sizeof(zend_property_info), 1);
- if ((access_type & ZEND_ACC_STATIC) || Z_CONSTANT_P(property)) {
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
- }
} else {
property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info));
- if (Z_CONSTANT_P(property)) {
+ if (Z_TYPE_P(property) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
}
+ if (Z_TYPE_P(property) == IS_STRING && !ZSTR_IS_INTERNED(Z_STR_P(property))) {
+ zval_make_interned_string(property);
+ }
+
if (!(access_type & ZEND_ACC_PPP_MASK)) {
access_type |= ZEND_ACC_PUBLIC;
}
@@ -3768,10 +3771,10 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
if (access_type & ZEND_ACC_PUBLIC) {
property_info->name = zend_string_copy(name);
} else if (access_type & ZEND_ACC_PRIVATE) {
- property_info->name = zend_mangle_property_name(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS);
+ property_info->name = zend_mangle_property_name(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), is_persistent_class(ce));
} else {
ZEND_ASSERT(access_type & ZEND_ACC_PROTECTED);
- property_info->name = zend_mangle_property_name("*", 1, ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS);
+ property_info->name = zend_mangle_property_name("*", 1, ZSTR_VAL(name), ZSTR_LEN(name), is_persistent_class(ce));
}
property_info->name = zend_new_interned_string(property_info->name);
@@ -3786,7 +3789,7 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
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);
+ zend_string *key = zend_string_init(name, name_length, is_persistent_class(ce));
int ret = zend_declare_property_ex(ce, key, property, access_type, NULL);
zend_string_release(key);
return ret;
@@ -3862,6 +3865,10 @@ ZEND_API int zend_declare_class_constant_ex(zend_class_entry *ce, zend_string *n
"A class constant must not be called 'class'; it is reserved for class name fetching");
}
+ if (Z_TYPE_P(value) == IS_STRING && !ZSTR_IS_INTERNED(Z_STR_P(value))) {
+ zval_make_interned_string(value);
+ }
+
if (ce->type == ZEND_INTERNAL_CLASS) {
c = pemalloc(sizeof(zend_class_constant), 1);
} else {
@@ -3871,7 +3878,7 @@ ZEND_API int zend_declare_class_constant_ex(zend_class_entry *ce, zend_string *n
Z_ACCESS_FLAGS(c->value) = access_type;
c->doc_comment = doc_comment;
c->ce = ce;
- if (Z_CONSTANT_P(value)) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
@@ -3888,9 +3895,12 @@ ZEND_API int zend_declare_class_constant(zend_class_entry *ce, const char *name,
{
int ret;
- zend_string *key = zend_string_init(name, name_length, ce->type & ZEND_INTERNAL_CLASS);
+ zend_string *key;
+
if (ce->type == ZEND_INTERNAL_CLASS) {
- key = zend_new_interned_string(key);
+ key = zend_string_init_interned(name, name_length, 1);
+ } else {
+ key = zend_string_init(name, name_length, 0);
}
ret = zend_declare_class_constant_ex(ce, key, value, ZEND_ACC_PUBLIC, NULL);
zend_string_release(key);
@@ -4067,42 +4077,37 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object
}
/* }}} */
-ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value) /* {{{ */
+ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string *name, zval *value) /* {{{ */
{
zval *property;
zend_class_entry *old_scope = EG(fake_scope);
- zend_string *key = zend_string_init(name, name_length, 0);
EG(fake_scope) = scope;
- property = zend_std_get_static_property(scope, key, 0);
+ property = zend_std_get_static_property(scope, name, 0);
EG(fake_scope) = old_scope;
- zend_string_free(key);
+
if (!property) {
return FAILURE;
- } else {
- if (property != value) {
- if (Z_ISREF_P(property)) {
- zval_dtor(property);
- ZVAL_COPY_VALUE(property, value);
- if (Z_REFCOUNTED_P(value) && Z_REFCOUNT_P(value) > 0) {
- zval_opt_copy_ctor(property);
- }
- } else {
- zval garbage;
+ }
- ZVAL_COPY_VALUE(&garbage, property);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- if (Z_ISREF_P(value)) {
- SEPARATE_ZVAL(value);
- }
- }
- ZVAL_COPY_VALUE(property, value);
- zval_ptr_dtor(&garbage);
- }
- }
- return SUCCESS;
+ if (property != value) {
+ zval garbage;
+ ZVAL_DEREF(property);
+ ZVAL_DEREF(value);
+ ZVAL_COPY_VALUE(&garbage, property);
+ ZVAL_COPY(property, value);
+ zval_ptr_dtor(&garbage);
}
+ return SUCCESS;
+}
+/* }}} */
+
+ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value) /* {{{ */
+{
+ zend_string *key = zend_string_init(name, name_length, 0);
+ int retval = zend_update_static_property_ex(scope, key, value);
+ zend_string_efree(key);
+ return retval;
}
/* }}} */
@@ -4188,26 +4193,33 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const c
str = zend_string_init(name, name_length, 0);
value = zend_read_property_ex(scope, object, str, silent, rv);
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
return value;
}
/* }}} */
-ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent) /* {{{ */
+ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, zend_bool silent) /* {{{ */
{
zval *property;
zend_class_entry *old_scope = EG(fake_scope);
- zend_string *key = zend_string_init(name, name_length, 0);
EG(fake_scope) = scope;
- property = zend_std_get_static_property(scope, key, silent);
+ property = zend_std_get_static_property(scope, name, silent);
EG(fake_scope) = old_scope;
- zend_string_free(key);
return property;
}
/* }}} */
+ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent) /* {{{ */
+{
+ zend_string *key = zend_string_init(name, name_length, 0);
+ zval *property = zend_read_static_property_ex(scope, key, silent);
+ zend_string_efree(key);
+ return property;
+}
+/* }}} */
+
ZEND_API void zend_save_error_handling(zend_error_handling *current) /* {{{ */
{
current->handling = EG(error_handling);
@@ -4345,6 +4357,23 @@ ZEND_API zend_bool zend_is_iterable(zval *iterable) /* {{{ */
}
/* }}} */
+ZEND_API zend_bool zend_is_countable(zval *countable) /* {{{ */
+{
+ switch (Z_TYPE_P(countable)) {
+ case IS_ARRAY:
+ return 1;
+ case IS_OBJECT:
+ if (Z_OBJ_HT_P(countable)->count_elements) {
+ return 1;
+ }
+
+ return instanceof_function(Z_OBJCE_P(countable), zend_ce_countable);
+ default:
+ return 0;
+ }
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 3840770362..3c134f44ef 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -12,15 +12,13 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
| Andrei Zmievski <andrei@php.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_API_H
#define ZEND_API_H
@@ -52,7 +50,6 @@ typedef struct _zend_fcall_info {
} zend_fcall_info;
typedef struct _zend_fcall_info_cache {
- zend_bool initialized;
zend_function *function_handler;
zend_class_entry *calling_scope;
zend_class_entry *called_scope;
@@ -63,7 +60,7 @@ typedef struct _zend_fcall_info_cache {
#define ZEND_FN(name) zif_##name
#define ZEND_MN(name) zim_##name
-#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
+#define ZEND_NAMED_FUNCTION(name) void ZEND_FASTCALL name(INTERNAL_FUNCTION_PARAMETERS)
#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
#define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))
@@ -186,20 +183,16 @@ typedef struct _zend_fcall_info_cache {
#endif
#define INIT_CLASS_ENTRY(class_container, class_name, functions) \
- INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, NULL, NULL, NULL)
+ INIT_CLASS_ENTRY_EX(class_container, class_name, sizeof(class_name)-1, functions)
#define INIT_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions) \
- INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, NULL, NULL, NULL, NULL, NULL)
-
-#define INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
{ \
- zend_string *cl_name; \
- cl_name = zend_string_init(class_name, class_name_len, 1); \
- class_container.name = zend_new_interned_string(cl_name); \
- INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
+ memset(&class_container, 0, sizeof(zend_class_entry)); \
+ class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \
+ class_container.info.internal.builtin_functions = functions; \
}
-#define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
+#define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions) \
{ \
class_container.constructor = NULL; \
class_container.destructor = NULL; \
@@ -207,20 +200,17 @@ typedef struct _zend_fcall_info_cache {
class_container.serialize = NULL; \
class_container.unserialize = NULL; \
class_container.create_object = NULL; \
- class_container.interface_gets_implemented = NULL; \
class_container.get_static_method = NULL; \
- class_container.__call = handle_fcall; \
+ class_container.__call = NULL; \
class_container.__callstatic = NULL; \
class_container.__tostring = NULL; \
- class_container.__get = handle_propget; \
- class_container.__set = handle_propset; \
- class_container.__unset = handle_propunset; \
- class_container.__isset = handle_propisset; \
- class_container.__debugInfo = NULL; \
+ class_container.__get = NULL; \
+ class_container.__set = NULL; \
+ class_container.__unset = NULL; \
+ class_container.__isset = NULL; \
+ class_container.__debugInfo = NULL; \
class_container.serialize_func = NULL; \
class_container.unserialize_func = NULL; \
- class_container.serialize = NULL; \
- class_container.unserialize = NULL; \
class_container.parent = NULL; \
class_container.num_interfaces = 0; \
class_container.traits = NULL; \
@@ -229,20 +219,14 @@ typedef struct _zend_fcall_info_cache {
class_container.trait_precedences = NULL; \
class_container.interfaces = NULL; \
class_container.get_iterator = NULL; \
- class_container.iterator_funcs.funcs = NULL; \
+ class_container.iterator_funcs_ptr = NULL; \
class_container.info.internal.module = NULL; \
class_container.info.internal.builtin_functions = functions; \
}
-#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
- INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, sizeof(class_name)-1, functions, handle_fcall, handle_propget, handle_propset, NULL, NULL)
#define INIT_NS_CLASS_ENTRY(class_container, ns, class_name, functions) \
INIT_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions)
-#define INIT_OVERLOADED_NS_CLASS_ENTRY_EX(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
- INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, ZEND_NS_NAME(ns, class_name), sizeof(ZEND_NS_NAME(ns, class_name))-1, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset)
-#define INIT_OVERLOADED_NS_CLASS_ENTRY(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset) \
- INIT_OVERLOADED_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions, handle_fcall, handle_propget, handle_propset)
#ifdef ZTS
# define CE_STATIC_MEMBERS(ce) (((ce)->type==ZEND_USER_CLASS)?(ce)->static_members_table:CG(static_members_table)[(zend_intptr_t)(ce)->static_members_table])
@@ -255,8 +239,6 @@ typedef struct _zend_fcall_info_cache {
ZEND_API int zend_next_free_module(void);
BEGIN_EXTERN_C()
-ZEND_API int zend_get_parameters(int ht, int param_count, ...);
-ZEND_API ZEND_ATTRIBUTE_DEPRECATED int zend_get_parameters_ex(int param_count, ...);
ZEND_API int _zend_get_parameters_array_ex(int param_count, zval *argument_array);
/* internal function to efficiently copy parameters when executing __call() */
@@ -267,9 +249,9 @@ ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array);
#define zend_get_parameters_array_ex(param_count, argument_array) \
_zend_get_parameters_array_ex(param_count, argument_array)
#define zend_parse_parameters_none() \
- (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_parse_parameters(ZEND_NUM_ARGS(), ""))
+ (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_wrong_parameters_none_error())
#define zend_parse_parameters_none_throw() \
- (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_parse_parameters_throw(ZEND_NUM_ARGS(), ""))
+ (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_wrong_parameters_none_exception())
/* Parameter parsing API -- andrei */
@@ -304,12 +286,12 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *cla
ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *orig_class_entry);
ZEND_API void zend_class_implements(zend_class_entry *class_entry, int num_interfaces, ...);
-ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce);
+ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, int persistent);
#define zend_register_class_alias(name, ce) \
- zend_register_class_alias_ex(name, sizeof(name)-1, ce)
+ zend_register_class_alias_ex(name, sizeof(name)-1, ce, 1)
#define zend_register_ns_class_alias(ns, name, ce) \
- zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce)
+ zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce, 1)
ZEND_API int zend_disable_function(char *function_name, size_t function_name_length);
ZEND_API int zend_disable_class(char *class_name, size_t class_name_length);
@@ -361,6 +343,7 @@ ZEND_API void zend_update_property_string(zend_class_entry *scope, zval *object,
ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object, const char *name, size_t name_length, const char *value, size_t value_length);
ZEND_API void zend_unset_property(zend_class_entry *scope, zval *object, const char *name, size_t name_length);
+ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string *name, zval *value);
ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value);
ZEND_API int zend_update_static_property_null(zend_class_entry *scope, const char *name, size_t name_length);
ZEND_API int zend_update_static_property_bool(zend_class_entry *scope, const char *name, size_t name_length, zend_long value);
@@ -372,6 +355,7 @@ ZEND_API int zend_update_static_property_stringl(zend_class_entry *scope, const
ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zval *object, zend_string *name, zend_bool silent, zval *rv);
ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_bool silent, zval *rv);
+ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, zend_bool silent);
ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent);
ZEND_API char *zend_get_type_by_const(int type);
@@ -390,15 +374,11 @@ ZEND_API char *zend_get_type_by_const(int type);
#define DLEXPORT
#endif
-#define array_init(arg) _array_init((arg), 0 ZEND_FILE_LINE_CC)
-#define array_init_size(arg, size) _array_init((arg), (size) ZEND_FILE_LINE_CC)
-#define object_init(arg) _object_init((arg) ZEND_FILE_LINE_CC)
-#define object_init_ex(arg, ce) _object_init_ex((arg), (ce) ZEND_FILE_LINE_CC)
-#define object_and_properties_init(arg, ce, properties) _object_and_properties_init((arg), (ce), (properties) ZEND_FILE_LINE_CC)
-ZEND_API int _array_init(zval *arg, uint32_t size ZEND_FILE_LINE_DC);
-ZEND_API int _object_init(zval *arg ZEND_FILE_LINE_DC);
-ZEND_API int _object_init_ex(zval *arg, zend_class_entry *ce ZEND_FILE_LINE_DC);
-ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *ce, HashTable *properties ZEND_FILE_LINE_DC);
+#define array_init(arg) ZVAL_ARR((arg), zend_new_array(0))
+#define array_init_size(arg, size) ZVAL_ARR((arg), zend_new_array(size))
+ZEND_API int object_init(zval *arg);
+ZEND_API int object_init_ex(zval *arg, zend_class_entry *ce);
+ZEND_API int object_and_properties_init(zval *arg, zend_class_entry *ce, HashTable *properties);
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type);
ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properties);
ZEND_API void object_properties_load(zend_object *object, HashTable *properties);
@@ -425,7 +405,7 @@ ZEND_API int add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval
#define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
#define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value)
-/* unset() functions are only suported for legacy modules and null() functions should be used */
+/* unset() functions are only supported for legacy modules and null() functions should be used */
#define add_assoc_unset(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key))
#define add_index_unset(__arg, __key) add_index_null(__arg, __key)
#define add_next_index_unset(__arg) add_next_index_null(__arg)
@@ -570,6 +550,8 @@ ZEND_API const char *zend_get_object_type(const zend_class_entry *ce);
ZEND_API zend_bool zend_is_iterable(zval *iterable);
+ZEND_API zend_bool zend_is_countable(zval *countable);
+
#define add_method(arg, key, method) add_assoc_function((arg), (key), (method))
ZEND_API ZEND_FUNCTION(display_disabled_function);
@@ -696,8 +678,8 @@ END_EXTERN_C()
#define FAST_ZPP 1
#define Z_EXPECTED_TYPES(_) \
- _(Z_EXPECTED_LONG, "integer") \
- _(Z_EXPECTED_BOOL, "boolean") \
+ _(Z_EXPECTED_LONG, "int") \
+ _(Z_EXPECTED_BOOL, "bool") \
_(Z_EXPECTED_STRING, "string") \
_(Z_EXPECTED_ARRAY, "array") \
_(Z_EXPECTED_FUNC, "valid callback") \
@@ -714,10 +696,17 @@ typedef enum _zend_expected_type {
Z_EXPECTED_LAST
} zend_expected_type;
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_error(zend_bool throw_, int num_args, int min_num_args, int max_num_args);
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(zend_bool throw_, int num, zend_expected_type expected_type, zval *arg);
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(zend_bool throw_, int num, char *name, zval *arg);
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_, int severity, int num, char *error);
+ZEND_API ZEND_COLD int ZEND_FASTCALL zend_wrong_parameters_none_error(void);
+ZEND_API ZEND_COLD int ZEND_FASTCALL zend_wrong_parameters_none_exception(void);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_error(int min_num_args, int max_num_args);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_exception(int min_num_args, int max_num_args);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(int num, zend_expected_type expected_type, zval *arg);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_exception(int num, zend_expected_type expected_type, zval *arg);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(int num, char *name, zval *arg);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_exception(int num, char *name, zval *arg);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int num, char *error);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_deprecated(int num, char *error);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, char *error);
#define ZPP_ERROR_OK 0
#define ZPP_ERROR_FAILURE 1
@@ -751,7 +740,11 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_
(UNEXPECTED(_num_args > _max_num_args) && \
EXPECTED(_max_num_args >= 0))) { \
if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
- zend_wrong_parameters_count_error(_flags & ZEND_PARSE_PARAMS_THROW, _num_args, _min_num_args, _max_num_args); \
+ if (_flags & ZEND_PARSE_PARAMS_THROW) { \
+ zend_wrong_parameters_count_exception(_min_num_args, _max_num_args); \
+ } else { \
+ zend_wrong_parameters_count_error(_min_num_args, _max_num_args); \
+ } \
} \
error_code = ZPP_ERROR_FAILURE; \
break; \
@@ -762,16 +755,35 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) \
ZEND_PARSE_PARAMETERS_START_EX(0, min_num_args, max_num_args)
+#define ZEND_PARSE_PARAMETERS_NONE() do { \
+ if (UNEXPECTED(ZEND_NUM_ARGS() != 0)) { \
+ zend_wrong_parameters_none_error(); \
+ return; \
+ } \
+ } while (0)
+
#define ZEND_PARSE_PARAMETERS_END_EX(failure) \
} while (0); \
if (UNEXPECTED(error_code != ZPP_ERROR_OK)) { \
if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
if (error_code == ZPP_ERROR_WRONG_CALLBACK) { \
- zend_wrong_callback_error(_flags & ZEND_PARSE_PARAMS_THROW, E_WARNING, _i, _error); \
+ if (_flags & ZEND_PARSE_PARAMS_THROW) { \
+ zend_wrong_callback_exception(_i, _error); \
+ } else { \
+ zend_wrong_callback_error(_i, _error); \
+ } \
} else if (error_code == ZPP_ERROR_WRONG_CLASS) { \
- zend_wrong_parameter_class_error(_flags & ZEND_PARSE_PARAMS_THROW, _i, _error, _arg); \
+ if (_flags & ZEND_PARSE_PARAMS_THROW) { \
+ zend_wrong_parameter_class_exception(_i, _error, _arg); \
+ } else { \
+ zend_wrong_parameter_class_error(_i, _error, _arg); \
+ } \
} else if (error_code == ZPP_ERROR_WRONG_ARG) { \
- zend_wrong_parameter_type_error(_flags & ZEND_PARSE_PARAMS_THROW, _i, _expected_type, _arg); \
+ if (_flags & ZEND_PARSE_PARAMS_THROW) { \
+ zend_wrong_parameter_type_exception(_i, _expected_type, _arg); \
+ } else { \
+ zend_wrong_parameter_type_error(_i, _expected_type, _arg); \
+ } \
} \
} \
failure; \
@@ -828,7 +840,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_
#define Z_PARAM_ARRAY_OR_OBJECT_EX(dest, check_null, separate) \
Z_PARAM_ARRAY_OR_OBJECT_EX2(dest, check_null, separate, separate)
-#define Z_PARAM_ARRAY_OR_OBJECT(dest, check_null, separate) \
+#define Z_PARAM_ARRAY_OR_OBJECT(dest) \
Z_PARAM_ARRAY_OR_OBJECT_EX(dest, 0, 0)
/* old "b" */
@@ -888,7 +900,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_
break; \
} \
} else if (UNEXPECTED(_error != NULL)) { \
- zend_wrong_callback_error(_flags & ZEND_PARSE_PARAMS_THROW, E_DEPRECATED, _i, _error); \
+ zend_wrong_callback_deprecated(_i, _error); \
}
#define Z_PARAM_FUNC_EX(dest_fci, dest_fcc, check_null, separate) \
@@ -1249,7 +1261,7 @@ static zend_always_inline int zend_parse_arg_array_ht(zval *arg, HashTable **des
&& Z_OBJ_P(arg)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(arg)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(arg)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(arg)->properties)--;
+ GC_DELREF(Z_OBJ_P(arg)->properties);
}
Z_OBJ_P(arg)->properties = zend_array_dup(Z_OBJ_P(arg)->properties);
}
@@ -1291,7 +1303,7 @@ static zend_always_inline int zend_parse_arg_func(zval *arg, zend_fcall_info *de
{
if (check_null && UNEXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
dest_fci->size = 0;
- dest_fcc->initialized = 0;
+ dest_fcc->function_handler = NULL;
*error = NULL;
} else if (UNEXPECTED(zend_fcall_info_init(arg, 0, dest_fci, dest_fcc, NULL, error) != SUCCESS)) {
return 0;
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 3a43027346..035e23f1db 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/*
* zend_alloc is designed to be a modern CPU cache friendly memory manager
* for PHP. Most ideas are taken from jemalloc and tcmalloc implementations.
@@ -423,11 +421,15 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size)
#ifdef _WIN32
return VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#else
+ int flags = MAP_PRIVATE | MAP_ANON;
+#if defined(MAP_EXCL)
+ flags |= MAP_FIXED | MAP_EXCL;
+#endif
/* MAP_FIXED leads to discarding of the old mapping, so it can't be used. */
- void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0);
+ void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0);
if (ptr == MAP_FAILED) {
-#if ZEND_MM_ERROR
+#if ZEND_MM_ERROR && !defined(MAP_EXCL)
fprintf(stderr, "\nmmap() failed: [%d] %s\n", errno, strerror(errno));
#endif
return NULL;
@@ -585,7 +587,7 @@ static zend_always_inline int zend_mm_bitset_find_zero_and_set(zend_mm_bitset *b
static zend_always_inline int zend_mm_bitset_is_set(zend_mm_bitset *bitset, int bit)
{
- return (bitset[bit / ZEND_MM_BITSET_LEN] & (Z_L(1) << (bit & (ZEND_MM_BITSET_LEN-1)))) != 0;
+ return ZEND_BIT_TEST(bitset, bit);
}
static zend_always_inline void zend_mm_bitset_set_bit(zend_mm_bitset *bitset, int bit)
@@ -1056,7 +1058,7 @@ found:
return ZEND_MM_PAGE_ADDR(chunk, page_num);
}
-static zend_always_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+static zend_always_inline void *zend_mm_alloc_large_ex(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
int pages_count = (int)ZEND_MM_SIZE_TO_NUM(size, ZEND_MM_PAGE_SIZE);
#if ZEND_DEBUG
@@ -1075,6 +1077,18 @@ static zend_always_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t s
return ptr;
}
+#if ZEND_DEBUG
+static zend_never_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ return zend_mm_alloc_large_ex(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+}
+#else
+static zend_never_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ return zend_mm_alloc_large_ex(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+}
+#endif
+
static zend_always_inline void zend_mm_delete_chunk(zend_mm_heap *heap, zend_mm_chunk *chunk)
{
chunk->next->prev = chunk->prev;
@@ -1124,7 +1138,7 @@ static zend_always_inline void zend_mm_free_pages_ex(zend_mm_heap *heap, zend_mm
}
}
-static void zend_mm_free_pages(zend_mm_heap *heap, zend_mm_chunk *chunk, int page_num, int pages_count)
+static zend_never_inline void zend_mm_free_pages(zend_mm_heap *heap, zend_mm_chunk *chunk, int page_num, int pages_count)
{
zend_mm_free_pages_ex(heap, chunk, page_num, pages_count, 1);
}
@@ -1342,7 +1356,7 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
return NULL;
}
#endif
- if (size <= ZEND_MM_MAX_SMALL_SIZE) {
+ if (EXPECTED(size <= ZEND_MM_MAX_SMALL_SIZE)) {
ptr = zend_mm_alloc_small(heap, size, ZEND_MM_SMALL_SIZE_TO_BIN(size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#if ZEND_DEBUG
dbg = zend_mm_get_debug_info(heap, ptr);
@@ -1353,7 +1367,7 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
dbg->orig_lineno = __zend_orig_lineno;
#endif
return ptr;
- } else if (size <= ZEND_MM_MAX_LARGE_SIZE) {
+ } else if (EXPECTED(size <= ZEND_MM_MAX_LARGE_SIZE)) {
ptr = zend_mm_alloc_large(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#if ZEND_DEBUG
dbg = zend_mm_get_debug_info(heap, ptr);
@@ -1425,97 +1439,130 @@ static size_t zend_mm_size(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_
}
}
-static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+static zend_never_inline void *zend_mm_realloc_slow(zend_mm_heap *heap, void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ void *ret;
+
+#if ZEND_MM_STAT
+ do {
+ size_t orig_peak = heap->peak;
+ size_t orig_real_peak = heap->real_peak;
+#endif
+ ret = zend_mm_alloc_heap(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ memcpy(ret, ptr, copy_size);
+ zend_mm_free_heap(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+#if ZEND_MM_STAT
+ heap->peak = MAX(orig_peak, heap->size);
+ heap->real_peak = MAX(orig_real_peak, heap->real_size);
+ } while (0);
+#endif
+ return ret;
+}
+
+static zend_never_inline void *zend_mm_realloc_huge(zend_mm_heap *heap, void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- size_t page_offset;
size_t old_size;
size_t new_size;
- void *ret;
#if ZEND_DEBUG
size_t real_size;
- zend_mm_debug_info *dbg;
#endif
- page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE);
- if (UNEXPECTED(page_offset == 0)) {
- if (UNEXPECTED(ptr == NULL)) {
- return zend_mm_alloc_heap(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
- }
- old_size = zend_mm_get_huge_block_size(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ old_size = zend_mm_get_huge_block_size(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#if ZEND_DEBUG
- real_size = size;
- size = ZEND_MM_ALIGNED_SIZE(size) + ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info));
+ real_size = size;
+ size = ZEND_MM_ALIGNED_SIZE(size) + ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info));
#endif
- if (size > ZEND_MM_MAX_LARGE_SIZE) {
+ if (size > ZEND_MM_MAX_LARGE_SIZE) {
#if ZEND_DEBUG
- size = real_size;
+ size = real_size;
#endif
#ifdef ZEND_WIN32
- /* On Windows we don't have ability to extend huge blocks in-place.
- * We allocate them with 2MB size granularity, to avoid many
- * reallocations when they are extended by small pieces
- */
- new_size = ZEND_MM_ALIGNED_SIZE_EX(size, MAX(REAL_PAGE_SIZE, ZEND_MM_CHUNK_SIZE));
+ /* On Windows we don't have ability to extend huge blocks in-place.
+ * We allocate them with 2MB size granularity, to avoid many
+ * reallocations when they are extended by small pieces
+ */
+ new_size = ZEND_MM_ALIGNED_SIZE_EX(size, MAX(REAL_PAGE_SIZE, ZEND_MM_CHUNK_SIZE));
#else
- new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
+ new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
#endif
- if (new_size == old_size) {
+ if (new_size == old_size) {
#if ZEND_DEBUG
- zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#else
- zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#endif
- return ptr;
- } else if (new_size < old_size) {
- /* unmup tail */
- if (zend_mm_chunk_truncate(heap, ptr, old_size, new_size)) {
+ return ptr;
+ } else if (new_size < old_size) {
+ /* unmup tail */
+ if (zend_mm_chunk_truncate(heap, ptr, old_size, new_size)) {
#if ZEND_MM_STAT || ZEND_MM_LIMIT
- heap->real_size -= old_size - new_size;
+ heap->real_size -= old_size - new_size;
#endif
#if ZEND_MM_STAT
- heap->size -= old_size - new_size;
+ heap->size -= old_size - new_size;
#endif
#if ZEND_DEBUG
- zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#else
- zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#endif
- return ptr;
- }
- } else /* if (new_size > old_size) */ {
+ return ptr;
+ }
+ } else /* if (new_size > old_size) */ {
#if ZEND_MM_LIMIT
- if (UNEXPECTED(new_size - old_size > heap->limit - heap->real_size)) {
- if (zend_mm_gc(heap) && new_size - old_size <= heap->limit - heap->real_size) {
- /* pass */
- } else if (heap->overflow == 0) {
+ if (UNEXPECTED(new_size - old_size > heap->limit - heap->real_size)) {
+ if (zend_mm_gc(heap) && new_size - old_size <= heap->limit - heap->real_size) {
+ /* pass */
+ } else if (heap->overflow == 0) {
#if ZEND_DEBUG
- zend_mm_safe_error(heap, "Allowed memory size of %zu bytes exhausted at %s:%d (tried to allocate %zu bytes)", heap->limit, __zend_filename, __zend_lineno, size);
+ zend_mm_safe_error(heap, "Allowed memory size of %zu bytes exhausted at %s:%d (tried to allocate %zu bytes)", heap->limit, __zend_filename, __zend_lineno, size);
#else
- zend_mm_safe_error(heap, "Allowed memory size of %zu bytes exhausted (tried to allocate %zu bytes)", heap->limit, size);
+ zend_mm_safe_error(heap, "Allowed memory size of %zu bytes exhausted (tried to allocate %zu bytes)", heap->limit, size);
#endif
- return NULL;
- }
+ return NULL;
}
+ }
#endif
- /* try to map tail right after this block */
- if (zend_mm_chunk_extend(heap, ptr, old_size, new_size)) {
+ /* try to map tail right after this block */
+ if (zend_mm_chunk_extend(heap, ptr, old_size, new_size)) {
#if ZEND_MM_STAT || ZEND_MM_LIMIT
- heap->real_size += new_size - old_size;
+ heap->real_size += new_size - old_size;
#endif
#if ZEND_MM_STAT
- heap->real_peak = MAX(heap->real_peak, heap->real_size);
- heap->size += new_size - old_size;
- heap->peak = MAX(heap->peak, heap->size);
+ heap->real_peak = MAX(heap->real_peak, heap->real_size);
+ heap->size += new_size - old_size;
+ heap->peak = MAX(heap->peak, heap->size);
#endif
#if ZEND_DEBUG
- zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#else
- zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ zend_mm_change_huge_block_size(heap, ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
#endif
- return ptr;
- }
+ return ptr;
}
}
+ }
+
+ return zend_mm_realloc_slow(heap, ptr, size, MIN(old_size, copy_size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+}
+
+static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, zend_bool use_copy_size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ size_t page_offset;
+ size_t old_size;
+ size_t new_size;
+ void *ret;
+#if ZEND_DEBUG
+ zend_mm_debug_info *dbg;
+#endif
+
+ page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE);
+ if (UNEXPECTED(page_offset == 0)) {
+ if (EXPECTED(ptr == NULL)) {
+ return _zend_mm_alloc(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ } else {
+ return zend_mm_realloc_huge(heap, ptr, size, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ }
} else {
zend_mm_chunk *chunk = (zend_mm_chunk*)ZEND_MM_ALIGNED_BASE(ptr, ZEND_MM_CHUNK_SIZE);
int page_num = (int)(page_offset / ZEND_MM_PAGE_SIZE);
@@ -1529,21 +1576,56 @@ static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, si
ZEND_MM_CHECK(chunk->heap == heap, "zend_mm_heap corrupted");
if (info & ZEND_MM_IS_SRUN) {
int old_bin_num = ZEND_MM_SRUN_BIN_NUM(info);
- old_size = bin_data_size[old_bin_num];
- if (size <= ZEND_MM_MAX_SMALL_SIZE) {
- int bin_num = ZEND_MM_SMALL_SIZE_TO_BIN(size);
- if (old_bin_num == bin_num) {
-#if ZEND_DEBUG
- dbg = zend_mm_get_debug_info(heap, ptr);
- dbg->size = real_size;
- dbg->filename = __zend_filename;
- dbg->orig_filename = __zend_orig_filename;
- dbg->lineno = __zend_lineno;
- dbg->orig_lineno = __zend_orig_lineno;
+
+ do {
+ old_size = bin_data_size[old_bin_num];
+
+ /* Check if requested size fits into current bin */
+ if (size <= old_size) {
+ /* Check if truncation is necessary */
+ if (old_bin_num > 0 && size < bin_data_size[old_bin_num - 1]) {
+ /* truncation */
+ ret = zend_mm_alloc_small(heap, size, ZEND_MM_SMALL_SIZE_TO_BIN(size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ copy_size = use_copy_size ? MIN(size, copy_size) : size;
+ memcpy(ret, ptr, copy_size);
+ zend_mm_free_small(heap, ptr, old_bin_num);
+ } else {
+ /* reallocation in-place */
+ ret = ptr;
+ }
+ } else if (size <= ZEND_MM_MAX_SMALL_SIZE) {
+ /* small extension */
+
+#if ZEND_MM_STAT
+ do {
+ size_t orig_peak = heap->peak;
+ size_t orig_real_peak = heap->real_peak;
+#endif
+ ret = zend_mm_alloc_small(heap, size, ZEND_MM_SMALL_SIZE_TO_BIN(size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ copy_size = use_copy_size ? MIN(old_size, copy_size) : old_size;
+ memcpy(ret, ptr, copy_size);
+ zend_mm_free_small(heap, ptr, old_bin_num);
+#if ZEND_MM_STAT
+ heap->peak = MAX(orig_peak, heap->size);
+ heap->real_peak = MAX(orig_real_peak, heap->real_size);
+ } while (0);
#endif
- return ptr;
+ } else {
+ /* slow reallocation */
+ break;
}
- }
+
+#if ZEND_DEBUG
+ dbg = zend_mm_get_debug_info(heap, ret);
+ dbg->size = real_size;
+ dbg->filename = __zend_filename;
+ dbg->orig_filename = __zend_orig_filename;
+ dbg->lineno = __zend_lineno;
+ dbg->orig_lineno = __zend_orig_lineno;
+#endif
+ return ret;
+ } while (0);
+
} else /* if (info & ZEND_MM_IS_LARGE_RUN) */ {
ZEND_MM_CHECK(ZEND_MM_ALIGNED_OFFSET(page_offset, ZEND_MM_PAGE_SIZE) == 0, "zend_mm_heap corrupted");
old_size = ZEND_MM_LRUN_PAGES(info) * ZEND_MM_PAGE_SIZE;
@@ -1615,21 +1697,8 @@ static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, si
#endif
}
- /* Naive reallocation */
-#if ZEND_MM_STAT
- do {
- size_t orig_peak = heap->peak;
- size_t orig_real_peak = heap->real_peak;
-#endif
- ret = zend_mm_alloc_heap(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
- memcpy(ret, ptr, MIN(old_size, copy_size));
- zend_mm_free_heap(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
-#if ZEND_MM_STAT
- heap->peak = MAX(orig_peak, heap->size);
- heap->real_peak = MAX(orig_real_peak, heap->real_size);
- } while (0);
-#endif
- return ret;
+ copy_size = MIN(old_size, copy_size);
+ return zend_mm_realloc_slow(heap, ptr, size, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
/*********************/
@@ -2279,12 +2348,12 @@ ZEND_API void ZEND_FASTCALL _zend_mm_free(zend_mm_heap *heap, void *ptr ZEND_FIL
void* ZEND_FASTCALL _zend_mm_realloc(zend_mm_heap *heap, void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- return zend_mm_realloc_heap(heap, ptr, size, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ return zend_mm_realloc_heap(heap, ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
void* ZEND_FASTCALL _zend_mm_realloc2(zend_mm_heap *heap, void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- return zend_mm_realloc_heap(heap, ptr, size, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ return zend_mm_realloc_heap(heap, ptr, size, 1, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
@@ -2355,14 +2424,12 @@ ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR, x, y)
ZEND_API void* ZEND_FASTCALL _emalloc_large(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
-
ZEND_MM_CUSTOM_ALLOCATOR(size);
- return zend_mm_alloc_large(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ return zend_mm_alloc_large_ex(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size)
{
-
ZEND_MM_CUSTOM_ALLOCATOR(size);
return zend_mm_alloc_huge(AG(mm_heap), size);
}
@@ -2397,7 +2464,6 @@ ZEND_MM_BINS_INFO(_ZEND_BIN_FREE, x, y)
ZEND_API void ZEND_FASTCALL _efree_large(void *ptr, size_t size)
{
-
ZEND_MM_CUSTOM_DEALLOCATOR(ptr);
{
size_t page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE);
@@ -2422,7 +2488,6 @@ ZEND_API void ZEND_FASTCALL _efree_huge(void *ptr, size_t size)
ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
-
#if ZEND_MM_CUSTOM
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
@@ -2437,7 +2502,6 @@ ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LI
ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
-
#if ZEND_MM_CUSTOM
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
@@ -2453,7 +2517,7 @@ ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_OR
ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
-
+#if ZEND_MM_CUSTOM
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
return AG(mm_heap)->custom_heap.debug._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -2461,12 +2525,13 @@ ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC
return AG(mm_heap)->custom_heap.std._realloc(ptr, size);
}
}
- return zend_mm_realloc_heap(AG(mm_heap), ptr, size, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+#endif
+ return zend_mm_realloc_heap(AG(mm_heap), ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
-
+#if ZEND_MM_CUSTOM
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
return AG(mm_heap)->custom_heap.debug._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -2474,14 +2539,17 @@ ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size
return AG(mm_heap)->custom_heap.std._realloc(ptr, size);
}
}
- return zend_mm_realloc_heap(AG(mm_heap), ptr, size, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+#endif
+ return zend_mm_realloc_heap(AG(mm_heap), ptr, size, 1, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
+#if ZEND_MM_CUSTOM
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
return 0;
}
+#endif
return zend_mm_size(AG(mm_heap), ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
@@ -2505,13 +2573,13 @@ ZEND_API void* ZEND_FASTCALL _safe_realloc(void *ptr, size_t nmemb, size_t size,
return perealloc(ptr, zend_safe_address_guarded(nmemb, size, offset), 1);
}
-
ZEND_API void* ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
void *p;
- p = _safe_emalloc(nmemb, size, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
- memset(p, 0, size * nmemb);
+ size = zend_safe_address_guarded(nmemb, size, 0);
+ p = emalloc_rel(size);
+ memset(p, 0, size);
return p;
}
@@ -2603,9 +2671,9 @@ ZEND_API void shutdown_memory_manager(int silent, int full_shutdown)
static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
{
char *tmp;
+
#if ZEND_MM_CUSTOM
tmp = getenv("USE_ZEND_ALLOC");
-
if (tmp && !zend_atoi(tmp, 0)) {
alloc_globals->mm_heap = malloc(sizeof(zend_mm_heap));
memset(alloc_globals->mm_heap, 0, sizeof(zend_mm_heap));
@@ -2616,6 +2684,7 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
return;
}
#endif
+
tmp = getenv("USE_ZEND_ALLOC_HUGE_PAGES");
if (tmp && zend_atoi(tmp, 0)) {
zend_mm_use_huge_pages = 1;
@@ -2678,10 +2747,14 @@ ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
#if ZEND_MM_CUSTOM
zend_mm_heap *_heap = (zend_mm_heap*)heap;
- _heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD;
- _heap->custom_heap.std._malloc = _malloc;
- _heap->custom_heap.std._free = _free;
- _heap->custom_heap.std._realloc = _realloc;
+ if (!_malloc && !_free && !_realloc) {
+ _heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_NONE;
+ } else {
+ _heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD;
+ _heap->custom_heap.std._malloc = _malloc;
+ _heap->custom_heap.std._free = _free;
+ _heap->custom_heap.std._realloc = _realloc;
+ }
#endif
}
@@ -2836,8 +2909,11 @@ ZEND_API void * __zend_malloc(size_t len)
ZEND_API void * __zend_calloc(size_t nmemb, size_t len)
{
- void *tmp = _safe_malloc(nmemb, len, 0);
- memset(tmp, 0, nmemb * len);
+ void *tmp;
+
+ len = zend_safe_address_guarded(nmemb, len, 0);
+ tmp = __zend_malloc(len);
+ memset(tmp, 0, len);
return tmp;
}
diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h
index e3ab221e1f..b3986ab961 100644
--- a/Zend/zend_alloc.h
+++ b/Zend/zend_alloc.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_ALLOC_H
#define ZEND_ALLOC_H
diff --git a/Zend/zend_alloc_sizes.h b/Zend/zend_alloc_sizes.h
index afcfcab508..09e89ed907 100644
--- a/Zend/zend_alloc_sizes.h
+++ b/Zend/zend_alloc_sizes.h
@@ -12,7 +12,7 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
diff --git a/Zend/zend_arena.h b/Zend/zend_arena.h
index 84bdc4912a..604285fc97 100644
--- a/Zend/zend_arena.h
+++ b/Zend/zend_arena.h
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id:$ */
-
#ifndef _ZEND_ARENA_H_
#define _ZEND_ARENA_H_
@@ -112,6 +110,17 @@ static zend_always_inline void zend_arena_release(zend_arena **arena_ptr, void *
arena->ptr = (char*)checkpoint;
}
+static zend_always_inline zend_bool zend_arena_contains(zend_arena *arena, void *ptr)
+{
+ while (arena) {
+ if ((char*)ptr > (char*)arena && (char*)ptr <= arena->ptr) {
+ return 1;
+ }
+ arena = arena->prev;
+ }
+ return 0;
+}
+
#endif /* _ZEND_ARENA_H_ */
/*
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 6e3447eb73..1b85d718ae 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -13,18 +13,17 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Bob Weinand <bwoebi@php.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend_ast.h"
#include "zend_API.h"
#include "zend_operators.h"
#include "zend_language_parser.h"
#include "zend_smart_str.h"
#include "zend_exceptions.h"
+#include "zend_constants.h"
ZEND_API zend_ast_process_t zend_ast_process = NULL;
@@ -46,7 +45,7 @@ static inline size_t zend_ast_list_size(uint32_t children) {
return sizeof(zend_ast_list) - sizeof(zend_ast *) + sizeof(zend_ast *) * children;
}
-ZEND_API zend_ast *zend_ast_create_znode(znode *node) {
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_znode(znode *node) {
zend_ast_znode *ast;
ast = zend_ast_alloc(sizeof(zend_ast_znode));
@@ -57,19 +56,50 @@ ZEND_API zend_ast *zend_ast_create_znode(znode *node) {
return (zend_ast *) ast;
}
-ZEND_API zend_ast *zend_ast_create_zval_with_lineno(zval *zv, zend_ast_attr attr, uint32_t lineno) {
+static zend_always_inline zend_ast * zend_ast_create_zval_int(zval *zv, uint32_t attr, uint32_t lineno) {
zend_ast_zval *ast;
ast = zend_ast_alloc(sizeof(zend_ast_zval));
ast->kind = ZEND_AST_ZVAL;
ast->attr = attr;
ZVAL_COPY_VALUE(&ast->val, zv);
- ast->val.u2.lineno = lineno;
+ Z_LINENO(ast->val) = lineno;
return (zend_ast *) ast;
}
-ZEND_API zend_ast *zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr) {
- return zend_ast_create_zval_with_lineno(zv, attr, CG(zend_lineno));
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_with_lineno(zval *zv, uint32_t lineno) {
+ return zend_ast_create_zval_int(zv, 0, lineno);
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr) {
+ return zend_ast_create_zval_int(zv, attr, CG(zend_lineno));
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval(zval *zv) {
+ return zend_ast_create_zval_int(zv, 0, CG(zend_lineno));
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_str(zend_string *str) {
+ zval zv;
+ ZVAL_STR(&zv, str);
+ return zend_ast_create_zval_int(&zv, 0, CG(zend_lineno));
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_long(zend_long lval) {
+ zval zv;
+ ZVAL_LONG(&zv, lval);
+ return zend_ast_create_zval_int(&zv, 0, CG(zend_lineno));
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant(zend_string *name, zend_ast_attr attr) {
+ zend_ast_zval *ast;
+
+ ast = zend_ast_alloc(sizeof(zend_ast_zval));
+ ast->kind = ZEND_AST_CONSTANT;
+ ast->attr = attr;
+ ZVAL_STR(&ast->val, name);
+ Z_LINENO(ast->val) = CG(zend_lineno);
+ return (zend_ast *) ast;
}
ZEND_API zend_ast *zend_ast_create_decl(
@@ -95,6 +125,183 @@ ZEND_API zend_ast *zend_ast_create_decl(
return (zend_ast *) ast;
}
+#if ZEND_AST_SPEC
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_0(zend_ast_kind kind) {
+ zend_ast *ast;
+
+ ZEND_ASSERT(kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 0);
+ ast = zend_ast_alloc(zend_ast_size(0));
+ ast->kind = kind;
+ ast->attr = 0;
+ ast->lineno = CG(zend_lineno);
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_1(zend_ast_kind kind, zend_ast *child) {
+ zend_ast *ast;
+ uint32_t lineno;
+
+ ZEND_ASSERT(kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 1);
+ ast = zend_ast_alloc(zend_ast_size(1));
+ ast->kind = kind;
+ ast->attr = 0;
+ ast->child[0] = child;
+ if (child) {
+ lineno = zend_ast_get_lineno(child);
+ } else {
+ lineno = CG(zend_lineno);
+ }
+ ast->lineno = lineno;
+ ast->lineno = lineno;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_2(zend_ast_kind kind, zend_ast *child1, zend_ast *child2) {
+ zend_ast *ast;
+ uint32_t lineno;
+
+ ZEND_ASSERT(kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 2);
+ ast = zend_ast_alloc(zend_ast_size(2));
+ ast->kind = kind;
+ ast->attr = 0;
+ ast->child[0] = child1;
+ ast->child[1] = child2;
+ if (child1) {
+ lineno = zend_ast_get_lineno(child1);
+ } else if (child2) {
+ lineno = zend_ast_get_lineno(child2);
+ } else {
+ lineno = CG(zend_lineno);
+ }
+ ast->lineno = lineno;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3(zend_ast_kind kind, zend_ast *child1, zend_ast *child2, zend_ast *child3) {
+ zend_ast *ast;
+ uint32_t lineno;
+
+ ZEND_ASSERT(kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 3);
+ ast = zend_ast_alloc(zend_ast_size(3));
+ ast->kind = kind;
+ ast->attr = 0;
+ ast->child[0] = child1;
+ ast->child[1] = child2;
+ ast->child[2] = child3;
+ if (child1) {
+ lineno = zend_ast_get_lineno(child1);
+ } else if (child2) {
+ lineno = zend_ast_get_lineno(child2);
+ } else if (child3) {
+ lineno = zend_ast_get_lineno(child3);
+ } else {
+ lineno = CG(zend_lineno);
+ }
+ ast->lineno = lineno;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4(zend_ast_kind kind, zend_ast *child1, zend_ast *child2, zend_ast *child3, zend_ast *child4) {
+ zend_ast *ast;
+ uint32_t lineno;
+
+ ZEND_ASSERT(kind >> ZEND_AST_NUM_CHILDREN_SHIFT == 4);
+ ast = zend_ast_alloc(zend_ast_size(4));
+ ast->kind = kind;
+ ast->attr = 0;
+ ast->child[0] = child1;
+ ast->child[1] = child2;
+ ast->child[2] = child3;
+ ast->child[3] = child4;
+ if (child1) {
+ lineno = zend_ast_get_lineno(child1);
+ } else if (child2) {
+ lineno = zend_ast_get_lineno(child2);
+ } else if (child3) {
+ lineno = zend_ast_get_lineno(child3);
+ } else if (child4) {
+ lineno = zend_ast_get_lineno(child4);
+ } else {
+ lineno = CG(zend_lineno);
+ }
+ ast->lineno = lineno;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_0(zend_ast_kind kind) {
+ zend_ast *ast;
+ zend_ast_list *list;
+
+ ast = zend_ast_alloc(zend_ast_list_size(4));
+ list = (zend_ast_list *) ast;
+ list->kind = kind;
+ list->attr = 0;
+ list->lineno = CG(zend_lineno);
+ list->children = 0;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_1(zend_ast_kind kind, zend_ast *child) {
+ zend_ast *ast;
+ zend_ast_list *list;
+ uint32_t lineno;
+
+ ast = zend_ast_alloc(zend_ast_list_size(4));
+ list = (zend_ast_list *) ast;
+ list->kind = kind;
+ list->attr = 0;
+ list->children = 1;
+ list->child[0] = child;
+ if (child) {
+ lineno = zend_ast_get_lineno(child);
+ if (lineno > CG(zend_lineno)) {
+ lineno = CG(zend_lineno);
+ }
+ } else {
+ lineno = CG(zend_lineno);
+ }
+ list->lineno = lineno;
+
+ return ast;
+}
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2(zend_ast_kind kind, zend_ast *child1, zend_ast *child2) {
+ zend_ast *ast;
+ zend_ast_list *list;
+ uint32_t lineno;
+
+ ast = zend_ast_alloc(zend_ast_list_size(4));
+ list = (zend_ast_list *) ast;
+ list->kind = kind;
+ list->attr = 0;
+ list->children = 2;
+ list->child[0] = child1;
+ list->child[1] = child2;
+ if (child1) {
+ lineno = zend_ast_get_lineno(child1);
+ if (lineno > CG(zend_lineno)) {
+ lineno = CG(zend_lineno);
+ }
+ } else if (child2) {
+ lineno = zend_ast_get_lineno(child2);
+ if (lineno > CG(zend_lineno)) {
+ lineno = CG(zend_lineno);
+ }
+ } else {
+ list->children = 0;
+ lineno = CG(zend_lineno);
+ }
+ list->lineno = lineno;
+
+ return ast;
+}
+#else
static zend_ast *zend_ast_create_from_va_list(zend_ast_kind kind, zend_ast_attr attr, va_list va) {
uint32_t i, children = kind >> ZEND_AST_NUM_CHILDREN_SHIFT;
zend_ast *ast;
@@ -173,12 +380,13 @@ ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind ki
return ast;
}
+#endif
static inline zend_bool is_power_of_two(uint32_t n) {
return ((n != 0) && (n == (n & (~n + 1))));
}
-ZEND_API zend_ast *zend_ast_list_add(zend_ast *ast, zend_ast *op) {
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_list_add(zend_ast *ast, zend_ast *op) {
zend_ast_list *list = zend_ast_get_list(ast);
if (list->children >= 4 && is_power_of_two(list->children)) {
list = zend_ast_realloc(list,
@@ -195,12 +403,12 @@ static int zend_ast_add_array_element(zval *result, zval *offset, zval *expr)
if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), expr)) {
zend_error(E_WARNING,
"Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr);
+ zval_ptr_dtor_nogc(expr);
}
break;
case IS_STRING:
zend_symtable_update(Z_ARRVAL_P(result), Z_STR_P(offset), expr);
- zval_dtor(offset);
+ zval_ptr_dtor_str(offset);
break;
case IS_NULL:
zend_symtable_update(Z_ARRVAL_P(result), ZSTR_EMPTY_ALLOC(), expr);
@@ -228,7 +436,7 @@ static int zend_ast_add_array_element(zval *result, zval *offset, zval *expr)
return SUCCESS;
}
-ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope)
+ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope)
{
zval op1, op2;
int ret = SUCCESS;
@@ -238,13 +446,13 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
} else if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
} else {
binary_op_type op = get_binary_op(ast->attr);
ret = op(result, &op1, &op2);
- zval_dtor(&op1);
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(&op2);
}
break;
case ZEND_AST_GREATER:
@@ -252,15 +460,15 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
} else if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
} else {
/* op1 > op2 is the same as op2 < op1 */
binary_op_type op = ast->kind == ZEND_AST_GREATER
? is_smaller_function : is_smaller_or_equal_function;
ret = op(result, &op2, &op1);
- zval_dtor(&op1);
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(&op2);
}
break;
case ZEND_AST_UNARY_OP:
@@ -269,32 +477,37 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
} else {
unary_op_type op = get_unary_op(ast->attr);
ret = op(result, &op1);
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
}
break;
case ZEND_AST_ZVAL:
{
zval *zv = zend_ast_get_zval(ast);
- if (Z_OPT_CONSTANT_P(zv)) {
- if (Z_TYPE_FLAGS_P(zv) & IS_TYPE_REFCOUNTED) {
- if (UNEXPECTED(zval_update_constant_ex(zv, scope) != SUCCESS)) {
- ret = FAILURE;
- break;
- }
- ZVAL_COPY(result, zv);
- } else {
- ZVAL_COPY_VALUE(result, zv);
- if (UNEXPECTED(zval_update_constant_ex(result, scope) != SUCCESS)) {
- ret = FAILURE;
- break;
- }
- }
- } else {
- ZVAL_COPY(result, zv);
+ ZVAL_COPY(result, zv);
+ break;
+ }
+ case ZEND_AST_CONSTANT:
+ {
+ zend_string *name = zend_ast_get_constant_name(ast);
+ zval *zv = zend_get_constant_ex(name, scope, ast->attr);
+
+ if (UNEXPECTED(zv == NULL)) {
+ ZVAL_UNDEF(result);
+ ret = zend_use_undefined_constant(name, ast->attr, result);
+ break;
}
+ ZVAL_COPY_OR_DUP(result, zv);
break;
}
+ case ZEND_AST_CONSTANT_CLASS:
+ ZEND_ASSERT(EG(current_execute_data));
+ if (scope && scope->name) {
+ ZVAL_STR_COPY(result, scope->name);
+ } else {
+ ZVAL_EMPTY_STRING(result);
+ }
+ break;
case ZEND_AST_AND:
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
@@ -302,16 +515,16 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
}
if (zend_is_true(&op1)) {
if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
break;
}
ZVAL_BOOL(result, zend_is_true(&op2));
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op2);
} else {
ZVAL_FALSE(result);
}
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
break;
case ZEND_AST_OR:
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
@@ -322,14 +535,14 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
ZVAL_TRUE(result);
} else {
if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
break;
}
ZVAL_BOOL(result, zend_is_true(&op2));
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op2);
}
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
break;
case ZEND_AST_CONDITIONAL:
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
@@ -341,19 +554,19 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
*result = op1;
} else {
if (UNEXPECTED(zend_ast_evaluate(result, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
break;
}
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
}
} else {
if (UNEXPECTED(zend_ast_evaluate(result, ast->child[2], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
break;
}
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
}
break;
case ZEND_AST_COALESCE:
@@ -365,11 +578,11 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
*result = op1;
} else {
if (UNEXPECTED(zend_ast_evaluate(result, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
break;
}
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
}
break;
case ZEND_AST_UNARY_PLUS:
@@ -378,7 +591,7 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
} else {
ZVAL_LONG(&op1, 0);
ret = add_function(result, &op1, &op2);
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op2);
}
break;
case ZEND_AST_UNARY_MINUS:
@@ -387,33 +600,38 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
} else {
ZVAL_LONG(&op1, 0);
ret = sub_function(result, &op1, &op2);
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op2);
}
break;
case ZEND_AST_ARRAY:
- array_init(result);
{
uint32_t i;
zend_ast_list *list = zend_ast_get_list(ast);
+
+ if (!list->children) {
+ ZVAL_EMPTY_ARRAY(result);
+ break;
+ }
+ array_init(result);
for (i = 0; i < list->children; i++) {
zend_ast *elem = list->child[i];
if (elem->child[1]) {
if (UNEXPECTED(zend_ast_evaluate(&op1, elem->child[1], scope) != SUCCESS)) {
- zval_dtor(result);
+ zval_ptr_dtor_nogc(result);
return FAILURE;
}
} else {
ZVAL_UNDEF(&op1);
}
if (UNEXPECTED(zend_ast_evaluate(&op2, elem->child[0], scope) != SUCCESS)) {
- zval_dtor(&op1);
- zval_dtor(result);
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(result);
return FAILURE;
}
if (UNEXPECTED(zend_ast_add_array_element(result, &op1, &op2) != SUCCESS)) {
- zval_dtor(&op1);
- zval_dtor(&op2);
- zval_dtor(result);
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(&op2);
+ zval_ptr_dtor_nogc(result);
return FAILURE;
}
}
@@ -427,21 +645,13 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
} else if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
- zval_dtor(&op1);
+ zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
} else {
- zval tmp;
-
- zend_fetch_dimension_const(&tmp, &op1, &op2, (ast->attr == ZEND_DIM_IS) ? BP_VAR_IS : BP_VAR_R);
+ zend_fetch_dimension_const(result, &op1, &op2, (ast->attr == ZEND_DIM_IS) ? BP_VAR_IS : BP_VAR_R);
- if (UNEXPECTED(Z_ISREF(tmp))) {
- ZVAL_DUP(result, Z_REFVAL(tmp));
- } else {
- ZVAL_DUP(result, &tmp);
- }
- zval_ptr_dtor(&tmp);
- zval_dtor(&op1);
- zval_dtor(&op2);
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(&op2);
}
break;
default:
@@ -451,94 +661,148 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
return ret;
}
-ZEND_API zend_ast *zend_ast_copy(zend_ast *ast)
+static size_t ZEND_FASTCALL zend_ast_tree_size(zend_ast *ast)
+{
+ size_t size;
+
+ if (ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT) {
+ size = sizeof(zend_ast_zval);
+ } else if (zend_ast_is_list(ast)) {
+ uint32_t i;
+ zend_ast_list *list = zend_ast_get_list(ast);
+
+ size = zend_ast_list_size(list->children);
+ for (i = 0; i < list->children; i++) {
+ if (list->child[i]) {
+ size += zend_ast_tree_size(list->child[i]);
+ }
+ }
+ } else {
+ uint32_t i, children = zend_ast_get_num_children(ast);
+
+ size = zend_ast_size(children);
+ for (i = 0; i < children; i++) {
+ if (ast->child[i]) {
+ size += zend_ast_tree_size(ast->child[i]);
+ }
+ }
+ }
+ return size;
+}
+
+static void* ZEND_FASTCALL zend_ast_tree_copy(zend_ast *ast, void *buf)
{
- if (ast == NULL) {
- return NULL;
- } else if (ast->kind == ZEND_AST_ZVAL) {
- zend_ast_zval *new = emalloc(sizeof(zend_ast_zval));
+ if (ast->kind == ZEND_AST_ZVAL) {
+ zend_ast_zval *new = (zend_ast_zval*)buf;
new->kind = ZEND_AST_ZVAL;
new->attr = ast->attr;
ZVAL_COPY(&new->val, zend_ast_get_zval(ast));
- return (zend_ast *) new;
+ buf = (void*)((char*)buf + sizeof(zend_ast_zval));
+ } else if (ast->kind == ZEND_AST_CONSTANT) {
+ zend_ast_zval *new = (zend_ast_zval*)buf;
+ new->kind = ZEND_AST_CONSTANT;
+ new->attr = ast->attr;
+ ZVAL_STR_COPY(&new->val, zend_ast_get_constant_name(ast));
+ buf = (void*)((char*)buf + sizeof(zend_ast_zval));
} else if (zend_ast_is_list(ast)) {
zend_ast_list *list = zend_ast_get_list(ast);
- zend_ast_list *new = emalloc(zend_ast_list_size(list->children));
+ zend_ast_list *new = (zend_ast_list*)buf;
uint32_t i;
new->kind = list->kind;
new->attr = list->attr;
new->children = list->children;
+ buf = (void*)((char*)buf + zend_ast_list_size(list->children));
for (i = 0; i < list->children; i++) {
- new->child[i] = zend_ast_copy(list->child[i]);
+ if (list->child[i]) {
+ new->child[i] = (zend_ast*)buf;
+ buf = zend_ast_tree_copy(list->child[i], buf);
+ } else {
+ new->child[i] = NULL;
+ }
}
- return (zend_ast *) new;
} else {
uint32_t i, children = zend_ast_get_num_children(ast);
- zend_ast *new = emalloc(zend_ast_size(children));
+ zend_ast *new = (zend_ast*)buf;
new->kind = ast->kind;
new->attr = ast->attr;
+ buf = (void*)((char*)buf + zend_ast_size(children));
for (i = 0; i < children; i++) {
- new->child[i] = zend_ast_copy(ast->child[i]);
+ if (ast->child[i]) {
+ new->child[i] = (zend_ast*)buf;
+ buf = zend_ast_tree_copy(ast->child[i], buf);
+ } else {
+ new->child[i] = NULL;
+ }
}
- return new;
}
+ return buf;
+}
+
+ZEND_API zend_ast_ref * ZEND_FASTCALL zend_ast_copy(zend_ast *ast)
+{
+ size_t tree_size;
+ zend_ast_ref *ref;
+
+ ZEND_ASSERT(ast != NULL);
+ tree_size = zend_ast_tree_size(ast) + sizeof(zend_ast_ref);
+ ref = emalloc(tree_size);
+ zend_ast_tree_copy(ast, GC_AST(ref));
+ GC_SET_REFCOUNT(ref, 1);
+ GC_TYPE_INFO(ref) = IS_CONSTANT_AST;
+ return ref;
}
-static void zend_ast_destroy_ex(zend_ast *ast, zend_bool free) {
+ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast)
+{
+tail_call:
if (!ast) {
return;
}
- switch (ast->kind) {
- case ZEND_AST_ZVAL:
- /* Destroy value without using GC: When opcache moves arrays into SHM it will
- * free the zend_array structure, so references to it from outside the op array
- * become invalid. GC would cause such a reference in the root buffer. */
- zval_ptr_dtor_nogc(zend_ast_get_zval(ast));
- break;
- case ZEND_AST_FUNC_DECL:
- case ZEND_AST_CLOSURE:
- case ZEND_AST_METHOD:
- case ZEND_AST_CLASS:
- {
- zend_ast_decl *decl = (zend_ast_decl *) ast;
- if (decl->name) {
- zend_string_release(decl->name);
- }
- if (decl->doc_comment) {
- zend_string_release(decl->doc_comment);
- }
- zend_ast_destroy_ex(decl->child[0], free);
- zend_ast_destroy_ex(decl->child[1], free);
- zend_ast_destroy_ex(decl->child[2], free);
- zend_ast_destroy_ex(decl->child[3], free);
- break;
+ if (EXPECTED(ast->kind >= ZEND_AST_VAR)) {
+ uint32_t i, children = zend_ast_get_num_children(ast);
+
+ for (i = 1; i < children; i++) {
+ zend_ast_destroy(ast->child[i]);
}
- default:
- if (zend_ast_is_list(ast)) {
- zend_ast_list *list = zend_ast_get_list(ast);
- uint32_t i;
- for (i = 0; i < list->children; i++) {
- zend_ast_destroy_ex(list->child[i], free);
- }
- } else {
- uint32_t i, children = zend_ast_get_num_children(ast);
- for (i = 0; i < children; i++) {
- zend_ast_destroy_ex(ast->child[i], free);
- }
+ ast = ast->child[0];
+ goto tail_call;
+ } else if (EXPECTED(ast->kind == ZEND_AST_ZVAL)) {
+ zval_ptr_dtor_nogc(zend_ast_get_zval(ast));
+ } else if (EXPECTED(zend_ast_is_list(ast))) {
+ zend_ast_list *list = zend_ast_get_list(ast);
+ if (list->children) {
+ uint32_t i;
+
+ for (i = 1; i < list->children; i++) {
+ zend_ast_destroy(list->child[i]);
}
- }
+ ast = list->child[0];
+ goto tail_call;
+ }
+ } else if (EXPECTED(ast->kind == ZEND_AST_CONSTANT)) {
+ zend_string_release_ex(zend_ast_get_constant_name(ast), 0);
+ } else if (EXPECTED(ast->kind >= ZEND_AST_FUNC_DECL)) {
+ zend_ast_decl *decl = (zend_ast_decl *) ast;
- if (free) {
- efree(ast);
+ if (decl->name) {
+ zend_string_release_ex(decl->name, 0);
+ }
+ if (decl->doc_comment) {
+ zend_string_release_ex(decl->doc_comment, 0);
+ }
+ zend_ast_destroy(decl->child[0]);
+ zend_ast_destroy(decl->child[1]);
+ zend_ast_destroy(decl->child[2]);
+ ast = decl->child[3];
+ goto tail_call;
}
}
-ZEND_API void zend_ast_destroy(zend_ast *ast) {
- zend_ast_destroy_ex(ast, 0);
-}
-ZEND_API void zend_ast_destroy_and_free(zend_ast *ast) {
- zend_ast_destroy_ex(ast, 1);
+ZEND_API void ZEND_FASTCALL zend_ast_ref_destroy(zend_ast_ref *ast)
+{
+ zend_ast_destroy(GC_AST(ast));
+ efree(ast);
}
ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
@@ -591,9 +855,9 @@ ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
* 270 non-associative clone new
*/
-static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int indent);
+static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int indent);
-static void zend_ast_export_str(smart_str *str, zend_string *s)
+static ZEND_COLD void zend_ast_export_str(smart_str *str, zend_string *s)
{
size_t i;
@@ -608,7 +872,7 @@ static void zend_ast_export_str(smart_str *str, zend_string *s)
}
}
-static void zend_ast_export_qstr(smart_str *str, char quote, zend_string *s)
+static ZEND_COLD void zend_ast_export_qstr(smart_str *str, char quote, zend_string *s)
{
size_t i;
@@ -653,7 +917,7 @@ static void zend_ast_export_qstr(smart_str *str, char quote, zend_string *s)
}
}
-static void zend_ast_export_indent(smart_str *str, int indent)
+static ZEND_COLD void zend_ast_export_indent(smart_str *str, int indent)
{
while (indent > 0) {
smart_str_appends(str, " ");
@@ -661,7 +925,7 @@ static void zend_ast_export_indent(smart_str *str, int indent)
}
}
-static void zend_ast_export_name(smart_str *str, zend_ast *ast, int priority, int indent)
+static ZEND_COLD void zend_ast_export_name(smart_str *str, zend_ast *ast, int priority, int indent)
{
if (ast->kind == ZEND_AST_ZVAL) {
zval *zv = zend_ast_get_zval(ast);
@@ -674,7 +938,7 @@ static void zend_ast_export_name(smart_str *str, zend_ast *ast, int priority, in
zend_ast_export_ex(str, ast, priority, indent);
}
-static void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int priority, int indent)
+static ZEND_COLD void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int priority, int indent)
{
if (ast->kind == ZEND_AST_ZVAL) {
zval *zv = zend_ast_get_zval(ast);
@@ -692,7 +956,7 @@ static void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int priority,
zend_ast_export_ex(str, ast, priority, indent);
}
-static int zend_ast_valid_var_char(char ch)
+static ZEND_COLD int zend_ast_valid_var_char(char ch)
{
unsigned char c = (unsigned char)ch;
@@ -705,7 +969,7 @@ static int zend_ast_valid_var_char(char ch)
return 1;
}
-static int zend_ast_valid_var_name(const char *s, size_t len)
+static ZEND_COLD int zend_ast_valid_var_name(const char *s, size_t len)
{
unsigned char c;
size_t i;
@@ -736,7 +1000,7 @@ static ZEND_COLD int zend_ast_var_needs_braces(char ch)
return ch == '[' || zend_ast_valid_var_char(ch);
}
-static void zend_ast_export_var(smart_str *str, zend_ast *ast, int priority, int indent)
+static ZEND_COLD void zend_ast_export_var(smart_str *str, zend_ast *ast, int priority, int indent)
{
if (ast->kind == ZEND_AST_ZVAL) {
zval *zv = zend_ast_get_zval(ast);
@@ -754,7 +1018,7 @@ static void zend_ast_export_var(smart_str *str, zend_ast *ast, int priority, int
smart_str_appendc(str, '}');
}
-static void zend_ast_export_list(smart_str *str, zend_ast_list *list, int separator, int priority, int indent)
+static ZEND_COLD void zend_ast_export_list(smart_str *str, zend_ast_list *list, int separator, int priority, int indent)
{
uint32_t i = 0;
@@ -767,7 +1031,7 @@ static void zend_ast_export_list(smart_str *str, zend_ast_list *list, int separa
}
}
-static void zend_ast_export_encaps_list(smart_str *str, char quote, zend_ast_list *list, int indent)
+static ZEND_COLD void zend_ast_export_encaps_list(smart_str *str, char quote, zend_ast_list *list, int indent)
{
uint32_t i = 0;
zend_ast *ast;
@@ -796,7 +1060,7 @@ static void zend_ast_export_encaps_list(smart_str *str, char quote, zend_ast_lis
}
}
-static void zend_ast_export_name_list_ex(smart_str *str, zend_ast_list *list, int indent, const char *separator)
+static ZEND_COLD void zend_ast_export_name_list_ex(smart_str *str, zend_ast_list *list, int indent, const char *separator)
{
uint32_t i = 0;
@@ -812,7 +1076,7 @@ static void zend_ast_export_name_list_ex(smart_str *str, zend_ast_list *list, in
#define zend_ast_export_name_list(s, l, i) zend_ast_export_name_list_ex(s, l, i, ", ")
#define zend_ast_export_catch_name_list(s, l, i) zend_ast_export_name_list_ex(s, l, i, "|")
-static void zend_ast_export_var_list(smart_str *str, zend_ast_list *list, int indent)
+static ZEND_COLD void zend_ast_export_var_list(smart_str *str, zend_ast_list *list, int indent)
{
uint32_t i = 0;
@@ -829,7 +1093,7 @@ static void zend_ast_export_var_list(smart_str *str, zend_ast_list *list, int in
}
}
-static void zend_ast_export_stmt(smart_str *str, zend_ast *ast, int indent)
+static ZEND_COLD void zend_ast_export_stmt(smart_str *str, zend_ast *ast, int indent)
{
if (!ast) {
return;
@@ -871,7 +1135,7 @@ static void zend_ast_export_stmt(smart_str *str, zend_ast *ast, int indent)
}
}
-static void zend_ast_export_if_stmt(smart_str *str, zend_ast_list *list, int indent)
+static ZEND_COLD void zend_ast_export_if_stmt(smart_str *str, zend_ast_list *list, int indent)
{
uint32_t i;
zend_ast *ast;
@@ -908,7 +1172,7 @@ tail_call:
smart_str_appendc(str, '}');
}
-static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int indent)
+static ZEND_COLD void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int indent)
{
zend_long idx;
zend_string *key;
@@ -932,7 +1196,7 @@ static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int ind
case IS_DOUBLE:
key = zend_strpprintf(0, "%.*G", (int) EG(precision), Z_DVAL_P(zv));
smart_str_appendl(str, ZSTR_VAL(key), ZSTR_LEN(key));
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
break;
case IS_STRING:
smart_str_appendc(str, '\'');
@@ -960,9 +1224,6 @@ static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int ind
} ZEND_HASH_FOREACH_END();
smart_str_appendc(str, ']');
break;
- case IS_CONSTANT:
- smart_str_appendl(str, Z_STRVAL_P(zv), Z_STRLEN_P(zv));
- break;
case IS_CONSTANT_AST:
zend_ast_export_ex(str, Z_ASTVAL_P(zv), priority, indent);
break;
@@ -970,7 +1231,7 @@ static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int ind
}
}
-static void zend_ast_export_class_no_header(smart_str *str, zend_ast_decl *decl, int indent) {
+static ZEND_COLD void zend_ast_export_class_no_header(smart_str *str, zend_ast_decl *decl, int indent) {
if (decl->child[0]) {
smart_str_appends(str, " extends ");
zend_ast_export_ns_name(str, decl->child[0], 0, indent);
@@ -1027,7 +1288,7 @@ static void zend_ast_export_class_no_header(smart_str *str, zend_ast_decl *decl,
goto append_default_value; \
} while (0)
-static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int indent)
+static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int indent)
{
zend_ast_decl *decl;
int p, pl, pr;
@@ -1042,6 +1303,14 @@ tail_call:
case ZEND_AST_ZVAL:
zend_ast_export_zval(str, zend_ast_get_zval(ast), priority, indent);
break;
+ case ZEND_AST_CONSTANT: {
+ zend_string *name = zend_ast_get_constant_name(ast);
+ smart_str_appendl(str, ZSTR_VAL(name), ZSTR_LEN(name));
+ break;
+ }
+ case ZEND_AST_CONSTANT_CLASS:
+ smart_str_appendl(str, "__CLASS__", sizeof("__CLASS__")-1);
+ break;
case ZEND_AST_ZNODE:
/* This AST kind is only used for temporary nodes during compilation */
ZEND_ASSERT(0);
@@ -1724,7 +1993,7 @@ append_default_value:
return;
}
-ZEND_API zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const char *suffix)
+ZEND_API ZEND_COLD zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const char *suffix)
{
smart_str str = {0};
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index 08a8ab57f4..db1f51b378 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -13,18 +13,20 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Bob Weinand <bwoebi@php.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
| Nikita Popov <nikic@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_AST_H
#define ZEND_AST_H
#include "zend.h"
+#ifndef ZEND_AST_SPEC
+# define ZEND_AST_SPEC 1
+#endif
+
#define ZEND_AST_SPECIAL_SHIFT 6
#define ZEND_AST_IS_LIST_SHIFT 7
#define ZEND_AST_NUM_CHILDREN_SHIFT 8
@@ -32,6 +34,7 @@
enum _zend_ast_kind {
/* special nodes */
ZEND_AST_ZVAL = 1 << ZEND_AST_SPECIAL_SHIFT,
+ ZEND_AST_CONSTANT,
ZEND_AST_ZNODE,
/* declaration nodes */
@@ -61,6 +64,7 @@ enum _zend_ast_kind {
/* 0 child nodes */
ZEND_AST_MAGIC_CONST = 0 << ZEND_AST_NUM_CHILDREN_SHIFT,
ZEND_AST_TYPE,
+ ZEND_AST_CONSTANT_CLASS,
/* 1 child node */
ZEND_AST_VAR = 1 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -189,26 +193,86 @@ typedef struct _zend_ast_decl {
typedef void (*zend_ast_process_t)(zend_ast *ast);
extern ZEND_API zend_ast_process_t zend_ast_process;
-ZEND_API zend_ast *zend_ast_create_zval_with_lineno(zval *zv, zend_ast_attr attr, uint32_t lineno);
-ZEND_API zend_ast *zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_with_lineno(zval *zv, uint32_t lineno);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval(zval *zv);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_str(zend_string *str);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_zval_from_long(zend_long lval);
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant(zend_string *name, zend_ast_attr attr);
+
+#if ZEND_AST_SPEC
+# define ZEND_AST_SPEC_CALL(name, ...) \
+ ZEND_EXPAND_VA(ZEND_AST_SPEC_CALL_(name, __VA_ARGS__, _4, _3, _2, _1, _0)(__VA_ARGS__))
+# define ZEND_AST_SPEC_CALL_(name, _, _4, _3, _2, _1, suffix, ...) \
+ name ## suffix
+# define ZEND_AST_SPEC_CALL_EX(name, ...) \
+ ZEND_EXPAND_VA(ZEND_AST_SPEC_CALL_EX_(name, __VA_ARGS__, _4, _3, _2, _1, _0)(__VA_ARGS__))
+# define ZEND_AST_SPEC_CALL_EX_(name, _, _5, _4, _3, _2, _1, suffix, ...) \
+ name ## suffix
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_0(zend_ast_kind kind);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_1(zend_ast_kind kind, zend_ast *child);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_2(zend_ast_kind kind, zend_ast *child1, zend_ast *child2);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_3(zend_ast_kind kind, zend_ast *child1, zend_ast *child2, zend_ast *child3);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_4(zend_ast_kind kind, zend_ast *child1, zend_ast *child2, zend_ast *child3, zend_ast *child4);
+
+static zend_always_inline zend_ast * zend_ast_create_ex_0(zend_ast_kind kind, zend_ast_attr attr) {
+ zend_ast *ast = zend_ast_create_0(kind);
+ ast->attr = attr;
+ return ast;
+}
+static zend_always_inline zend_ast * zend_ast_create_ex_1(zend_ast_kind kind, zend_ast_attr attr, zend_ast *child) {
+ zend_ast *ast = zend_ast_create_1(kind, child);
+ ast->attr = attr;
+ return ast;
+}
+static zend_always_inline zend_ast * zend_ast_create_ex_2(zend_ast_kind kind, zend_ast_attr attr, zend_ast *child1, zend_ast *child2) {
+ zend_ast *ast = zend_ast_create_2(kind, child1, child2);
+ ast->attr = attr;
+ return ast;
+}
+static zend_always_inline zend_ast * zend_ast_create_ex_3(zend_ast_kind kind, zend_ast_attr attr, zend_ast *child1, zend_ast *child2, zend_ast *child3) {
+ zend_ast *ast = zend_ast_create_3(kind, child1, child2, child3);
+ ast->attr = attr;
+ return ast;
+}
+static zend_always_inline zend_ast * zend_ast_create_ex_4(zend_ast_kind kind, zend_ast_attr attr, zend_ast *child1, zend_ast *child2, zend_ast *child3, zend_ast *child4) {
+ zend_ast *ast = zend_ast_create_4(kind, child1, child2, child3, child4);
+ ast->attr = attr;
+ return ast;
+}
-ZEND_API zend_ast *zend_ast_create_ex(zend_ast_kind kind, zend_ast_attr attr, ...);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_0(zend_ast_kind kind);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_1(zend_ast_kind kind, zend_ast *child);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_list_2(zend_ast_kind kind, zend_ast *child1, zend_ast *child2);
+
+# define zend_ast_create(...) \
+ ZEND_AST_SPEC_CALL(zend_ast_create, __VA_ARGS__)
+# define zend_ast_create_ex(...) \
+ ZEND_AST_SPEC_CALL_EX(zend_ast_create_ex, __VA_ARGS__)
+# define zend_ast_create_list(init_children, ...) \
+ ZEND_AST_SPEC_CALL(zend_ast_create_list, __VA_ARGS__)
+
+#else
ZEND_API zend_ast *zend_ast_create(zend_ast_kind kind, ...);
+ZEND_API zend_ast *zend_ast_create_ex(zend_ast_kind kind, zend_ast_attr attr, ...);
+ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...);
+#endif
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_list_add(zend_ast *list, zend_ast *op);
ZEND_API zend_ast *zend_ast_create_decl(
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment,
zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2, zend_ast *child3
);
-ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...);
-ZEND_API zend_ast *zend_ast_list_add(zend_ast *list, zend_ast *op);
-
-ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope);
+ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope);
ZEND_API zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const char *suffix);
-ZEND_API zend_ast *zend_ast_copy(zend_ast *ast);
-ZEND_API void zend_ast_destroy(zend_ast *ast);
-ZEND_API void zend_ast_destroy_and_free(zend_ast *ast);
+ZEND_API zend_ast_ref * ZEND_FASTCALL zend_ast_copy(zend_ast *ast);
+ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast);
+ZEND_API void ZEND_FASTCALL zend_ast_ref_destroy(zend_ast_ref *ast);
typedef void (*zend_ast_apply_func)(zend_ast **ast_ptr);
ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn);
@@ -231,6 +295,12 @@ static zend_always_inline zend_string *zend_ast_get_str(zend_ast *ast) {
return Z_STR_P(zv);
}
+static zend_always_inline zend_string *zend_ast_get_constant_name(zend_ast *ast) {
+ ZEND_ASSERT(ast->kind == ZEND_AST_CONSTANT);
+ ZEND_ASSERT(Z_TYPE(((zend_ast_zval *) ast)->val) == IS_STRING);
+ return Z_STR(((zend_ast_zval *) ast)->val);
+}
+
static zend_always_inline uint32_t zend_ast_get_num_children(zend_ast *ast) {
ZEND_ASSERT(!zend_ast_is_list(ast));
return ast->kind >> ZEND_AST_NUM_CHILDREN_SHIFT;
@@ -238,26 +308,12 @@ static zend_always_inline uint32_t zend_ast_get_num_children(zend_ast *ast) {
static zend_always_inline uint32_t zend_ast_get_lineno(zend_ast *ast) {
if (ast->kind == ZEND_AST_ZVAL) {
zval *zv = zend_ast_get_zval(ast);
- return zv->u2.lineno;
+ return Z_LINENO_P(zv);
} else {
return ast->lineno;
}
}
-static zend_always_inline zend_ast *zend_ast_create_zval(zval *zv) {
- return zend_ast_create_zval_ex(zv, 0);
-}
-static zend_always_inline zend_ast *zend_ast_create_zval_from_str(zend_string *str) {
- zval zv;
- ZVAL_STR(&zv, str);
- return zend_ast_create_zval(&zv);
-}
-static zend_always_inline zend_ast *zend_ast_create_zval_from_long(zend_long lval) {
- zval zv;
- ZVAL_LONG(&zv, lval);
- return zend_ast_create_zval(&zv);
-}
-
static zend_always_inline zend_ast *zend_ast_create_binary_op(uint32_t opcode, zend_ast *op0, zend_ast *op1) {
return zend_ast_create_ex(ZEND_AST_BINARY_OP, opcode, op0, op1);
}
diff --git a/Zend/zend_bitset.h b/Zend/zend_bitset.h
index 65959381d9..263cf222a5 100644
--- a/Zend/zend_bitset.h
+++ b/Zend/zend_bitset.h
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id:$ */
-
#ifndef _ZEND_BITSET_H_
#define _ZEND_BITSET_H_
@@ -86,7 +84,7 @@ static inline uint32_t zend_bitset_len(uint32_t n)
static inline zend_bool zend_bitset_in(zend_bitset set, uint32_t n)
{
- return (set[ZEND_BITSET_ELM_NUM(n)] & (Z_UL(1) << ZEND_BITSET_BIT_NUM(n))) != Z_UL(0);
+ return ZEND_BIT_TEST(set, n);
}
static inline void zend_bitset_incl(zend_bitset set, uint32_t n)
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 9c5902b1bc..f4c4a4f31d 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -12,15 +12,14 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
+#include "zend_gc.h"
#include "zend_builtin_functions.h"
#include "zend_constants.h"
#include "zend_ini.h"
@@ -85,6 +84,7 @@ static ZEND_FUNCTION(gc_collect_cycles);
static ZEND_FUNCTION(gc_enabled);
static ZEND_FUNCTION(gc_enable);
static ZEND_FUNCTION(gc_disable);
+static ZEND_FUNCTION(gc_status);
/* {{{ arginfo */
ZEND_BEGIN_ARG_INFO(arginfo_zend__void, 0)
@@ -293,6 +293,7 @@ static const zend_function_entry builtin_functions[] = { /* {{{ */
ZEND_FE(gc_enabled, arginfo_zend__void)
ZEND_FE(gc_enable, arginfo_zend__void)
ZEND_FE(gc_disable, arginfo_zend__void)
+ ZEND_FE(gc_status, arginfo_zend__void)
ZEND_FE_END
};
/* }}} */
@@ -335,6 +336,10 @@ int zend_startup_builtin_functions(void) /* {{{ */
Get the version of the Zend Engine */
ZEND_FUNCTION(zend_version)
{
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
RETURN_STRINGL(ZEND_VERSION, sizeof(ZEND_VERSION)-1);
}
/* }}} */
@@ -344,6 +349,10 @@ ZEND_FUNCTION(zend_version)
Returns number of freed bytes */
ZEND_FUNCTION(gc_mem_caches)
{
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
RETURN_LONG(zend_mm_gc(zend_mm_get_heap()));
}
/* }}} */
@@ -353,6 +362,10 @@ ZEND_FUNCTION(gc_mem_caches)
Returns number of freed zvals */
ZEND_FUNCTION(gc_collect_cycles)
{
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
RETURN_LONG(gc_collect_cycles());
}
/* }}} */
@@ -361,7 +374,11 @@ ZEND_FUNCTION(gc_collect_cycles)
Returns status of the circular reference collector */
ZEND_FUNCTION(gc_enabled)
{
- RETURN_BOOL(GC_G(gc_enabled));
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ RETURN_BOOL(gc_enabled());
}
/* }}} */
@@ -369,9 +386,15 @@ ZEND_FUNCTION(gc_enabled)
Activates the circular reference collector */
ZEND_FUNCTION(gc_enable)
{
- zend_string *key = zend_string_init("zend.enable_gc", sizeof("zend.enable_gc")-1, 0);
+ zend_string *key;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ key = zend_string_init("zend.enable_gc", sizeof("zend.enable_gc")-1, 0);
zend_alter_ini_entry_chars(key, "1", sizeof("1")-1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
}
/* }}} */
@@ -379,9 +402,36 @@ ZEND_FUNCTION(gc_enable)
Deactivates the circular reference collector */
ZEND_FUNCTION(gc_disable)
{
- zend_string *key = zend_string_init("zend.enable_gc", sizeof("zend.enable_gc")-1, 0);
+ zend_string *key;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ key = zend_string_init("zend.enable_gc", sizeof("zend.enable_gc")-1, 0);
zend_alter_ini_entry_chars(key, "0", sizeof("0")-1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
+}
+/* }}} */
+
+/* {{{ proto array gc_status(void)
+ Returns current GC statistics */
+ZEND_FUNCTION(gc_status)
+{
+ zend_gc_status status;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ zend_gc_get_status(&status);
+
+ array_init_size(return_value, 3);
+
+ add_assoc_long_ex(return_value, "runs", sizeof("runs")-1, (long)status.runs);
+ add_assoc_long_ex(return_value, "collected", sizeof("collected")-1, (long)status.collected);
+ add_assoc_long_ex(return_value, "threshold", sizeof("threshold")-1, (long)status.threshold);
+ add_assoc_long_ex(return_value, "roots", sizeof("roots")-1, (long)status.num_roots);
}
/* }}} */
@@ -391,6 +441,10 @@ ZEND_FUNCTION(func_num_args)
{
zend_execute_data *ex = EX(prev_execute_data);
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
if (ZEND_CALL_INFO(ex) & ZEND_CALL_CODE) {
zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context");
RETURN_LONG(-1);
@@ -446,8 +500,7 @@ ZEND_FUNCTION(func_get_arg)
arg = ZEND_CALL_ARG(ex, requested_offset + 1);
}
if (EXPECTED(!Z_ISUNDEF_P(arg))) {
- ZVAL_DEREF(arg);
- ZVAL_COPY(return_value, arg);
+ ZVAL_COPY_DEREF(return_value, arg);
}
}
/* }}} */
@@ -472,10 +525,10 @@ ZEND_FUNCTION(func_get_args)
arg_count = ZEND_CALL_NUM_ARGS(ex);
- array_init_size(return_value, arg_count);
if (arg_count) {
+ array_init_size(return_value, arg_count);
first_extra_arg = ex->func->op_array.num_args;
- zend_hash_real_init(Z_ARRVAL_P(return_value), 1);
+ zend_hash_real_init_packed(Z_ARRVAL_P(return_value));
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) {
i = 0;
p = ZEND_CALL_ARG(ex, 1);
@@ -512,6 +565,8 @@ ZEND_FUNCTION(func_get_args)
}
} ZEND_HASH_FILL_END();
Z_ARRVAL_P(return_value)->nNumOfElements = arg_count;
+ } else {
+ ZVAL_EMPTY_ARRAY(return_value);
}
}
/* }}} */
@@ -642,16 +697,12 @@ ZEND_FUNCTION(each)
break;
}
array_init_size(return_value, 4);
- zend_hash_real_init(Z_ARRVAL_P(return_value), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(return_value));
/* add value elements */
- if (Z_ISREF_P(entry)) {
- ZVAL_DUP(&tmp, Z_REFVAL_P(entry));
- entry = &tmp;
- if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
- } else {
- if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
- if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
+ ZVAL_DEREF(entry);
+ if (Z_REFCOUNTED_P(entry)) {
+ GC_ADDREF_EX(Z_COUNTED_P(entry), 2);
}
zend_hash_index_add_new(Z_ARRVAL_P(return_value), 1, entry);
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_VALUE), entry);
@@ -659,7 +710,7 @@ ZEND_FUNCTION(each)
/* add the key elements */
if (zend_hash_get_current_key(target_hash, &key, &num_key) == HASH_KEY_IS_STRING) {
ZVAL_STR_COPY(&tmp, key);
- if (Z_REFCOUNTED(tmp)) Z_ADDREF(tmp);
+ Z_TRY_ADDREF(tmp);
} else {
ZVAL_LONG(&tmp, num_key);
}
@@ -688,9 +739,9 @@ ZEND_FUNCTION(error_reporting)
zend_ini_entry *p = EG(error_reporting_ini_entry);
if (!p) {
- p = zend_hash_find_ptr(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING));
- if (p) {
- EG(error_reporting_ini_entry) = p;
+ zval *zv = zend_hash_find_ex(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), 1);
+ if (zv) {
+ p = EG(error_reporting_ini_entry) = (zend_ini_entry*)Z_PTR_P(zv);
} else {
break;
}
@@ -706,7 +757,7 @@ ZEND_FUNCTION(error_reporting)
p->modified = 1;
}
} else if (p->orig_value != p->value) {
- zend_string_release(p->value);
+ zend_string_release_ex(p->value, 0);
}
p->value = new_val;
@@ -727,13 +778,13 @@ static int validate_constant_array(HashTable *ht) /* {{{ */
int ret = 1;
zval *val;
- ht->u.v.nApplyCount++;
+ GC_PROTECT_RECURSION(ht);
ZEND_HASH_FOREACH_VAL_IND(ht, val) {
ZVAL_DEREF(val);
if (Z_REFCOUNTED_P(val)) {
if (Z_TYPE_P(val) == IS_ARRAY) {
if (Z_REFCOUNTED_P(val)) {
- if (Z_ARRVAL_P(val)->u.v.nApplyCount > 0) {
+ if (Z_IS_RECURSIVE_P(val)) {
zend_error(E_WARNING, "Constants cannot be recursive arrays");
ret = 0;
break;
@@ -743,13 +794,13 @@ static int validate_constant_array(HashTable *ht) /* {{{ */
}
}
} else if (Z_TYPE_P(val) != IS_STRING && Z_TYPE_P(val) != IS_RESOURCE) {
- zend_error(E_WARNING, "Constants may only evaluate to scalar values or arrays");
+ zend_error(E_WARNING, "Constants may only evaluate to scalar values, arrays or resources");
ret = 0;
break;
}
}
} ZEND_HASH_FOREACH_END();
- ht->u.v.nApplyCount--;
+ GC_UNPROTECT_RECURSION(ht);
return ret;
}
/* }}} */
@@ -773,14 +824,14 @@ static void copy_constant_array(zval *dst, zval *src) /* {{{ */
if (Z_REFCOUNTED_P(val)) {
copy_constant_array(new_val, val);
}
- } else if (Z_REFCOUNTED_P(val)) {
- Z_ADDREF_P(val);
+ } else {
+ Z_TRY_ADDREF_P(val);
}
} ZEND_HASH_FOREACH_END();
}
/* }}} */
-/* {{{ proto bool define(string constant_name, mixed value[, boolean case_insensitive])
+/* {{{ proto bool define(string constant_name, mixed value[, bool case_insensitive])
Define a new constant */
ZEND_FUNCTION(define)
{
@@ -801,7 +852,6 @@ ZEND_FUNCTION(define)
case_sensitive = 0;
}
- /* class constant, check if there is name and make sure class is valid & exists */
if (zend_memnstr(ZSTR_VAL(name), "::", sizeof("::") - 1, ZSTR_VAL(name) + ZSTR_LEN(name))) {
zend_error(E_WARNING, "Class constants cannot be defined or redefined");
RETURN_FALSE;
@@ -845,17 +895,23 @@ repeat:
}
/* no break */
default:
- zend_error(E_WARNING, "Constants may only evaluate to scalar values or arrays");
+ zend_error(E_WARNING, "Constants may only evaluate to scalar values, arrays or resources");
zval_ptr_dtor(&val_free);
RETURN_FALSE;
}
ZVAL_COPY(&c.value, val);
zval_ptr_dtor(&val_free);
+
register_constant:
- c.flags = case_sensitive; /* non persistent */
+ if (non_cs) {
+ zend_error(E_DEPRECATED,
+ "define(): Declaration of case-insensitive constants is deprecated");
+ }
+
+ /* non persistent */
+ ZEND_CONSTANT_SET_FLAGS(&c, case_sensitive, PHP_USER_CONSTANT);
c.name = zend_string_copy(name);
- c.module_number = PHP_USER_CONSTANT;
if (zend_register_constant(&c) == SUCCESS) {
RETURN_TRUE;
} else {
@@ -875,7 +931,7 @@ ZEND_FUNCTION(defined)
Z_PARAM_STR(name)
ZEND_PARSE_PARAMETERS_END();
- if (zend_get_constant_ex(name, zend_get_executed_scope(), ZEND_FETCH_CLASS_SILENT)) {
+ if (zend_get_constant_ex(name, zend_get_executed_scope(), ZEND_FETCH_CLASS_SILENT | ZEND_GET_CONSTANT_NO_DEPRECATION_CHECK)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1053,6 +1109,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, int st
prop = NULL;
if (statics && (prop_info->flags & ZEND_ACC_STATIC) != 0) {
prop = &ce->default_static_members_table[prop_info->offset];
+ ZVAL_DEINDIRECT(prop);
} else if (!statics && (prop_info->flags & ZEND_ACC_STATIC) == 0) {
prop = &ce->default_properties_table[OBJ_PROP_TO_NUM(prop_info->offset)];
}
@@ -1062,16 +1119,12 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, int st
/* copy: enforce read only access */
ZVAL_DEREF(prop);
- if (UNEXPECTED(Z_COPYABLE_P(prop))) {
- ZVAL_DUP(&prop_copy, prop);
- prop = &prop_copy;
- } else {
- Z_TRY_ADDREF_P(prop);
- }
+ ZVAL_COPY_OR_DUP(&prop_copy, prop);
+ prop = &prop_copy;
/* this is necessary to make it able to work with default array
* properties, returned to user */
- if (Z_OPT_CONSTANT_P(prop)) {
+ if (Z_OPT_TYPE_P(prop) == IS_CONSTANT_AST) {
if (UNEXPECTED(zval_update_constant_ex(prop, NULL) != SUCCESS)) {
return;
}
@@ -1137,7 +1190,7 @@ ZEND_FUNCTION(get_object_vars)
zobj = Z_OBJ_P(obj);
- if (!zobj->ce->default_properties_count && properties == zobj->properties && !ZEND_HASH_GET_APPLY_COUNT(properties)) {
+ if (!zobj->ce->default_properties_count && properties == zobj->properties && !GC_IS_RECURSIVE(properties)) {
/* fast copy */
if (EXPECTED(zobj->handlers == &std_object_handlers)) {
RETURN_ARR(zend_proptable_to_symtable(properties, 0));
@@ -1200,7 +1253,7 @@ static int same_name(zend_string *key, zend_string *name) /* {{{ */
}
lcname = zend_string_tolower(name);
ret = memcmp(ZSTR_VAL(lcname), ZSTR_VAL(key), ZSTR_LEN(key)) == 0;
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
return ret;
}
/* }}} */
@@ -1292,7 +1345,7 @@ ZEND_FUNCTION(method_exists)
lcname = zend_string_tolower(method_name);
if (zend_hash_exists(&ce->function_table, lcname)) {
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
RETURN_TRUE;
} else if (Z_TYPE_P(klass) == IS_OBJECT && Z_OBJ_HT_P(klass)->get_method != NULL) {
zend_object *obj = Z_OBJ_P(klass);
@@ -1303,16 +1356,16 @@ ZEND_FUNCTION(method_exists)
RETVAL_BOOL(func->common.scope == zend_ce_closure
&& zend_string_equals_literal(method_name, ZEND_INVOKE_FUNC_NAME));
- zend_string_release(lcname);
- zend_string_release(func->common.function_name);
+ zend_string_release_ex(lcname, 0);
+ zend_string_release_ex(func->common.function_name, 0);
zend_free_trampoline(func);
return;
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
RETURN_TRUE;
}
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
RETURN_FALSE;
}
/* }}} */
@@ -1388,7 +1441,7 @@ ZEND_FUNCTION(class_exists)
}
ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
} else {
ce = zend_lookup_class(class_name);
}
@@ -1424,7 +1477,7 @@ ZEND_FUNCTION(interface_exists)
lc_name = zend_string_tolower(iface_name);
}
ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
RETURN_BOOL(ce && ce->ce_flags & ZEND_ACC_INTERFACE);
}
@@ -1461,7 +1514,7 @@ ZEND_FUNCTION(trait_exists)
}
ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
} else {
ce = zend_lookup_class(trait_name);
}
@@ -1495,7 +1548,7 @@ ZEND_FUNCTION(function_exists)
}
func = zend_hash_find_ptr(EG(function_table), lcname);
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
/*
* A bit of a hack, but not a bad one: we see if the handler of the function
@@ -1524,7 +1577,7 @@ ZEND_FUNCTION(class_alias)
if (ce) {
if (ce->type == ZEND_USER_CLASS) {
- if (zend_register_class_alias_ex(alias_name, alias_name_len, ce) == SUCCESS) {
+ if (zend_register_class_alias_ex(alias_name, alias_name_len, ce, 0) == SUCCESS) {
RETURN_TRUE;
} else {
zend_error(E_WARNING, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), alias_name);
@@ -1605,7 +1658,7 @@ ZEND_FUNCTION(set_error_handler)
zend_string *error_handler_name = zend_get_callable_name(error_handler);
zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback",
get_active_function_name(), error_handler_name?ZSTR_VAL(error_handler_name):"unknown");
- zend_string_release(error_handler_name);
+ zend_string_release_ex(error_handler_name, 0);
return;
}
}
@@ -1672,7 +1725,7 @@ ZEND_FUNCTION(set_exception_handler)
zend_string *exception_handler_name = zend_get_callable_name(exception_handler);
zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback",
get_active_function_name(), exception_handler_name?ZSTR_VAL(exception_handler_name):"unknown");
- zend_string_release(exception_handler_name);
+ zend_string_release_ex(exception_handler_name, 0);
return;
}
}
@@ -2027,7 +2080,7 @@ static int add_constant_info(zval *item, void *arg) /* {{{ */
return 0;
}
- ZVAL_DUP(&const_val, &constant->value);
+ ZVAL_COPY_OR_DUP(&const_val, &constant->value);
zend_hash_add_new(Z_ARRVAL_P(name_array), constant->name, &const_val);
return 0;
}
@@ -2089,13 +2142,13 @@ ZEND_FUNCTION(get_defined_constants)
continue;
}
- if (val->module_number == PHP_USER_CONSTANT) {
+ if (ZEND_CONSTANT_MODULE_NUMBER(val) == PHP_USER_CONSTANT) {
module_number = i;
- } else if (val->module_number > i || val->module_number < 0) {
+ } else if (ZEND_CONSTANT_MODULE_NUMBER(val) > i) {
/* should not happen */
continue;
} else {
- module_number = val->module_number;
+ module_number = ZEND_CONSTANT_MODULE_NUMBER(val);
}
if (Z_TYPE(modules[module_number]) == IS_UNDEF) {
@@ -2103,7 +2156,7 @@ ZEND_FUNCTION(get_defined_constants)
add_assoc_zval(return_value, module_names[module_number], &modules[module_number]);
}
- ZVAL_DUP(&const_val, &val->value);
+ ZVAL_COPY_OR_DUP(&const_val, &val->value);
zend_hash_add_new(Z_ARRVAL(modules[module_number]), val->name, &const_val);
} ZEND_HASH_FOREACH_END();
@@ -2119,12 +2172,12 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
{
uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
- array_init_size(arg_array, num_args);
if (num_args) {
uint32_t i = 0;
zval *p = ZEND_CALL_ARG(call, 1);
- zend_hash_real_init(Z_ARRVAL_P(arg_array), 1);
+ array_init_size(arg_array, num_args);
+ zend_hash_real_init_packed(Z_ARRVAL_P(arg_array));
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(arg_array)) {
if (call->func->type == ZEND_USER_FUNCTION) {
uint32_t first_extra_arg = MIN(num_args, call->func->op_array.num_args);
@@ -2139,7 +2192,7 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
while (i < first_extra_arg) {
arg_name = call->func->op_array.vars[i];
- arg = zend_hash_find_ind(call->symbol_table, arg_name);
+ arg = zend_hash_find_ex_ind(call->symbol_table, arg_name, 1);
if (arg) {
if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -2181,6 +2234,8 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
}
} ZEND_HASH_FILL_END();
Z_ARRVAL_P(arg_array)->nNumOfElements = num_args;
+ } else {
+ ZVAL_EMPTY_ARRAY(arg_array);
}
}
/* }}} */
@@ -2291,7 +2346,7 @@ ZEND_FUNCTION(debug_print_backtrace)
if (object) {
if (func->common.scope) {
class_name = func->common.scope->name;
- } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
+ } else if (object->handlers->get_class_name == zend_std_get_class_name) {
class_name = object->ce->name;
} else {
class_name = object->handlers->get_class_name(object);
@@ -2356,8 +2411,8 @@ ZEND_FUNCTION(debug_print_backtrace)
ZEND_PUTS(call_type);
if (object
&& !func->common.scope
- && object->handlers->get_class_name != std_object_handlers.get_class_name) {
- zend_string_release(class_name);
+ && object->handlers->get_class_name != zend_std_get_class_name) {
+ zend_string_release_ex(class_name, 0);
}
}
zend_printf("%s(", function_name);
@@ -2523,7 +2578,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
if (object) {
if (func->common.scope) {
ZVAL_STR_COPY(&tmp, func->common.scope->name);
- } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
+ } else if (object->handlers->get_class_name == zend_std_get_class_name) {
ZVAL_STR_COPY(&tmp, object->ce->name);
} else {
ZVAL_STR(&tmp, object->handlers->get_class_name(object));
@@ -2645,7 +2700,7 @@ ZEND_FUNCTION(extension_loaded)
} else {
RETVAL_FALSE;
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
}
/* }}} */
@@ -2665,7 +2720,7 @@ ZEND_FUNCTION(get_extension_funcs)
if (strncasecmp(ZSTR_VAL(extension_name), "zend", sizeof("zend"))) {
lcname = zend_string_tolower(extension_name);
module = zend_hash_find_ptr(&module_registry, lcname);
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
} else {
module = zend_hash_str_find_ptr(&module_registry, "core", sizeof("core") - 1);
}
diff --git a/Zend/zend_builtin_functions.h b/Zend/zend_builtin_functions.h
index e065098ef6..4137f480a0 100644
--- a/Zend/zend_builtin_functions.h
+++ b/Zend/zend_builtin_functions.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_BUILTIN_FUNCTIONS_H
#define ZEND_BUILTIN_FUNCTIONS_H
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 23ea9bc2e2..ac63826262 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -13,13 +13,11 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Christian Seiler <chris_se@gmx.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
| Marcus Boerger <helly@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_closures.h"
@@ -51,12 +49,12 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */
zend_function *func = EX(func);
zval *arguments = ZEND_CALL_ARG(execute_data, 1);
- if (call_user_function_ex(CG(function_table), NULL, getThis(), return_value, ZEND_NUM_ARGS(), arguments, 1, NULL) == FAILURE) {
+ if (call_user_function(CG(function_table), NULL, getThis(), return_value, ZEND_NUM_ARGS(), arguments) == FAILURE) {
RETVAL_FALSE;
}
/* destruct the function also, then - we have allocated it in get_method */
- zend_string_release(func->internal_function.function_name);
+ zend_string_release_ex(func->internal_function.function_name, 0);
efree(func);
#if ZEND_DEBUG
execute_data->func = NULL;
@@ -114,12 +112,13 @@ ZEND_METHOD(Closure, call)
zend_closure *closure;
zend_fcall_info fci;
zend_fcall_info_cache fci_cache;
- zval *my_params;
- int my_param_count = 0;
zend_function my_function;
zend_object *newobj;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o*", &newthis, &my_params, &my_param_count) == FAILURE) {
+ fci.param_count = 0;
+ fci.params = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "o*", &newthis, &fci.params, &fci.param_count) == FAILURE) {
return;
}
@@ -132,25 +131,14 @@ ZEND_METHOD(Closure, call)
return;
}
- /* This should never happen as closures will always be callable */
- if (zend_fcall_info_init(zclosure, 0, &fci, &fci_cache, NULL, NULL) != SUCCESS) {
- ZEND_ASSERT(0);
- }
-
- fci.retval = &closure_result;
- fci.params = my_params;
- fci.param_count = my_param_count;
- fci.object = fci_cache.object = newobj;
- fci_cache.initialized = 1;
- fci_cache.called_scope = Z_OBJCE_P(newthis);
-
- if (fci_cache.function_handler->common.fn_flags & ZEND_ACC_GENERATOR) {
+ if (closure->func.common.fn_flags & ZEND_ACC_GENERATOR) {
zval new_closure;
- zend_create_closure(&new_closure, fci_cache.function_handler, Z_OBJCE_P(newthis), closure->called_scope, newthis);
+ zend_create_closure(&new_closure, &closure->func, Z_OBJCE_P(newthis), closure->called_scope, newthis);
closure = (zend_closure *) Z_OBJ(new_closure);
fci_cache.function_handler = &closure->func;
} else {
- memcpy(&my_function, fci_cache.function_handler, fci_cache.function_handler->type == ZEND_USER_FUNCTION ? sizeof(zend_op_array) : sizeof(zend_internal_function));
+ memcpy(&my_function, &closure->func, closure->func.type == ZEND_USER_FUNCTION ? sizeof(zend_op_array) : sizeof(zend_internal_function));
+ my_function.common.fn_flags &= ~ZEND_ACC_CLOSURE;
/* use scope of passed object */
my_function.common.scope = Z_OBJCE_P(newthis);
fci_cache.function_handler = &my_function;
@@ -162,6 +150,14 @@ ZEND_METHOD(Closure, call)
}
}
+ fci_cache.called_scope = newobj->ce;
+ fci_cache.object = fci.object = newobj;
+
+ fci.size = sizeof(fci);
+ ZVAL_COPY_VALUE(&fci.function_name, zclosure);
+ fci.retval = &closure_result;
+ fci.no_separation = 1;
+
if (zend_call_function(&fci, &fci_cache) == SUCCESS && Z_TYPE(closure_result) != IS_UNDEF) {
if (Z_ISREF(closure_result)) {
zend_unwrap_reference(&closure_result);
@@ -171,7 +167,7 @@ ZEND_METHOD(Closure, call)
if (fci_cache.function_handler->common.fn_flags & ZEND_ACC_GENERATOR) {
/* copied upon generator creation */
- --GC_REFCOUNT(&closure->std);
+ GC_DELREF(&closure->std);
} else if (ZEND_USER_CODE(my_function.type) && closure->func.common.scope != Z_OBJCE_P(newthis)) {
efree(my_function.op_array.run_time_cache);
}
@@ -198,15 +194,16 @@ ZEND_METHOD(Closure, bind)
} else if (Z_TYPE_P(scope_arg) == IS_NULL) {
ce = NULL;
} else {
- zend_string *class_name = zval_get_string(scope_arg);
+ zend_string *tmp_class_name;
+ zend_string *class_name = zval_get_tmp_string(scope_arg, &tmp_class_name);
if (zend_string_equals_literal(class_name, "static")) {
ce = closure->func.common.scope;
} else if ((ce = zend_lookup_class_ex(class_name, NULL, 1)) == NULL) {
zend_error(E_WARNING, "Class '%s' not found", ZSTR_VAL(class_name));
- zend_string_release(class_name);
+ zend_string_release_ex(class_name, 0);
RETURN_NULL();
}
- zend_string_release(class_name);
+ zend_tmp_string_release(tmp_class_name);
}
} else { /* scope argument not given; do not change the scope by default */
ce = closure->func.common.scope;
@@ -237,17 +234,20 @@ static ZEND_NAMED_FUNCTION(zend_closure_call_magic) /* {{{ */ {
fci.size = sizeof(zend_fcall_info);
fci.retval = return_value;
- fcc.initialized = 1;
- fcc.function_handler = (zend_function *) EX(func)->common.arg_info;
+ fcc.function_handler = (EX(func)->internal_function.fn_flags & ZEND_ACC_STATIC) ?
+ EX(func)->internal_function.scope->__callstatic : EX(func)->internal_function.scope->__call;
fci.params = params;
fci.param_count = 2;
ZVAL_STR(&fci.params[0], EX(func)->common.function_name);
- array_init(&fci.params[1]);
- zend_copy_parameters_array(ZEND_NUM_ARGS(), &fci.params[1]);
+ if (ZEND_NUM_ARGS()) {
+ array_init_size(&fci.params[1], ZEND_NUM_ARGS());
+ zend_copy_parameters_array(ZEND_NUM_ARGS(), &fci.params[1]);
+ } else {
+ ZVAL_EMPTY_ARRAY(&fci.params[1]);
+ }
fci.object = Z_OBJ(EX(This));
fcc.object = Z_OBJ(EX(This));
- fcc.calling_scope = zend_get_executed_scope();
zend_call_function(&fci, &fcc);
@@ -271,9 +271,9 @@ static int zend_create_closure_from_callable(zval *return_value, zval *callable,
memset(&call, 0, sizeof(zend_internal_function));
call.type = ZEND_INTERNAL_FUNCTION;
+ call.fn_flags = mptr->common.fn_flags & ZEND_ACC_STATIC;
call.handler = zend_closure_call_magic;
call.function_name = mptr->common.function_name;
- call.arg_info = (zend_internal_arg_info *) mptr->common.prototype;
call.scope = mptr->common.scope;
zend_free_trampoline(mptr);
@@ -385,7 +385,7 @@ static zend_function *zend_closure_get_method(zend_object **object, zend_string
return zend_get_closure_invoke_method(*object);
}
- return std_object_handlers.get_method(object, method, key);
+ return zend_std_get_method(object, method, key);
}
/* }}} */
@@ -411,7 +411,7 @@ static zval *zend_closure_get_property_ptr_ptr(zval *object, zval *member, int t
static int zend_closure_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
{
- if (has_set_exists != 2) {
+ if (has_set_exists != ZEND_PROPERTY_EXISTS) {
ZEND_CLOSURE_PROPERTY_ERROR();
}
return 0;
@@ -495,8 +495,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
*is_temp = 1;
- ALLOC_HASHTABLE(debug_info);
- zend_hash_init(debug_info, 8, NULL, ZVAL_PTR_DTOR, 0);
+ debug_info = zend_new_array(8);
if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
HashTable *static_variables = closure->func.op_array.static_variables;
@@ -540,7 +539,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
}
ZVAL_NEW_STR(&info, zend_strpprintf(0, "%s", i >= required ? "<optional>" : "<required>"));
zend_hash_update(Z_ARRVAL(val), name, &info);
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
arg_info++;
}
zend_hash_str_update(debug_info, "parameter", sizeof("parameter")-1, &val);
@@ -609,7 +608,7 @@ void zend_register_closure_ce(void) /* {{{ */
zend_ce_closure->serialize = zend_class_serialize_deny;
zend_ce_closure->unserialize = zend_class_unserialize_deny;
- memcpy(&closure_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&closure_handlers, &std_object_handlers, sizeof(zend_object_handlers));
closure_handlers.free_obj = zend_closure_free_storage;
closure_handlers.get_constructor = zend_closure_get_constructor;
closure_handlers.get_method = zend_closure_get_method;
@@ -628,7 +627,7 @@ void zend_register_closure_ce(void) /* {{{ */
static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */
{
- zend_closure *closure = (zend_closure*)EX(func)->common.prototype;
+ zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func));
closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU);
OBJ_RELEASE((zend_object*)closure);
EX(func) = NULL;
@@ -651,7 +650,6 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
if (func->type == ZEND_USER_FUNCTION) {
memcpy(&closure->func, func, sizeof(zend_op_array));
- closure->func.common.prototype = (zend_function*)closure;
closure->func.common.fn_flags |= ZEND_ACC_CLOSURE;
if (closure->func.op_array.static_variables) {
closure->func.op_array.static_variables =
@@ -681,7 +679,6 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
}
} else {
memcpy(&closure->func, func, sizeof(zend_internal_function));
- closure->func.common.prototype = (zend_function*)closure;
closure->func.common.fn_flags |= ZEND_ACC_CLOSURE;
/* wrap internal function handler to avoid memory leak */
if (UNEXPECTED(closure->func.internal_function.handler == zend_closure_internal_handler)) {
@@ -733,6 +730,16 @@ void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var) /
}
/* }}} */
+void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val) /* {{{ */
+{
+ zend_closure *closure = (zend_closure *) Z_OBJ_P(closure_zv);
+ HashTable *static_variables = closure->func.op_array.static_variables;
+ zval *var = (zval*)((char*)static_variables->arData + offset);
+ zval_ptr_dtor(var);
+ ZVAL_COPY_VALUE(var, val);
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h
index 4c7c041da8..8847ecb437 100644
--- a/Zend/zend_closures.h
+++ b/Zend/zend_closures.h
@@ -13,19 +13,22 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Christian Seiler <chris_se@gmx.net> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_CLOSURES_H
#define ZEND_CLOSURES_H
BEGIN_EXTERN_C()
+/* This macro depends on zend_closure structure layout */
+#define ZEND_CLOSURE_OBJECT(op_array) \
+ ((zend_object*)((char*)(op_array) - sizeof(zend_object)))
+
void zend_register_closure_ce(void);
void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var);
+void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val);
extern ZEND_API zend_class_entry *zend_ce_closure;
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index f25ce2f55d..0c576a86ca 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
| Nikita Popov <nikic@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <zend_language_parser.h>
#include "zend.h"
#include "zend_compile.h"
@@ -64,18 +62,20 @@ typedef struct _zend_loop_var {
} u;
} zend_loop_var;
-static inline void zend_alloc_cache_slot(uint32_t literal) {
+static inline uint32_t zend_alloc_cache_slot(void) {
zend_op_array *op_array = CG(active_op_array);
- Z_CACHE_SLOT(op_array->literals[literal]) = op_array->cache_size;
+ uint32_t ret = op_array->cache_size;
op_array->cache_size += sizeof(void*);
+ return ret;
}
#define POLYMORPHIC_CACHE_SLOT_SIZE 2
-static inline void zend_alloc_polymorphic_cache_slot(uint32_t literal) {
+static inline uint32_t zend_alloc_polymorphic_cache_slot(void) {
zend_op_array *op_array = CG(active_op_array);
- Z_CACHE_SLOT(op_array->literals[literal]) = op_array->cache_size;
+ uint32_t ret = op_array->cache_size;
op_array->cache_size += POLYMORPHIC_CACHE_SLOT_SIZE * sizeof(void*);
+ return ret;
}
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type);
@@ -89,32 +89,43 @@ ZEND_API zend_executor_globals executor_globals;
static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2);
static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast);
-static void zend_destroy_property_info_internal(zval *zv) /* {{{ */
+static void init_op(zend_op *op)
{
- zend_property_info *property_info = Z_PTR_P(zv);
+ MAKE_NOP(op);
+ op->extended_value = 0;
+ op->lineno = CG(zend_lineno);
+}
- zend_string_release(property_info->name);
- free(property_info);
+static zend_op *get_next_op(zend_op_array *op_array)
+{
+ uint32_t next_op_num = op_array->last++;
+ zend_op *next_op;
+
+ if (UNEXPECTED(next_op_num >= CG(context).opcodes_size)) {
+ CG(context).opcodes_size *= 4;
+ op_array->opcodes = erealloc(op_array->opcodes, CG(context).opcodes_size * sizeof(zend_op));
+ }
+
+ next_op = &(op_array->opcodes[next_op_num]);
+
+ init_op(next_op);
+
+ return next_op;
}
-/* }}} */
-static void zend_destroy_class_constant_internal(zval *zv) /* {{{ */
+static zend_brk_cont_element *get_next_brk_cont_element(void)
{
- free(Z_PTR_P(zv));
+ CG(context).last_brk_cont++;
+ CG(context).brk_cont_array = erealloc(CG(context).brk_cont_array, sizeof(zend_brk_cont_element) * CG(context).last_brk_cont);
+ return &CG(context).brk_cont_array[CG(context).last_brk_cont-1];
}
-/* }}} */
-static zend_string *zend_new_interned_string_safe(zend_string *str) /* {{{ */ {
- zend_string *interned_str;
+static void zend_destroy_property_info_internal(zval *zv) /* {{{ */
+{
+ zend_property_info *property_info = Z_PTR_P(zv);
- zend_string_addref(str);
- interned_str = zend_new_interned_string(str);
- if (str != interned_str) {
- return interned_str;
- } else {
- zend_string_release(str);
- return str;
- }
+ zend_string_release_ex(property_info->name, 1);
+ free(property_info);
}
/* }}} */
@@ -287,7 +298,7 @@ static void zend_end_namespace(void) /* {{{ */ {
FC(in_namespace) = 0;
zend_reset_import_tables();
if (FC(current_namespace)) {
- zend_string_release(FC(current_namespace));
+ zend_string_release_ex(FC(current_namespace), 0);
FC(current_namespace) = NULL;
}
}
@@ -382,8 +393,9 @@ ZEND_API zend_string *zend_set_compiled_filename(zend_string *new_compiled_filen
return Z_STR_P(p);
}
- ZVAL_STR_COPY(&rv, new_compiled_filename);
- zend_hash_update(&CG(filenames_table), new_compiled_filename, &rv);
+ new_compiled_filename = zend_new_interned_string(zend_string_copy(new_compiled_filename));
+ ZVAL_STR(&rv, new_compiled_filename);
+ zend_hash_add_new(&CG(filenames_table), new_compiled_filename, &rv);
CG(compiled_filename) = new_compiled_filename;
return new_compiled_filename;
@@ -420,16 +432,14 @@ static uint32_t get_temporary_variable(zend_op_array *op_array) /* {{{ */
}
/* }}} */
-static int lookup_cv(zend_op_array *op_array, zend_string* name) /* {{{ */{
+static int lookup_cv(zend_op_array *op_array, zend_string *name) /* {{{ */{
int i = 0;
zend_ulong hash_value = zend_string_hash_val(name);
while (i < op_array->last_var) {
if (ZSTR_VAL(op_array->vars[i]) == ZSTR_VAL(name) ||
(ZSTR_H(op_array->vars[i]) == hash_value &&
- ZSTR_LEN(op_array->vars[i]) == ZSTR_LEN(name) &&
- memcmp(ZSTR_VAL(op_array->vars[i]), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)) {
- zend_string_release(name);
+ zend_string_equal_content(op_array->vars[i], name))) {
return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
i++;
@@ -441,14 +451,14 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) /* {{{ */{
op_array->vars = erealloc(op_array->vars, CG(context).vars_size * sizeof(zend_string*));
}
- op_array->vars[i] = zend_new_interned_string(name);
+ op_array->vars[i] = zend_string_copy(name);
return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
/* }}} */
void zend_del_literal(zend_op_array *op_array, int n) /* {{{ */
{
- zval_dtor(CT_CONSTANT_EX(op_array, n));
+ zval_ptr_dtor_nogc(CT_CONSTANT_EX(op_array, n));
if (n + 1 == op_array->last_literal) {
op_array->last_literal--;
} else {
@@ -457,18 +467,25 @@ void zend_del_literal(zend_op_array *op_array, int n) /* {{{ */
}
/* }}} */
+static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */
+{
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
+ Z_STR_P(zv) = zend_new_interned_string(Z_STR_P(zv));
+ if (ZSTR_IS_INTERNED(Z_STR_P(zv))) {
+ Z_TYPE_FLAGS_P(zv) = 0;
+ }
+ return Z_STR_P(zv);
+}
+
/* Common part of zend_add_literal and zend_append_individual_literal */
static inline void zend_insert_literal(zend_op_array *op_array, zval *zv, int literal_position) /* {{{ */
{
- if (Z_TYPE_P(zv) == IS_STRING || Z_TYPE_P(zv) == IS_CONSTANT) {
- zend_string_hash_val(Z_STR_P(zv));
- Z_STR_P(zv) = zend_new_interned_string(Z_STR_P(zv));
- if (ZSTR_IS_INTERNED(Z_STR_P(zv))) {
- Z_TYPE_FLAGS_P(zv) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE);
- }
+ zval *lit = CT_CONSTANT_EX(op_array, literal_position);
+ if (Z_TYPE_P(zv) == IS_STRING) {
+ zval_make_interned_string(zv);
}
- ZVAL_COPY_VALUE(CT_CONSTANT_EX(op_array, literal_position), zv);
- Z_CACHE_SLOT(op_array->literals[literal_position]) = -1;
+ ZVAL_COPY_VALUE(lit, zv);
+ Z_EXTRA_P(lit) = 0;
}
/* }}} */
@@ -546,8 +563,6 @@ static int zend_add_class_name_literal(zend_op_array *op_array, zend_string *nam
zend_string *lc_name = zend_string_tolower(name);
zend_add_literal_string(op_array, &lc_name);
- zend_alloc_cache_slot(ret);
-
return ret;
}
/* }}} */
@@ -621,68 +636,6 @@ static uint32_t zend_start_live_range(zend_op_array *op_array, uint32_t start) /
}
/* }}} */
-static uint32_t zend_start_live_range_ex(zend_op_array *op_array, uint32_t start) /* {{{ */
-{
- if (op_array->last_live_range == 0 ||
- op_array->live_range[op_array->last_live_range - 1].start <= start) {
- return zend_start_live_range(op_array, start);
- } else {
- /* Live ranges have to be sorted by "start" field */
- uint32_t n = op_array->last_live_range;
-
- /* move early ranges to make a room */
- op_array->last_live_range = n + 1;
- op_array->live_range = erealloc(op_array->live_range, sizeof(zend_live_range) * op_array->last_live_range);
- do {
- op_array->live_range[n] = op_array->live_range[n-1];
- n--;
- } while (n != 0 && op_array->live_range[n-1].start > start);
-
- /* initialize new range */
- op_array->live_range[n].start = start;
-
- /* update referens to live-ranges from stack */
- if (!zend_stack_is_empty(&CG(loop_var_stack))) {
- zend_loop_var *loop_var = zend_stack_top(&CG(loop_var_stack));
- zend_loop_var *base = zend_stack_base(&CG(loop_var_stack));
- int check_opcodes = 0;
-
- for (; loop_var >= base; loop_var--) {
- if (loop_var->opcode == ZEND_RETURN) {
- /* Stack separator */
- break;
- } else if (loop_var->opcode == ZEND_FREE ||
- loop_var->opcode == ZEND_FE_FREE) {
- if (loop_var->u.live_range_offset >= n) {
- loop_var->u.live_range_offset++;
- check_opcodes = 1;
- } else {
- break;
- }
- }
- }
-
- /* update previously generated FREE/FE_FREE opcodes */
- if (check_opcodes) {
- zend_op *opline = op_array->opcodes + op_array->live_range[n+1].start;
- zend_op *end = op_array->opcodes + op_array->last;
-
- while (opline < end) {
- if ((opline->opcode == ZEND_FREE ||
- opline->opcode == ZEND_FE_FREE) &&
- (opline->extended_value & ZEND_FREE_ON_RETURN) &&
- opline->op2.num >= n) {
- opline->op2.num++;
- }
- opline++;
- }
- }
- }
- return n;
- }
-}
-/* }}} */
-
static void zend_end_live_range(zend_op_array *op_array, uint32_t offset, uint32_t end, uint32_t kind, uint32_t var) /* {{{ */
{
zend_live_range *range = op_array->live_range + offset;
@@ -696,7 +649,8 @@ static void zend_end_live_range(zend_op_array *op_array, uint32_t offset, uint32
}
/* }}} */
-static inline void zend_begin_loop(zend_uchar free_opcode, const znode *loop_var) /* {{{ */
+static inline void zend_begin_loop(
+ zend_uchar free_opcode, const znode *loop_var, zend_bool is_switch) /* {{{ */
{
zend_brk_cont_element *brk_cont_element;
int parent = CG(context).current_brk_cont;
@@ -705,6 +659,7 @@ static inline void zend_begin_loop(zend_uchar free_opcode, const znode *loop_var
CG(context).current_brk_cont = CG(context).last_brk_cont;
brk_cont_element = get_next_brk_cont_element();
brk_cont_element->parent = parent;
+ brk_cont_element->is_switch = is_switch;
if (loop_var && (loop_var->op_type & (IS_VAR|IS_TMP_VAR))) {
uint32_t start = get_next_op_number(CG(active_op_array));
@@ -770,15 +725,7 @@ void zend_do_free(znode *op1) /* {{{ */
}
if (opline->result_type == IS_VAR
&& opline->result.var == op1->u.op.var) {
- if (opline->opcode == ZEND_FETCH_R ||
- opline->opcode == ZEND_FETCH_DIM_R ||
- opline->opcode == ZEND_FETCH_OBJ_R ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_R) {
- /* It's very rare and useless case. It's better to use
- additional FREE opcode and simplify the FETCH handlers
- their selves */
- zend_emit_op(NULL, ZEND_FREE, op1, NULL);
- } else if (opline->opcode == ZEND_FETCH_THIS) {
+ if (opline->opcode == ZEND_FETCH_THIS) {
opline->opcode = ZEND_NOP;
opline->result_type = IS_UNUSED;
} else {
@@ -786,7 +733,8 @@ void zend_do_free(znode *op1) /* {{{ */
}
} else {
while (opline >= CG(active_op_array)->opcodes) {
- if (opline->opcode == ZEND_FETCH_LIST &&
+ if ((opline->opcode == ZEND_FETCH_LIST_R ||
+ opline->opcode == ZEND_FETCH_LIST_W) &&
opline->op1_type == IS_VAR &&
opline->op1.var == op1->u.op.var) {
zend_emit_op(NULL, ZEND_FREE, op1, NULL);
@@ -815,13 +763,18 @@ uint32_t zend_add_class_modifier(uint32_t flags, uint32_t new_flag) /* {{{ */
{
uint32_t new_flags = flags | new_flag;
if ((flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) && (new_flag & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error,
+ "Multiple abstract modifiers are not allowed", 0);
+ return 0;
}
if ((flags & ZEND_ACC_FINAL) && (new_flag & ZEND_ACC_FINAL)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple final modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error, "Multiple final modifiers are not allowed", 0);
+ return 0;
}
if ((new_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) && (new_flags & ZEND_ACC_FINAL)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class");
+ zend_throw_exception(zend_ce_compile_error,
+ "Cannot use the final modifier on an abstract class", 0);
+ return 0;
}
return new_flags;
}
@@ -831,19 +784,26 @@ uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag) /* {{{ */
{
uint32_t new_flags = flags | new_flag;
if ((flags & ZEND_ACC_PPP_MASK) && (new_flag & ZEND_ACC_PPP_MASK)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error,
+ "Multiple access type modifiers are not allowed", 0);
+ return 0;
}
if ((flags & ZEND_ACC_ABSTRACT) && (new_flag & ZEND_ACC_ABSTRACT)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error, "Multiple abstract modifiers are not allowed", 0);
+ return 0;
}
if ((flags & ZEND_ACC_STATIC) && (new_flag & ZEND_ACC_STATIC)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple static modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error, "Multiple static modifiers are not allowed", 0);
+ return 0;
}
if ((flags & ZEND_ACC_FINAL) && (new_flag & ZEND_ACC_FINAL)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Multiple final modifiers are not allowed");
+ zend_throw_exception(zend_ce_compile_error, "Multiple final modifiers are not allowed", 0);
+ return 0;
}
if ((new_flags & ZEND_ACC_ABSTRACT) && (new_flags & ZEND_ACC_FINAL)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member");
+ zend_throw_exception(zend_ce_compile_error,
+ "Cannot use the final modifier on an abstract class member", 0);
+ return 0;
}
return new_flags;
}
@@ -1026,7 +986,7 @@ static void label_ptr_dtor(zval *zv) /* {{{ */
/* }}} */
static void str_dtor(zval *zv) /* {{{ */ {
- zend_string_release(Z_STR_P(zv));
+ zend_string_release_ex(Z_STR_P(zv), 0);
}
/* }}} */
@@ -1061,7 +1021,7 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */
}
if (op_array->static_variables) {
if (!(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(op_array->static_variables)++;
+ GC_ADDREF(op_array->static_variables);
}
}
op_array->run_time_cache = NULL;
@@ -1076,25 +1036,28 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */
ZEND_API int do_bind_function(const zend_op_array *op_array, const zend_op *opline, HashTable *function_table, zend_bool compile_time) /* {{{ */
{
zend_function *function, *new_function;
- zval *lcname, *rtd_key;
+ zval *lcname, *rtd_key, *zv;
if (compile_time) {
lcname = CT_CONSTANT_EX(op_array, opline->op1.constant);
rtd_key = lcname + 1;
} else {
- lcname = RT_CONSTANT(op_array, opline->op1);
+ lcname = RT_CONSTANT(opline, opline->op1);
rtd_key = lcname + 1;
}
- function = zend_hash_find_ptr(function_table, Z_STR_P(rtd_key));
+ zv = zend_hash_find_ex(function_table, Z_STR_P(rtd_key), 1);
+ function = (zend_function*)Z_PTR_P(zv);
new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
memcpy(new_function, function, sizeof(zend_op_array));
if (zend_hash_add_ptr(function_table, Z_STR_P(lcname), new_function) == NULL) {
int error_level = compile_time ? E_COMPILE_ERROR : E_ERROR;
zend_function *old_function;
- if ((old_function = zend_hash_find_ptr(function_table, Z_STR_P(lcname))) != NULL
- && old_function->type == ZEND_USER_FUNCTION
+ zv = zend_hash_find_ex(function_table, Z_STR_P(lcname), 1);
+ ZEND_ASSERT(zv != NULL);
+ old_function = (zend_function*)Z_PTR_P(zv);
+ if (old_function->type == ZEND_USER_FUNCTION
&& old_function->op_array.last > 0) {
zend_error_noreturn(error_level, "Cannot redeclare %s() (previously declared in %s:%d)",
ZSTR_VAL(function->common.function_name),
@@ -1108,7 +1071,9 @@ ZEND_API int do_bind_function(const zend_op_array *op_array, const zend_op *opli
if (function->op_array.refcount) {
(*function->op_array.refcount)++;
}
- function->op_array.static_variables = NULL; /* NULL out the unbound function */
+ if (!(function->op_array.fn_flags & ZEND_ACC_IMMUTABLE)) {
+ function->op_array.static_variables = NULL; /* NULL out the unbound function */
+ }
return SUCCESS;
}
}
@@ -1117,17 +1082,18 @@ ZEND_API int do_bind_function(const zend_op_array *op_array, const zend_op *opli
ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const zend_op *opline, HashTable *class_table, zend_bool compile_time) /* {{{ */
{
zend_class_entry *ce;
- zval *lcname, *rtd_key;
+ zval *lcname, *rtd_key, *zv;
if (compile_time) {
lcname = CT_CONSTANT_EX(op_array, opline->op1.constant);
rtd_key = lcname + 1;
} else {
- lcname = RT_CONSTANT(op_array, opline->op1);
+ lcname = RT_CONSTANT(opline, opline->op1);
rtd_key = lcname + 1;
}
- ce = zend_hash_find_ptr(class_table, Z_STR_P(rtd_key));
- ZEND_ASSERT(ce);
+ zv = zend_hash_find_ex(class_table, Z_STR_P(rtd_key), 1);
+ ZEND_ASSERT(zv);
+ ce = (zend_class_entry*)Z_PTR_P(zv);
ce->refcount++;
if (zend_hash_add_ptr(class_table, Z_STR_P(lcname), ce) == NULL) {
ce->refcount--;
@@ -1152,19 +1118,19 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze
ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array, const zend_op *opline, HashTable *class_table, zend_class_entry *parent_ce, zend_bool compile_time) /* {{{ */
{
zend_class_entry *ce;
- zval *lcname, *rtd_key;
+ zval *lcname, *rtd_key, *zv;
if (compile_time) {
lcname = CT_CONSTANT_EX(op_array, opline->op1.constant);
rtd_key = lcname + 1;
} else {
- lcname = RT_CONSTANT(op_array, opline->op1);
+ lcname = RT_CONSTANT(opline, opline->op1);
rtd_key = lcname + 1;
}
- ce = zend_hash_find_ptr(class_table, Z_STR_P(rtd_key));
+ zv = zend_hash_find_ex(class_table, Z_STR_P(rtd_key), 1);
- if (!ce) {
+ if (!zv) {
if (!compile_time) {
/* If we're in compile time, in practice, it's quite possible
* that we'll never reach this class declaration at runtime,
@@ -1176,6 +1142,8 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
return NULL;
}
+ ce = (zend_class_entry*)Z_PTR_P(zv);
+
if (zend_hash_exists(class_table, Z_STR_P(lcname))) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
}
@@ -1216,21 +1184,15 @@ void zend_do_early_binding(void) /* {{{ */
break;
case ZEND_DECLARE_INHERITED_CLASS:
{
- zend_op *fetch_class_opline = opline-1;
zval *parent_name;
zend_class_entry *ce;
- parent_name = CT_CONSTANT(fetch_class_opline->op2);
+ parent_name = CT_CONSTANT(opline->op2);
if (((ce = zend_lookup_class_ex(Z_STR_P(parent_name), parent_name + 1, 0)) == NULL) ||
((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES) &&
(ce->type == ZEND_INTERNAL_CLASS))) {
if (CG(compiler_options) & ZEND_COMPILE_DELAYED_BINDING) {
- uint32_t *opline_num = &CG(active_op_array)->early_binding;
-
- while (*opline_num != (uint32_t)-1) {
- opline_num = &CG(active_op_array)->opcodes[*opline_num].result.opline_num;
- }
- *opline_num = opline - CG(active_op_array)->opcodes;
+ CG(active_op_array)->fn_flags |= ZEND_ACC_EARLY_BINDING;
opline->opcode = ZEND_DECLARE_INHERITED_CLASS_DELAYED;
opline->result_type = IS_UNUSED;
opline->result.opline_num = -1;
@@ -1240,9 +1202,8 @@ void zend_do_early_binding(void) /* {{{ */
if (do_bind_inherited_class(CG(active_op_array), opline, CG(class_table), ce, 1) == NULL) {
return;
}
- /* clear unnecessary ZEND_FETCH_CLASS opcode */
- zend_del_literal(CG(active_op_array), fetch_class_opline->op2.constant);
- MAKE_NOP(fetch_class_opline);
+ zend_del_literal(CG(active_op_array), opline->op2.constant+1);
+ zend_del_literal(CG(active_op_array), opline->op2.constant);
table = CG(class_table);
break;
@@ -1295,16 +1256,39 @@ static void zend_mark_function_as_generator() /* {{{ */
}
/* }}} */
-ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array) /* {{{ */
+ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array) /* {{{ */
+{
+ if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) {
+ uint32_t first_early_binding_opline = (uint32_t)-1;
+ uint32_t *prev_opline_num = &first_early_binding_opline;
+ zend_op *opline = op_array->opcodes;
+ zend_op *end = opline + op_array->last;
+
+ while (opline < end) {
+ if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) {
+ *prev_opline_num = opline - op_array->opcodes;
+ prev_opline_num = &opline->result.opline_num;
+ }
+ ++opline;
+ }
+ *prev_opline_num = -1;
+ return first_early_binding_opline;
+ }
+ return (uint32_t)-1;
+}
+/* }}} */
+
+ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array, uint32_t first_early_binding_opline) /* {{{ */
{
- if (op_array->early_binding != (uint32_t)-1) {
+ if (first_early_binding_opline != (uint32_t)-1) {
zend_bool orig_in_compilation = CG(in_compilation);
- uint32_t opline_num = op_array->early_binding;
+ uint32_t opline_num = first_early_binding_opline;
zend_class_entry *ce;
CG(in_compilation) = 1;
while (opline_num != (uint32_t)-1) {
- zval *parent_name = RT_CONSTANT(op_array, op_array->opcodes[opline_num-1].op2);
+ const zend_op *opline = &op_array->opcodes[opline_num];
+ zval *parent_name = RT_CONSTANT(opline, opline->op2);
if ((ce = zend_lookup_class_ex(Z_STR_P(parent_name), parent_name + 1, 0)) != NULL) {
do_bind_inherited_class(op_array, &op_array->opcodes[opline_num], EG(class_table), ce, 0);
}
@@ -1384,7 +1368,7 @@ ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char
static zend_constant *zend_lookup_reserved_const(const char *name, size_t len) /* {{{ */
{
zend_constant *c = zend_hash_find_ptr_lc(EG(zend_constants), name, len);
- if (c && !(c->flags & CONST_CS) && (c->flags & CONST_CT_SUBST)) {
+ if (c && !(ZEND_CONSTANT_FLAGS(c) & CONST_CS) && (ZEND_CONSTANT_FLAGS(c) & CONST_CT_SUBST)) {
return c;
}
return NULL;
@@ -1398,10 +1382,12 @@ static zend_bool zend_try_ct_eval_const(zval *zv, zend_string *name, zend_bool i
/* Substitute case-sensitive (or lowercase) constants */
c = zend_hash_find_ptr(EG(zend_constants), name);
if (c && (
- ((c->flags & CONST_PERSISTENT) && !(CG(compiler_options) & ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION))
+ ((ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT)
+ && !(CG(compiler_options) & ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION)
+ && (!(ZEND_CONSTANT_FLAGS(c) & CONST_NO_FILE_CACHE) || !(CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE)))
|| (Z_TYPE(c->value) < IS_OBJECT && !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION))
)) {
- ZVAL_DUP(zv, &c->value);
+ ZVAL_COPY_OR_DUP(zv, &c->value);
return 1;
}
@@ -1416,7 +1402,7 @@ static zend_bool zend_try_ct_eval_const(zval *zv, zend_string *name, zend_bool i
c = zend_lookup_reserved_const(lookup_name, lookup_len);
if (c) {
- ZVAL_DUP(zv, &c->value);
+ ZVAL_COPY_OR_DUP(zv, &c->value);
return 1;
}
}
@@ -1576,7 +1562,7 @@ static zend_bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name,
/* Substitute case-sensitive (or lowercase) persistent class constants */
if (Z_TYPE_P(c) < IS_OBJECT) {
- ZVAL_DUP(zv, c);
+ ZVAL_COPY_OR_DUP(zv, c);
return 1;
}
@@ -1615,8 +1601,6 @@ void zend_do_extended_info(void) /* {{{ */
opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_EXT_STMT;
- SET_UNUSED(opline->op1);
- SET_UNUSED(opline->op2);
}
/* }}} */
@@ -1631,8 +1615,6 @@ void zend_do_extended_fcall_begin(void) /* {{{ */
opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_EXT_FCALL_BEGIN;
- SET_UNUSED(opline->op1);
- SET_UNUSED(opline->op2);
}
/* }}} */
@@ -1647,8 +1629,6 @@ void zend_do_extended_fcall_end(void) /* {{{ */
opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_EXT_FCALL_END;
- SET_UNUSED(opline->op1);
- SET_UNUSED(opline->op2);
}
/* }}} */
@@ -1684,13 +1664,12 @@ int zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global
zend_auto_global auto_global;
int retval;
- auto_global.name = zend_new_interned_string(name);
+ auto_global.name = name;
auto_global.auto_global_callback = auto_global_callback;
auto_global.jit = jit;
retval = zend_hash_add_mem(CG(auto_globals), auto_global.name, &auto_global, sizeof(zend_auto_global)) != NULL ? SUCCESS : FAILURE;
- zend_string_release(name);
return retval;
}
/* }}} */
@@ -1711,44 +1690,16 @@ ZEND_API void zend_activate_auto_globals(void) /* {{{ */
}
/* }}} */
-int zendlex(zend_parser_stack_elem *elem) /* {{{ */
+int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem) /* {{{ */
{
zval zv;
- int retval;
- uint32_t start_lineno;
if (CG(increment_lineno)) {
CG(zend_lineno)++;
CG(increment_lineno) = 0;
}
-again:
- ZVAL_UNDEF(&zv);
- start_lineno = CG(zend_lineno);
- retval = lex_scan(&zv);
- if (EG(exception)) {
- return T_ERROR;
- }
-
- switch (retval) {
- case T_COMMENT:
- case T_DOC_COMMENT:
- case T_OPEN_TAG:
- case T_WHITESPACE:
- goto again;
-
- case T_CLOSE_TAG:
- retval = ';'; /* implicit ; */
- break;
- case T_OPEN_TAG_WITH_ECHO:
- retval = T_ECHO;
- break;
- }
- if (Z_TYPE(zv) != IS_UNDEF) {
- elem->ast = zend_ast_create_zval_with_lineno(&zv, 0, start_lineno);
- }
-
- return retval;
+ return lex_scan(&zv, elem);
}
/* }}} */
@@ -1766,7 +1717,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
ce->default_properties_table = NULL;
ce->default_static_members_table = NULL;
zend_hash_init_ex(&ce->properties_info, 8, NULL, (persistent_hashes ? zend_destroy_property_info_internal : NULL), persistent_hashes, 0);
- zend_hash_init_ex(&ce->constants_table, 8, NULL, (persistent_hashes ? zend_destroy_class_constant_internal : NULL), persistent_hashes, 0);
+ zend_hash_init_ex(&ce->constants_table, 8, NULL, NULL, persistent_hashes, 0);
zend_hash_init_ex(&ce->function_table, 8, NULL, ZEND_FUNCTION_DTOR, persistent_hashes, 0);
if (ce->type == ZEND_INTERNAL_CLASS) {
@@ -1804,8 +1755,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
ce->__tostring = NULL;
ce->create_object = NULL;
ce->get_iterator = NULL;
- ce->iterator_funcs.funcs = NULL;
- ce->interface_gets_implemented = NULL;
+ ce->iterator_funcs_ptr = NULL;
ce->get_static_method = NULL;
ce->parent = NULL;
ce->num_interfaces = 0;
@@ -1847,7 +1797,7 @@ zend_ast *zend_ast_append_str(zend_ast *left_ast, zend_ast *right_ast) /* {{{ */
ZSTR_VAL(result)[left_len] = '\\';
memcpy(&ZSTR_VAL(result)[left_len + 1], ZSTR_VAL(right), ZSTR_LEN(right));
ZSTR_VAL(result)[len] = '\0';
- zend_string_release(right);
+ zend_string_release_ex(right, 0);
ZVAL_STR(left_zv, result);
return left_ast;
@@ -1951,16 +1901,14 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
}
/* }}} */
-static void zend_adjust_for_fetch_type(zend_op *opline, uint32_t type) /* {{{ */
+static void zend_adjust_for_fetch_type(zend_op *opline, znode *result, uint32_t type) /* {{{ */
{
zend_uchar factor = (opline->opcode == ZEND_FETCH_STATIC_PROP_R) ? 1 : 3;
- if (opline->opcode == ZEND_FETCH_THIS) {
- return;
- }
-
- switch (type & BP_VAR_MASK) {
+ switch (type) {
case BP_VAR_R:
+ opline->result_type = IS_TMP_VAR;
+ result->op_type = IS_TMP_VAR;
return;
case BP_VAR_W:
opline->opcode += 1 * factor;
@@ -1969,11 +1917,12 @@ static void zend_adjust_for_fetch_type(zend_op *opline, uint32_t type) /* {{{ */
opline->opcode += 2 * factor;
return;
case BP_VAR_IS:
+ opline->result_type = IS_TMP_VAR;
+ result->op_type = IS_TMP_VAR;
opline->opcode += 3 * factor;
return;
case BP_VAR_FUNC_ARG:
opline->opcode += 4 * factor;
- opline->extended_value |= type >> BP_VAR_SHIFT;
return;
case BP_VAR_UNSET:
opline->opcode += 5 * factor;
@@ -2029,14 +1978,41 @@ static void zend_find_live_range(zend_op *opline, zend_uchar type, uint32_t var)
} else if (def->opcode == ZEND_NEW) {
/* Objects created via ZEND_NEW are only fully initialized
* after the DO_FCALL (constructor call) */
- def = CG(active_op_array)->opcodes + def->op2.opline_num - 1;
+ int level = 0;
+ while (def + 1 != opline) {
+ def++;
+ if (def->opcode == ZEND_DO_FCALL) {
+ if (level == 0) {
+ break;
+ }
+ level--;
+ } else {
+ switch(def->opcode) {
+ case ZEND_INIT_FCALL:
+ case ZEND_INIT_FCALL_BY_NAME:
+ case ZEND_INIT_NS_FCALL_BY_NAME:
+ case ZEND_INIT_DYNAMIC_CALL:
+ case ZEND_INIT_USER_CALL:
+ case ZEND_INIT_METHOD_CALL:
+ case ZEND_INIT_STATIC_METHOD_CALL:
+ case ZEND_NEW:
+ level++;
+ break;
+ case ZEND_DO_ICALL:
+ case ZEND_DO_UCALL:
+ case ZEND_DO_FCALL_BY_NAME:
+ level--;
+ break;
+ }
+ }
+ }
if (def + 1 == opline) {
break;
}
}
zend_end_live_range(CG(active_op_array),
- zend_start_live_range_ex(CG(active_op_array),
+ zend_start_live_range(CG(active_op_array),
def + 1 - CG(active_op_array)->opcodes),
opline - CG(active_op_array)->opcodes,
ZEND_LIVE_TMPVAR, var);
@@ -2098,7 +2074,8 @@ static void zend_check_live_ranges(zend_op *opline) /* {{{ */
opline->opcode == ZEND_ROPE_ADD ||
opline->opcode == ZEND_ROPE_END ||
opline->opcode == ZEND_END_SILENCE ||
- opline->opcode == ZEND_FETCH_LIST ||
+ opline->opcode == ZEND_FETCH_LIST_R ||
+ opline->opcode == ZEND_FETCH_LIST_W ||
opline->opcode == ZEND_VERIFY_RETURN_TYPE ||
opline->opcode == ZEND_BIND_LEXICAL) {
/* these opcodes are handled separately */
@@ -2136,15 +2113,11 @@ static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode
zend_op *opline = get_next_op(CG(active_op_array));
opline->opcode = opcode;
- if (op1 == NULL) {
- SET_UNUSED(opline->op1);
- } else {
+ if (op1 != NULL) {
SET_NODE(opline->op1, op1);
}
- if (op2 == NULL) {
- SET_UNUSED(opline->op2);
- } else {
+ if (op2 != NULL) {
SET_NODE(opline->op2, op2);
}
@@ -2162,15 +2135,11 @@ static zend_op *zend_emit_op_tmp(znode *result, zend_uchar opcode, znode *op1, z
zend_op *opline = get_next_op(CG(active_op_array));
opline->opcode = opcode;
- if (op1 == NULL) {
- SET_UNUSED(opline->op1);
- } else {
+ if (op1 != NULL) {
SET_NODE(opline->op1, op1);
}
- if (op2 == NULL) {
- SET_UNUSED(opline->op2);
- } else {
+ if (op2 != NULL) {
SET_NODE(opline->op2, op2);
}
@@ -2196,8 +2165,6 @@ static void zend_emit_tick(void) /* {{{ */
opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_TICKS;
- SET_UNUSED(opline->op1);
- SET_UNUSED(opline->op2);
opline->extended_value = FC(declarables).ticks;
}
/* }}} */
@@ -2289,16 +2256,14 @@ static inline void zend_update_jump_target_to_next(uint32_t opnum_jump) /* {{{ *
static inline zend_op *zend_delayed_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */
{
zend_op tmp_opline;
+
init_op(&tmp_opline);
+
tmp_opline.opcode = opcode;
- if (op1 == NULL) {
- SET_UNUSED(tmp_opline.op1);
- } else {
+ if (op1 != NULL) {
SET_NODE(tmp_opline.op1, op1);
}
- if (op2 == NULL) {
- SET_UNUSED(tmp_opline.op2);
- } else {
+ if (op2 != NULL) {
SET_NODE(tmp_opline.op2, op2);
}
if (result) {
@@ -2472,6 +2437,25 @@ static inline void zend_handle_numeric_op(znode *node) /* {{{ */
}
/* }}} */
+static inline void zend_handle_numeric_dim(zend_op *opline, znode *dim_node) /* {{{ */
+{
+ if (Z_TYPE(dim_node->u.constant) == IS_STRING) {
+ zend_ulong index;
+
+ if (ZEND_HANDLE_NUMERIC(Z_STR(dim_node->u.constant), index)) {
+ /* For numeric indexs we also keep the original value to use by ArrayAccess
+ * See bug #63217
+ */
+ int c = zend_add_literal(CG(active_op_array), &dim_node->u.constant);
+ ZEND_ASSERT(opline->op2.constant + 1 == c);
+ ZVAL_LONG(CT_CONSTANT(opline->op2), index);
+ Z_EXTRA_P(CT_CONSTANT(opline->op2)) = ZEND_EXTRA_VALUE;
+ return;
+ }
+ }
+}
+/* }}} */
+
static inline void zend_set_class_name_op1(zend_op *opline, znode *class_node) /* {{{ */
{
if (class_node->op_type == IS_CONST) {
@@ -2484,45 +2468,6 @@ static inline void zend_set_class_name_op1(zend_op *opline, znode *class_node) /
}
/* }}} */
-static zend_op *zend_compile_class_ref(znode *result, zend_ast *name_ast, int throw_exception) /* {{{ */
-{
- zend_op *opline;
- znode name_node;
- zend_compile_expr(&name_node, name_ast);
-
- if (name_node.op_type == IS_CONST) {
- zend_string *name;
- uint32_t fetch_type;
-
- if (Z_TYPE(name_node.u.constant) != IS_STRING) {
- zend_error_noreturn(E_COMPILE_ERROR, "Illegal class name");
- }
-
- name = Z_STR(name_node.u.constant);
- fetch_type = zend_get_class_fetch_type(name);
-
- opline = zend_emit_op(result, ZEND_FETCH_CLASS, NULL, NULL);
- opline->extended_value = fetch_type | (throw_exception ? ZEND_FETCH_CLASS_EXCEPTION : 0);
-
- if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
- uint32_t type = name_ast->kind == ZEND_AST_ZVAL ? name_ast->attr : ZEND_NAME_FQ;
- opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_class_name_literal(CG(active_op_array),
- zend_resolve_class_name(name, type));
- } else {
- zend_ensure_valid_class_fetch_type(fetch_type);
- }
-
- zend_string_release(name);
- } else {
- opline = zend_emit_op(result, ZEND_FETCH_CLASS, NULL, &name_node);
- opline->extended_value = ZEND_FETCH_CLASS_DEFAULT | (throw_exception ? ZEND_FETCH_CLASS_EXCEPTION : 0);
- }
-
- return opline;
-}
-/* }}} */
-
static void zend_compile_class_ref_ex(znode *result, zend_ast *name_ast, uint32_t fetch_flags) /* {{{ */
{
uint32_t fetch_type;
@@ -2551,10 +2496,10 @@ static void zend_compile_class_ref_ex(znode *result, zend_ast *name_ast, uint32_
result->u.op.num = fetch_type | fetch_flags;
}
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
} else {
zend_op *opline = zend_emit_op(result, ZEND_FETCH_CLASS, NULL, &name_node);
- opline->extended_value = ZEND_FETCH_CLASS_DEFAULT | fetch_flags;
+ opline->op1.num = ZEND_FETCH_CLASS_DEFAULT | fetch_flags;
}
return;
}
@@ -2582,18 +2527,25 @@ static int zend_try_compile_cv(znode *result, zend_ast *ast) /* {{{ */
{
zend_ast *name_ast = ast->child[0];
if (name_ast->kind == ZEND_AST_ZVAL) {
- zend_string *name = zval_get_string(zend_ast_get_zval(name_ast));
+ zval *zv = zend_ast_get_zval(name_ast);
+ zend_string *name;
+
+ if (EXPECTED(Z_TYPE_P(zv) == IS_STRING)) {
+ name = zval_make_interned_string(zv);
+ } else {
+ name = zend_new_interned_string(zval_get_string_func(zv));
+ }
if (zend_is_auto_global(name)) {
- zend_string_release(name);
return FAILURE;
}
result->op_type = IS_CV;
result->u.op.var = lookup_cv(CG(active_op_array), name);
- /* lookup_cv may be using another zend_string instance */
- name = CG(active_op_array)->vars[EX_VAR_TO_NUM(result->u.op.var)];
+ if (UNEXPECTED(Z_TYPE_P(zv) != IS_STRING)) {
+ zend_string_release_ex(name, 0);
+ }
return SUCCESS;
}
@@ -2627,6 +2579,7 @@ static zend_op *zend_compile_simple_var_no_cv(znode *result, zend_ast *ast, uint
opline->extended_value = ZEND_FETCH_LOCAL;
}
+ zend_adjust_for_fetch_type(opline, result, type);
return opline;
}
/* }}} */
@@ -2644,14 +2597,14 @@ 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) /* {{{ */
{
- zend_op *opline;
-
if (is_this_fetch(ast)) {
- opline = zend_emit_op(result, ZEND_FETCH_THIS, NULL, NULL);
- zend_adjust_for_fetch_type(opline, type);
+ zend_op *opline = zend_emit_op(result, ZEND_FETCH_THIS, NULL, NULL);
+ if ((type == BP_VAR_R) || (type == BP_VAR_IS)) {
+ opline->result_type = IS_TMP_VAR;
+ result->op_type = IS_TMP_VAR;
+ }
} else if (zend_try_compile_cv(result, ast) == FAILURE) {
- zend_op *opline = zend_compile_simple_var_no_cv(result, ast, type, delayed);
- zend_adjust_for_fetch_type(opline, type);
+ zend_compile_simple_var_no_cv(result, ast, type, delayed);
}
}
/* }}} */
@@ -2672,18 +2625,13 @@ 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);
void zend_compile_assign(znode *result, zend_ast *ast);
-static void zend_compile_list_assign(znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style);
static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */
{
znode dummy_node;
- if (var_ast->kind == ZEND_AST_ARRAY) {
- zend_compile_list_assign(&dummy_node, var_ast, value_node, var_ast->attr);
- } else {
- zend_ast *assign_ast = zend_ast_create(ZEND_AST_ASSIGN, var_ast,
- zend_ast_create_znode(value_node));
- zend_compile_assign(&dummy_node, assign_ast);
- }
+ zend_ast *assign_ast = zend_ast_create(ZEND_AST_ASSIGN, var_ast,
+ zend_ast_create_znode(value_node));
+ zend_compile_assign(&dummy_node, assign_ast);
zend_do_free(&dummy_node);
}
/* }}} */
@@ -2692,6 +2640,7 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
{
zend_ast *var_ast = ast->child[0];
zend_ast *dim_ast = ast->child[1];
+ zend_op *opline;
znode var_node, dim_node;
@@ -2708,14 +2657,19 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
dim_node.op_type = IS_UNUSED;
} else {
zend_compile_expr(&dim_node, dim_ast);
- zend_handle_numeric_op(&dim_node);
}
- return zend_delayed_emit_op(result, ZEND_FETCH_DIM_R, &var_node, &dim_node);
+ opline = zend_delayed_emit_op(result, ZEND_FETCH_DIM_R, &var_node, &dim_node);
+ zend_adjust_for_fetch_type(opline, result, type);
+
+ if (dim_node.op_type == IS_CONST) {
+ zend_handle_numeric_dim(opline, &dim_node);
+ }
+ return opline;
}
/* }}} */
-static inline zend_op *zend_compile_dim_common(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
+static zend_op *zend_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
uint32_t offset = zend_delayed_compile_begin();
zend_delayed_compile_dim(result, ast, type);
@@ -2723,13 +2677,6 @@ static inline zend_op *zend_compile_dim_common(znode *result, zend_ast *ast, uin
}
/* }}} */
-void zend_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
-{
- zend_op *opline = zend_compile_dim_common(result, ast, type);
- zend_adjust_for_fetch_type(opline, type);
-}
-/* }}} */
-
static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
zend_ast *obj_ast = ast->child[0];
@@ -2749,14 +2696,15 @@ 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));
- zend_alloc_polymorphic_cache_slot(opline->op2.constant);
+ opline->extended_value = zend_alloc_polymorphic_cache_slot();
}
+ zend_adjust_for_fetch_type(opline, result, type);
return opline;
}
/* }}} */
-static zend_op *zend_compile_prop_common(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
+static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
uint32_t offset = zend_delayed_compile_begin();
zend_delayed_compile_prop(result, ast, type);
@@ -2764,14 +2712,7 @@ static zend_op *zend_compile_prop_common(znode *result, zend_ast *ast, uint32_t
}
/* }}} */
-void zend_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
-{
- zend_op *opline = zend_compile_prop_common(result, ast, type);
- zend_adjust_for_fetch_type(opline, type);
-}
-/* }}} */
-
-zend_op *zend_compile_static_prop_common(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 delayed) /* {{{ */
{
zend_ast *class_ast = ast->child[0];
zend_ast *prop_ast = ast->child[1];
@@ -2790,27 +2731,24 @@ zend_op *zend_compile_static_prop_common(znode *result, zend_ast *ast, uint32_t
}
if (opline->op1_type == IS_CONST) {
convert_to_string(CT_CONSTANT(opline->op1));
- zend_alloc_polymorphic_cache_slot(opline->op1.constant);
+ opline->extended_value = zend_alloc_polymorphic_cache_slot();
}
if (class_node.op_type == IS_CONST) {
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_class_name_literal(
CG(active_op_array), Z_STR(class_node.u.constant));
+ if (opline->op1_type != IS_CONST) {
+ opline->extended_value = zend_alloc_cache_slot();
+ }
} else {
SET_NODE(opline->op2, &class_node);
}
+ zend_adjust_for_fetch_type(opline, result, type);
return opline;
}
/* }}} */
-void zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */
-{
- zend_op *opline = zend_compile_static_prop_common(result, ast, type, delayed);
- zend_adjust_for_fetch_type(opline, type);
-}
-/* }}} */
-
static void zend_verify_list_assign_target(zend_ast *var_ast, zend_bool old_style) /* {{{ */ {
if (var_ast->kind == ZEND_AST_ARRAY) {
if (var_ast->attr == ZEND_ARRAY_SYNTAX_LONG) {
@@ -2825,6 +2763,30 @@ static void zend_verify_list_assign_target(zend_ast *var_ast, zend_bool old_styl
}
/* }}} */
+static inline void zend_emit_assign_ref_znode(zend_ast *var_ast, znode *value_node);
+
+/* Propagate refs used on leaf elements to the surrounding list() structures. */
+static zend_bool zend_propagate_list_refs(zend_ast *ast) { /* {{{ */
+ zend_ast_list *list = zend_ast_get_list(ast);
+ zend_bool has_refs = 0;
+ uint32_t i;
+
+ for (i = 0; i < list->children; ++i) {
+ zend_ast *elem_ast = list->child[i];
+
+ if (elem_ast) {
+ zend_ast *var_ast = elem_ast->child[0];
+ if (var_ast->kind == ZEND_AST_ARRAY) {
+ elem_ast->attr = zend_propagate_list_refs(var_ast);
+ }
+ has_refs |= elem_ast->attr;
+ }
+ }
+
+ return has_refs;
+}
+/* }}} */
+
static void zend_compile_list_assign(
znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style) /* {{{ */
{
@@ -2834,10 +2796,15 @@ static void zend_compile_list_assign(
zend_bool is_keyed =
list->children > 0 && list->child[0] != NULL && list->child[0]->child[1] != NULL;
+ if (list->children && expr_node->op_type == IS_CONST && Z_TYPE(expr_node->u.constant) == IS_STRING) {
+ zval_make_interned_string(&expr_node->u.constant);
+ }
+
for (i = 0; i < list->children; ++i) {
zend_ast *elem_ast = list->child[i];
zend_ast *var_ast, *key_ast;
znode fetch_result, dim_node;
+ zend_op *opline;
if (elem_ast == NULL) {
if (is_keyed) {
@@ -2848,10 +2815,6 @@ static void zend_compile_list_assign(
}
}
- if (elem_ast->attr) {
- zend_error(E_COMPILE_ERROR, "[] and list() assignments cannot be by reference");
- }
-
var_ast = elem_ast->child[0];
key_ast = elem_ast->child[1];
has_elems = 1;
@@ -2879,15 +2842,34 @@ static void zend_compile_list_assign(
zend_verify_list_assign_target(var_ast, old_style);
- zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);
- zend_emit_assign_znode(var_ast, &fetch_result);
+ opline = zend_emit_op(&fetch_result,
+ elem_ast->attr ? (expr_node->op_type == IS_CV ? ZEND_FETCH_DIM_W : ZEND_FETCH_LIST_W) : ZEND_FETCH_LIST_R, expr_node, &dim_node);
+
+ if (dim_node.op_type == IS_CONST) {
+ zend_handle_numeric_dim(opline, &dim_node);
+ }
+
+ if (var_ast->kind == ZEND_AST_ARRAY) {
+ if (elem_ast->attr) {
+ zend_emit_op(&fetch_result, ZEND_MAKE_REF, &fetch_result, NULL);
+ }
+ zend_compile_list_assign(NULL, var_ast, &fetch_result, var_ast->attr);
+ } else if (elem_ast->attr) {
+ zend_emit_assign_ref_znode(var_ast, &fetch_result);
+ } else {
+ zend_emit_assign_znode(var_ast, &fetch_result);
+ }
}
if (has_elems == 0) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
}
- *result = *expr_node;
+ if (result) {
+ *result = *expr_node;
+ } else {
+ zend_do_free(expr_node);
+ }
}
/* }}} */
@@ -2921,8 +2903,8 @@ zend_bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{ *
zend_string *name1 = zval_get_string(zend_ast_get_zval(var_ast->child[0]));
zend_string *name2 = zval_get_string(zend_ast_get_zval(expr_ast->child[0]));
zend_bool result = zend_string_equals(name1, name2);
- zend_string_release(name1);
- zend_string_release(name2);
+ zend_string_release_ex(name1, 0);
+ zend_string_release_ex(name2, 0);
return result;
}
}
@@ -2950,7 +2932,7 @@ zend_bool zend_list_has_assign_to(zend_ast *list_ast, zend_string *name) /* {{{
if (var_ast->kind == ZEND_AST_VAR && var_ast->child[0]->kind == ZEND_AST_ZVAL) {
zend_string *var_name = zval_get_string(zend_ast_get_zval(var_ast->child[0]));
zend_bool result = zend_string_equals(var_name, name);
- zend_string_release(var_name);
+ zend_string_release_ex(var_name, 0);
if (result) {
return 1;
}
@@ -2968,7 +2950,7 @@ zend_bool zend_list_has_assign_to_self(zend_ast *list_ast, zend_ast *expr_ast) /
if (expr_ast->kind == ZEND_AST_VAR && expr_ast->child[0]->kind == ZEND_AST_ZVAL) {
zend_string *name = zval_get_string(zend_ast_get_zval(expr_ast->child[0]));
zend_bool result = zend_list_has_assign_to(list_ast, name);
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
return result;
}
return 0;
@@ -3006,7 +2988,13 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
if (zend_is_assign_to_self(var_ast, expr_ast)
&& !is_this_fetch(expr_ast)) {
/* $a[0] = $a should evaluate the right $a first */
- zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
+ znode cv_node;
+
+ if (zend_try_compile_cv(&cv_node, expr_ast) == FAILURE) {
+ zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
+ } else {
+ zend_emit_op(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
+ }
} else {
zend_compile_expr(&expr_node, expr_ast);
}
@@ -3027,11 +3015,32 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
zend_emit_op_data(&expr_node);
return;
case ZEND_AST_ARRAY:
- if (zend_list_has_assign_to_self(var_ast, expr_ast)) {
- /* list($a, $b) = $a should evaluate the right $a first */
- zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
+ if (zend_propagate_list_refs(var_ast)) {
+ if (!zend_is_variable(expr_ast)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Cannot assign reference to non referencable value");
+ }
+
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
+ /* 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
+ || zend_list_has_assign_to_self(var_ast, expr_ast)) {
+ zend_emit_op(&expr_node, ZEND_MAKE_REF, &expr_node, NULL);
+ }
} else {
- zend_compile_expr(&expr_node, expr_ast);
+ if (zend_list_has_assign_to_self(var_ast, expr_ast)) {
+ /* list($a, $b) = $a should evaluate the right $a first */
+ znode cv_node;
+
+ if (zend_try_compile_cv(&cv_node, expr_ast) == FAILURE) {
+ zend_compile_simple_var_no_cv(&expr_node, expr_ast, BP_VAR_R, 0);
+ } else {
+ zend_emit_op(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
+ }
+ } else {
+ zend_compile_expr(&expr_node, expr_ast);
+ }
}
zend_compile_list_assign(result, var_ast, &expr_node, var_ast->attr);
@@ -3101,7 +3110,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
znode var_node, expr_node;
zend_op *opline;
- uint32_t offset;
+ uint32_t offset, cache_slot;
zend_ensure_writable_variable(var_ast);
@@ -3131,10 +3140,12 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
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_OBJ;
- zend_emit_op_data(&expr_node);
+ opline = zend_emit_op_data(&expr_node);
+ opline->extended_value = cache_slot;
return;
EMPTY_SWITCH_DEFAULT_CASE()
}
@@ -3198,12 +3209,26 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
opcode = ZEND_SEND_REF;
} else {
zend_compile_var(&arg_node, arg, BP_VAR_R);
- opcode = ZEND_SEND_VAR;
+ opcode = (arg_node.op_type == IS_TMP_VAR) ? ZEND_SEND_VAL : ZEND_SEND_VAR;
}
} else {
- zend_compile_var(&arg_node, arg,
- BP_VAR_FUNC_ARG | (arg_num << BP_VAR_SHIFT));
- opcode = ZEND_SEND_VAR_EX;
+ do {
+ if (arg->kind == ZEND_AST_VAR) {
+ CG(zend_lineno) = zend_ast_get_lineno(ast);
+ if (is_this_fetch(arg)) {
+ zend_emit_op(&arg_node, ZEND_FETCH_THIS, NULL, NULL);
+ opcode = ZEND_SEND_VAR_EX;
+ break;
+ } else if (zend_try_compile_cv(&arg_node, arg) == SUCCESS) {
+ opcode = ZEND_SEND_VAR_EX;
+ break;
+ }
+ }
+ 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);
+ opcode = ZEND_SEND_FUNC_ARG;
+ } while (0);
}
} else {
zend_compile_expr(&arg_node, arg);
@@ -3320,11 +3345,10 @@ void zend_compile_ns_call(znode *result, znode *name_node, zend_ast *args_ast) /
{
zend_op *opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_INIT_NS_FCALL_BY_NAME;
- SET_UNUSED(opline->op1);
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_ns_func_name_literal(
CG(active_op_array), Z_STR(name_node->u.constant));
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
zend_compile_call_common(result, args_ast, NULL);
}
@@ -3345,16 +3369,16 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a
opline->op1.constant = zend_add_class_name_literal(CG(active_op_array), class);
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_func_name_literal(CG(active_op_array), method);
- zend_alloc_cache_slot(opline->op2.constant);
+ /* 2 slots, for class and method */
+ opline->result.num = zend_alloc_polymorphic_cache_slot();
zval_ptr_dtor(&name_node->u.constant);
} else {
zend_op *opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_INIT_FCALL_BY_NAME;
- SET_UNUSED(opline->op1);
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_func_name_literal(CG(active_op_array), str);
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
}
} else {
zend_emit_op(NULL, ZEND_INIT_DYNAMIC_CALL, NULL, name_node);
@@ -3390,7 +3414,7 @@ int zend_compile_func_strlen(znode *result, zend_ast_list *args) /* {{{ */
if (arg_node.op_type == IS_CONST && Z_TYPE(arg_node.u.constant) == IS_STRING) {
result->op_type = IS_CONST;
ZVAL_LONG(&result->u.constant, Z_STRLEN(arg_node.u.constant));
- zval_dtor(&arg_node.u.constant);
+ zval_ptr_dtor_str(&arg_node.u.constant);
} else {
zend_emit_op_tmp(result, ZEND_STRLEN, &arg_node, NULL);
}
@@ -3409,7 +3433,11 @@ int zend_compile_func_typecheck(znode *result, zend_ast_list *args, uint32_t typ
zend_compile_expr(&arg_node, args->child[0]);
opline = zend_emit_op_tmp(result, ZEND_TYPE_CHECK, &arg_node, NULL);
- opline->extended_value = type;
+ if (type != _IS_BOOL) {
+ opline->extended_value = (1 << type);
+ } else {
+ opline->extended_value = (1 << IS_FALSE) | (1 << IS_TRUE);
+ }
return SUCCESS;
}
/* }}} */
@@ -3441,12 +3469,12 @@ int zend_compile_func_defined(znode *result, zend_ast_list *args) /* {{{ */
name = zval_get_string(zend_ast_get_zval(args->child[0]));
if (zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name)) || zend_memrchr(ZSTR_VAL(name), ':', ZSTR_LEN(name))) {
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
return FAILURE;
}
if (zend_try_ct_eval_const(&result->u.constant, name, 0)) {
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
zval_ptr_dtor(&result->u.constant);
ZVAL_TRUE(&result->u.constant);
result->op_type = IS_CONST;
@@ -3456,7 +3484,7 @@ int zend_compile_func_defined(znode *result, zend_ast_list *args) /* {{{ */
opline = zend_emit_op_tmp(result, ZEND_DEFINED, NULL, NULL);
opline->op1_type = IS_CONST;
LITERAL_STR(opline->op1, name);
- zend_alloc_cache_slot(opline->op1.constant);
+ opline->extended_value = zend_alloc_cache_slot();
/* Lowercase constant name in a separate literal */
{
@@ -3521,7 +3549,7 @@ static int zend_try_compile_ct_bound_init_user_func(zend_ast *name_ast, uint32_t
|| (fbc->type == ZEND_INTERNAL_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS))
|| (fbc->type == ZEND_USER_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_USER_FUNCTIONS))
) {
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
return FAILURE;
}
@@ -3530,7 +3558,7 @@ static int zend_try_compile_ct_bound_init_user_func(zend_ast *name_ast, uint32_t
opline->op1.num = zend_vm_calc_used_stack(num_args, fbc);
opline->op2_type = IS_CONST;
LITERAL_STR(opline->op2, lcname);
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
return SUCCESS;
}
@@ -3589,11 +3617,11 @@ int zend_compile_func_cufa(znode *result, zend_ast_list *args, zend_string *lcna
opline = zend_emit_op(NULL, ZEND_SEND_ARRAY, &arg_node, &len_node);
opline->extended_value = Z_LVAL_P(zv);
zend_emit_op(result, ZEND_DO_FCALL, NULL, NULL);
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
return SUCCESS;
}
}
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
}
zend_compile_expr(&arg_node, args->child[1]);
zend_emit_op(NULL, ZEND_SEND_ARRAY, &arg_node, NULL);
@@ -3650,7 +3678,7 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
opline->op2.constant = zend_add_ns_func_name_literal(
CG(active_op_array), name);
}
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
if (args->children == 1 &&
(args->child[0]->kind != ZEND_AST_ZVAL ||
@@ -3668,7 +3696,7 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
SET_NODE(opline->result, result);
} else {
if (!fbc) {
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
}
result->op_type = IS_CONST;
ZVAL_TRUE(&result->u.constant);
@@ -3693,11 +3721,11 @@ static int zend_compile_func_in_array(znode *result, zend_ast_list *args) /* {{{
zend_ast_get_str(name_ast), name_ast->attr, &is_fully_qualified);
if (!zend_try_ct_eval_const(&value, resolved_name, is_fully_qualified)) {
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return FAILURE;
}
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
strict = zend_is_true(&value);
zval_ptr_dtor(&value);
} else {
@@ -3716,9 +3744,8 @@ static int zend_compile_func_in_array(znode *result, zend_ast_list *args) /* {{{
zend_bool ok = 1;
zval *val, tmp;
HashTable *src = Z_ARRVAL(array.u.constant);
- HashTable *dst = emalloc(sizeof(HashTable));
+ HashTable *dst = zend_new_array(zend_hash_num_elements(src));
- zend_hash_init(dst, zend_hash_num_elements(src), NULL, ZVAL_PTR_DTOR, 0);
ZVAL_TRUE(&tmp);
if (strict) {
@@ -3865,10 +3892,10 @@ int zend_compile_func_array_slice(znode *result, zend_ast_list *args) /* {{{ */
first.op_type = IS_CONST;
ZVAL_LONG(&first.u.constant, Z_LVAL_P(zv));
zend_emit_op_tmp(result, ZEND_FUNC_GET_ARGS, &first, NULL);
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
return SUCCESS;
}
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
}
return FAILURE;
}
@@ -3996,7 +4023,7 @@ void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
|| (fbc->type == ZEND_INTERNAL_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS))
|| (fbc->type == ZEND_USER_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_USER_FUNCTIONS))
) {
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
zend_compile_dynamic_call(result, &name_node, args_ast);
return;
}
@@ -4004,7 +4031,7 @@ void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
if (zend_try_compile_special_func(result, lcname,
zend_ast_get_list(args_ast), fbc, type) == SUCCESS
) {
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
zval_ptr_dtor(&name_node.u.constant);
return;
}
@@ -4013,7 +4040,7 @@ void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
ZVAL_NEW_STR(&name_node.u.constant, lcname);
opline = zend_emit_op(NULL, ZEND_INIT_FCALL, NULL, &name_node);
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
zend_compile_call_common(result, args_ast, fbc);
}
@@ -4047,7 +4074,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(CG(active_op_array),
Z_STR(method_node.u.constant));
- zend_alloc_polymorphic_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_polymorphic_cache_slot();
} else {
SET_NODE(opline->op2, &method_node);
}
@@ -4108,12 +4135,11 @@ 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(CG(active_op_array),
Z_STR(method_node.u.constant));
+ opline->result.num = zend_alloc_polymorphic_cache_slot();
+ } else {
if (opline->op1_type == IS_CONST) {
- zend_alloc_cache_slot(opline->op2.constant);
- } else {
- zend_alloc_polymorphic_cache_slot(opline->op2.constant);
+ opline->result.num = zend_alloc_cache_slot();
}
- } else {
SET_NODE(opline->op2, &method_node);
}
zend_check_live_ranges(opline);
@@ -4160,7 +4186,6 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
znode class_node, ctor_result;
zend_op *opline;
- uint32_t opnum;
if (class_ast->kind == ZEND_AST_CLASS) {
uint32_t dcl_opnum = get_next_op_number(CG(active_op_array));
@@ -4177,24 +4202,19 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
}
- opnum = get_next_op_number(CG(active_op_array));
opline = zend_emit_op(result, ZEND_NEW, NULL, NULL);
if (class_node.op_type == IS_CONST) {
opline->op1_type = IS_CONST;
opline->op1.constant = zend_add_class_name_literal(
CG(active_op_array), Z_STR(class_node.u.constant));
+ opline->op2.num = zend_alloc_cache_slot();
} else {
SET_NODE(opline->op1, &class_node);
}
zend_compile_call_common(&ctor_result, args_ast, NULL);
zend_do_free(&ctor_result);
-
- /* We save the position of DO_FCALL for convenience in find_live_range().
- * This info is not preserved for runtime. */
- opline = &CG(active_op_array)->opcodes[opnum];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
}
/* }}} */
@@ -4225,7 +4245,7 @@ void zend_compile_global_var(zend_ast *ast) /* {{{ */
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as global variable");
} else if (zend_try_compile_cv(&result, var_ast) == SUCCESS) {
zend_op *opline = zend_emit_op(NULL, ZEND_BIND_GLOBAL, &result, &name_node);
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->extended_value = zend_alloc_cache_slot();
} else {
/* name_ast should be evaluated only. FETCH_GLOBAL_LOCK instructs FETCH_W
* to not free the name_node operand, so it can be reused in the following
@@ -4245,37 +4265,43 @@ void zend_compile_global_var(zend_ast *ast) /* {{{ */
}
/* }}} */
-static void zend_compile_static_var_common(zend_ast *var_ast, zval *value, zend_bool by_ref) /* {{{ */
+static void zend_compile_static_var_common(zend_ast *var_ast, zval *value, uint32_t by_ref) /* {{{ */
{
znode var_node;
zend_op *opline;
+ zend_string *var_name;
- zend_compile_expr(&var_node, var_ast);
+ if (var_ast->kind == ZEND_AST_ZVAL) {
+ var_name = zval_make_interned_string(zend_ast_get_zval(var_ast));
+ zend_compile_expr(&var_node, var_ast);
+ } else {
+ zend_compile_expr(&var_node, var_ast);
+ var_name = zval_make_interned_string(&var_node.u.constant);
+ }
if (!CG(active_op_array)->static_variables) {
if (CG(active_op_array)->scope) {
CG(active_op_array)->scope->ce_flags |= ZEND_HAS_STATIC_IN_METHODS;
}
- ALLOC_HASHTABLE(CG(active_op_array)->static_variables);
- zend_hash_init(CG(active_op_array)->static_variables, 8, NULL, ZVAL_PTR_DTOR, 0);
+ CG(active_op_array)->static_variables = zend_new_array(8);
}
if (GC_REFCOUNT(CG(active_op_array)->static_variables) > 1) {
if (!(GC_FLAGS(CG(active_op_array)->static_variables) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(CG(active_op_array)->static_variables)--;
+ GC_DELREF(CG(active_op_array)->static_variables);
}
CG(active_op_array)->static_variables = zend_array_dup(CG(active_op_array)->static_variables);
}
- zend_hash_update(CG(active_op_array)->static_variables, Z_STR(var_node.u.constant), value);
+ value = zend_hash_update(CG(active_op_array)->static_variables, var_name, value);
- if (zend_string_equals_literal(Z_STR(var_node.u.constant), "this")) {
+ if (zend_string_equals_literal(var_name, "this")) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as static variable");
}
opline = zend_emit_op(NULL, ZEND_BIND_STATIC, NULL, &var_node);
opline->op1_type = IS_CV;
- opline->op1.var = lookup_cv(CG(active_op_array), zend_string_copy(Z_STR(var_node.u.constant)));
- opline->extended_value = by_ref;
+ opline->op1.var = lookup_cv(CG(active_op_array), var_name);
+ opline->extended_value = (uint32_t)((char*)value - (char*)CG(active_op_array)->static_variables->arData) | by_ref;
}
/* }}} */
@@ -4291,7 +4317,7 @@ void zend_compile_static_var(zend_ast *ast) /* {{{ */
ZVAL_NULL(&value_zv);
}
- zend_compile_static_var_common(var_ast, &value_zv, 1);
+ zend_compile_static_var_common(var_ast, &value_zv, ZEND_BIND_REF);
}
/* }}} */
@@ -4315,15 +4341,15 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */
}
return;
case ZEND_AST_DIM:
- opline = zend_compile_dim_common(NULL, var_ast, BP_VAR_UNSET);
+ opline = zend_compile_dim(NULL, var_ast, BP_VAR_UNSET);
opline->opcode = ZEND_UNSET_DIM;
return;
case ZEND_AST_PROP:
- opline = zend_compile_prop_common(NULL, var_ast, BP_VAR_UNSET);
+ opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET);
opline->opcode = ZEND_UNSET_OBJ;
return;
case ZEND_AST_STATIC_PROP:
- opline = zend_compile_static_prop_common(NULL, var_ast, BP_VAR_UNSET, 0);
+ opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0);
opline->opcode = ZEND_UNSET_STATIC_PROP;
return;
EMPTY_SWITCH_DEFAULT_CASE()
@@ -4347,11 +4373,8 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
opline->opcode = ZEND_FAST_CALL;
opline->result_type = IS_TMP_VAR;
opline->result.var = loop_var->var_num;
- SET_UNUSED(opline->op1);
if (return_value) {
SET_NODE(opline->op2, return_value);
- } else {
- SET_UNUSED(opline->op2);
}
opline->op1.num = loop_var->u.try_catch_offset;
} else if (loop_var->opcode == ZEND_DISCARD_EXCEPTION) {
@@ -4359,7 +4382,6 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
opline->opcode = ZEND_DISCARD_EXCEPTION;
opline->op1_type = IS_TMP_VAR;
opline->op1.var = loop_var->var_num;
- SET_UNUSED(opline->op2);
} else if (loop_var->opcode == ZEND_RETURN) {
/* Stack separator */
break;
@@ -4376,8 +4398,6 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
opline->opcode = loop_var->opcode;
opline->op1_type = loop_var->var_type;
opline->op1.var = loop_var->var_num;
- SET_UNUSED(opline->op2);
- opline->op2.num = loop_var->u.live_range_offset;
opline->extended_value = ZEND_FREE_ON_RETURN;
depth--;
}
@@ -4515,13 +4535,13 @@ void zend_compile_break_continue(zend_ast *ast) /* {{{ */
if (depth_ast) {
zval *depth_zv;
if (depth_ast->kind != ZEND_AST_ZVAL) {
- zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand "
+ zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-integer operand "
"is no longer supported", ast->kind == ZEND_AST_BREAK ? "break" : "continue");
}
depth_zv = zend_ast_get_zval(depth_ast);
if (Z_TYPE_P(depth_zv) != IS_LONG || Z_LVAL_P(depth_zv) < 1) {
- zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers",
+ zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive integers",
ast->kind == ZEND_AST_BREAK ? "break" : "continue");
}
@@ -4540,6 +4560,29 @@ void zend_compile_break_continue(zend_ast *ast) /* {{{ */
depth, depth == 1 ? "" : "s");
}
}
+
+ if (ast->kind == ZEND_AST_CONTINUE) {
+ int d, cur = CG(context).current_brk_cont;
+ for (d = depth - 1; d > 0; d--) {
+ cur = CG(context).brk_cont_array[cur].parent;
+ ZEND_ASSERT(cur != -1);
+ }
+
+ if (CG(context).brk_cont_array[cur].is_switch) {
+ if (depth == 1) {
+ zend_error(E_WARNING,
+ "\"continue\" targeting switch is equivalent to \"break\". " \
+ "Did you mean to use \"continue " ZEND_LONG_FMT "\"?",
+ depth + 1);
+ } else {
+ zend_error(E_WARNING,
+ "\"continue " ZEND_LONG_FMT "\" targeting switch is equivalent to \"break " ZEND_LONG_FMT "\". " \
+ "Did you mean to use \"continue " ZEND_LONG_FMT "\"?",
+ depth, depth, depth + 1);
+ }
+ }
+ }
+
opline = zend_emit_op(NULL, ast->kind == ZEND_AST_BREAK ? ZEND_BRK : ZEND_CONT, NULL, NULL);
opline->op1.num = CG(context).current_brk_cont;
opline->op2.num = depth;
@@ -4563,7 +4606,7 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline) /* {{{ */
zend_error_noreturn(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label));
}
- zval_dtor(label);
+ zval_ptr_dtor_str(label);
ZVAL_NULL(label);
current = opline->extended_value;
@@ -4652,7 +4695,7 @@ void zend_compile_while(zend_ast *ast) /* {{{ */
opnum_jmp = zend_emit_jump(0);
- zend_begin_loop(ZEND_NOP, NULL);
+ zend_begin_loop(ZEND_NOP, NULL, 0);
opnum_start = get_next_op_number(CG(active_op_array));
zend_compile_stmt(stmt_ast);
@@ -4675,7 +4718,7 @@ void zend_compile_do_while(zend_ast *ast) /* {{{ */
znode cond_node;
uint32_t opnum_start, opnum_cond;
- zend_begin_loop(ZEND_NOP, NULL);
+ zend_begin_loop(ZEND_NOP, NULL, 0);
opnum_start = get_next_op_number(CG(active_op_array));
zend_compile_stmt(stmt_ast);
@@ -4726,7 +4769,7 @@ void zend_compile_for(zend_ast *ast) /* {{{ */
opnum_jmp = zend_emit_jump(0);
- zend_begin_loop(ZEND_NOP, NULL);
+ zend_begin_loop(ZEND_NOP, NULL, 0);
opnum_start = get_next_op_number(CG(active_op_array));
zend_compile_stmt(stmt_ast);
@@ -4772,6 +4815,10 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
value_ast = value_ast->child[0];
}
+ if (value_ast->kind == ZEND_AST_ARRAY && zend_propagate_list_refs(value_ast)) {
+ by_ref = 1;
+ }
+
if (by_ref && is_variable) {
zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
} else {
@@ -4785,7 +4832,7 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
opnum_reset = get_next_op_number(CG(active_op_array));
opline = zend_emit_op(&reset_node, by_ref ? ZEND_FE_RESET_RW : ZEND_FE_RESET_R, &expr_node, NULL);
- zend_begin_loop(ZEND_FE_FREE, &reset_node);
+ zend_begin_loop(ZEND_FE_FREE, &reset_node, 0);
opnum_fetch = get_next_op_number(CG(active_op_array));
opline = zend_emit_op(NULL, by_ref ? ZEND_FE_FETCH_RW : ZEND_FE_FETCH_R, &reset_node, NULL);
@@ -4793,13 +4840,15 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
if (is_this_fetch(value_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this");
} else if (value_ast->kind == ZEND_AST_VAR &&
- zend_try_compile_cv(&value_node, value_ast) == SUCCESS) {
+ zend_try_compile_cv(&value_node, value_ast) == SUCCESS) {
SET_NODE(opline->op2, &value_node);
} else {
opline->op2_type = IS_VAR;
opline->op2.var = get_temporary_variable(CG(active_op_array));
GET_NODE(&value_node, opline->op2);
- if (by_ref) {
+ if (value_ast->kind == ZEND_AST_ARRAY) {
+ zend_compile_list_assign(NULL, value_ast, &value_node, value_ast->attr);
+ } else if (by_ref) {
zend_emit_assign_ref_znode(value_ast, &value_node);
} else {
zend_emit_assign_znode(value_ast, &value_node);
@@ -4946,7 +4995,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
zend_compile_expr(&expr_node, expr_ast);
- zend_begin_loop(ZEND_FREE, &expr_node);
+ zend_begin_loop(ZEND_FREE, &expr_node, 1);
case_node.op_type = IS_TMP_VAR;
case_node.u.op.var = get_temporary_variable(CG(active_op_array));
@@ -4964,7 +5013,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
jumptable_type == IS_LONG ? ZEND_SWITCH_LONG : ZEND_SWITCH_STRING,
&expr_node, &jumptable_op);
if (opline->op1_type == IS_CONST) {
- zval_copy_ctor(CT_CONSTANT(opline->op1));
+ Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1));
}
opnum_switch = opline - CG(active_op_array)->opcodes;
}
@@ -4994,10 +5043,12 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
&& Z_TYPE(expr_node.u.constant) == IS_TRUE) {
jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, 0);
} else {
- opline = zend_emit_op(NULL, ZEND_CASE, &expr_node, &cond_node);
+ opline = zend_emit_op(NULL,
+ (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) ? ZEND_CASE : ZEND_IS_EQUAL,
+ &expr_node, &cond_node);
SET_NODE(opline->result, &case_node);
if (opline->op1_type == IS_CONST) {
- zval_copy_ctor(CT_CONSTANT(opline->op1));
+ Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1));
}
jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPNZ, &case_node, 0);
@@ -5055,9 +5106,8 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
opline = get_next_op(CG(active_op_array));
opline->opcode = ZEND_FREE;
SET_NODE(opline->op1, &expr_node);
- SET_UNUSED(opline->op2);
} else if (expr_node.op_type == IS_CONST) {
- zval_dtor(&expr_node.u.constant);
+ zval_ptr_dtor_nogc(&expr_node.u.constant);
}
efree(jmpnz_opnums);
@@ -5122,7 +5172,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
zend_ast_list *classes = zend_ast_get_list(catch_ast->child[0]);
zend_ast *var_ast = catch_ast->child[1];
zend_ast *stmt_ast = catch_ast->child[2];
- zval *var_name = zend_ast_get_zval(var_ast);
+ zend_string *var_name = zval_make_interned_string(zend_ast_get_zval(var_ast));
zend_bool is_last_catch = (i + 1 == catches->children);
uint32_t *jmp_multicatch = safe_emalloc(sizeof(uint32_t), classes->children - 1, 0);
@@ -5149,20 +5199,23 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
opline->op1_type = IS_CONST;
opline->op1.constant = zend_add_class_name_literal(CG(active_op_array),
zend_resolve_class_name_ast(class_ast));
+ opline->extended_value = zend_alloc_cache_slot();
- if (zend_string_equals_literal(Z_STR_P(var_name), "this")) {
+ if (zend_string_equals_literal(var_name, "this")) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this");
}
- opline->op2_type = IS_CV;
- opline->op2.var = lookup_cv(CG(active_op_array), zend_string_copy(Z_STR_P(var_name)));
+ opline->result_type = IS_CV;
+ opline->result.var = lookup_cv(CG(active_op_array), var_name);
- opline->result.num = is_last_catch && is_last_class;
+ if (is_last_catch && is_last_class) {
+ opline->extended_value |= ZEND_LAST_CATCH;
+ }
if (!is_last_class) {
jmp_multicatch[j] = zend_emit_jump(0);
opline = &CG(active_op_array)->opcodes[opnum_catch];
- opline->extended_value = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number(CG(active_op_array));
}
}
@@ -5180,7 +5233,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
opline = &CG(active_op_array)->opcodes[opnum_catch];
if (!is_last_catch) {
- opline->extended_value = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number(CG(active_op_array));
}
}
@@ -5236,7 +5289,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
/* }}} */
/* Encoding declarations must already be handled during parsing */
-void zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
+zend_bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
{
zend_ast_list *declares = zend_ast_get_list(ast);
uint32_t i;
@@ -5248,7 +5301,8 @@ void zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
if (zend_string_equals_literal_ci(name, "encoding")) {
if (value_ast->kind != ZEND_AST_ZVAL) {
- zend_error_noreturn(E_COMPILE_ERROR, "Encoding must be a literal");
+ zend_throw_exception(zend_ce_compile_error, "Encoding must be a literal", 0);
+ return 0;
}
if (CG(multibyte)) {
@@ -5274,13 +5328,15 @@ void zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
}
}
- zend_string_release(encoding_name);
+ zend_string_release_ex(encoding_name, 0);
} else {
zend_error(E_COMPILE_WARNING, "declare(encoding=...) ignored because "
"Zend multibyte feature is turned off by settings");
}
}
}
+
+ return 1;
}
/* }}} */
@@ -5289,7 +5345,7 @@ static int zend_declare_is_first_statement(zend_ast *ast) /* {{{ */
uint32_t i = 0;
zend_ast_list *file_ast = zend_ast_get_list(CG(ast));
- /* Check to see if this declare is preceeded only by declare statements */
+ /* Check to see if this declare is preceded only by declare statements */
while (i < file_ast->children) {
if (file_ast->child[i] == ast) {
return SUCCESS;
@@ -5297,7 +5353,7 @@ static int zend_declare_is_first_statement(zend_ast *ast) /* {{{ */
/* Empty statements are not allowed prior to a declare */
return FAILURE;
} else if (file_ast->child[i]->kind != ZEND_AST_DECLARE) {
- /* declares can only be preceeded by other declares */
+ /* declares can only be preceded by other declares */
return FAILURE;
}
i++;
@@ -5327,7 +5383,7 @@ void zend_compile_declare(zend_ast *ast) /* {{{ */
zval value_zv;
zend_const_expr_to_zval(&value_zv, value_ast);
FC(declarables).ticks = zval_get_long(&value_zv);
- zval_dtor(&value_zv);
+ zval_ptr_dtor_nogc(&value_zv);
} else if (zend_string_equals_literal_ci(name, "encoding")) {
if (FAILURE == zend_declare_is_first_statement(ast)) {
@@ -5416,7 +5472,7 @@ static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info, zend_b
if (type != 0) {
if ((ast->attr & ZEND_NAME_NOT_FQ) != ZEND_NAME_NOT_FQ) {
zend_error_noreturn(E_COMPILE_ERROR,
- "Scalar type declaration '%s' must be unqualified",
+ "Type declaration '%s' must be unqualified",
ZSTR_VAL(zend_string_tolower(class_name)));
}
arg_info->type = ZEND_TYPE_ENCODE(type, allow_null);
@@ -5478,7 +5534,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
zend_ast *type_ast = param_ast->child[0];
zend_ast *var_ast = param_ast->child[1];
zend_ast *default_ast = param_ast->child[2];
- zend_string *name = zend_ast_get_str(var_ast);
+ zend_string *name = zval_make_interned_string(zend_ast_get_zval(var_ast));
zend_bool is_ref = (param_ast->attr & ZEND_PARAM_REF) != 0;
zend_bool is_variadic = (param_ast->attr & ZEND_PARAM_VARIADIC) != 0;
@@ -5493,7 +5549,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
}
var_node.op_type = IS_CV;
- var_node.u.op.var = lookup_cv(CG(active_op_array), zend_string_copy(name));
+ var_node.u.op.var = lookup_cv(CG(active_op_array), name);
if (EX_VAR_TO_NUM(var_node.u.op.var) != i) {
zend_error_noreturn(E_COMPILE_ERROR, "Redefinition of parameter $%s",
@@ -5544,8 +5600,9 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
zend_bool allow_null;
zend_bool has_null_default = default_ast
&& (Z_TYPE(default_node.u.constant) == IS_NULL
- || (Z_TYPE(default_node.u.constant) == IS_CONSTANT
- && strcasecmp(Z_STRVAL(default_node.u.constant), "NULL") == 0));
+ || (Z_TYPE(default_node.u.constant) == IS_CONSTANT_AST
+ && Z_ASTVAL(default_node.u.constant)->kind == ZEND_AST_CONSTANT
+ && strcasecmp(ZSTR_VAL(zend_ast_get_constant_name(Z_ASTVAL(default_node.u.constant))), "NULL") == 0));
zend_bool is_explicitly_nullable = (type_ast->attr & ZEND_TYPE_NULLABLE) == ZEND_TYPE_NULLABLE;
op_array->fn_flags |= ZEND_ACC_HAS_TYPE_HINTS;
@@ -5562,19 +5619,19 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
if (ZEND_TYPE_CODE(arg_info->type) == IS_ARRAY) {
if (default_ast && !has_null_default
&& Z_TYPE(default_node.u.constant) != IS_ARRAY
- && !Z_CONSTANT(default_node.u.constant)
+ && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST
) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
"with array type can only be an array or NULL");
}
} else if (ZEND_TYPE_CODE(arg_info->type) == IS_CALLABLE && default_ast) {
- if (!has_null_default && !Z_CONSTANT(default_node.u.constant)) {
+ if (!has_null_default && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
"with callable type can only be NULL");
}
}
} else {
- if (default_ast && !has_null_default && !Z_CONSTANT(default_node.u.constant)) {
+ if (default_ast && !has_null_default && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST) {
if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
"with a class type can only be NULL");
@@ -5612,9 +5669,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
/* Allocate cache slot to speed-up run-time class resolution */
if (opline->opcode == ZEND_RECV_INIT) {
if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
- zend_alloc_cache_slot(opline->op2.constant);
- } else {
- Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = -1;
+ opline->extended_value = zend_alloc_cache_slot();
}
} else {
if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
@@ -5625,15 +5680,13 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
}
}
} else {
- if (opline->opcode == ZEND_RECV_INIT) {
- Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = -1;
- } else {
+ if (opline->opcode != ZEND_RECV_INIT) {
opline->op2.num = -1;
}
}
}
- /* These are assigned at the end to avoid unitialized memory in case of an error */
+ /* These are assigned at the end to avoid uninitialized memory in case of an error */
op_array->num_args = list->children;
op_array->arg_info = arg_infos;
@@ -5645,16 +5698,32 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
}
/* }}} */
-static void zend_compile_closure_binding(znode *closure, zend_ast *uses_ast) /* {{{ */
+static void zend_compile_closure_binding(znode *closure, zend_op_array *op_array, zend_ast *uses_ast) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(uses_ast);
uint32_t i;
+ if (!list->children) {
+ return;
+ }
+
+ if (!op_array->static_variables) {
+ op_array->static_variables = zend_new_array(8);
+ }
+
+ if (GC_REFCOUNT(op_array->static_variables) > 1) {
+ if (!(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
+ GC_DELREF(op_array->static_variables);
+ }
+ op_array->static_variables = zend_array_dup(op_array->static_variables);
+ }
+
for (i = 0; i < list->children; ++i) {
zend_ast *var_name_ast = list->child[i];
- zend_string *var_name = zend_ast_get_str(var_name_ast);
- zend_bool by_ref = var_name_ast->attr;
+ zend_string *var_name = zval_make_interned_string(zend_ast_get_zval(var_name_ast));
+ uint32_t by_ref = var_name_ast->attr;
zend_op *opline;
+ zval *value;
if (zend_string_equals_literal(var_name, "this")) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as lexical variable");
@@ -5664,10 +5733,16 @@ static void zend_compile_closure_binding(znode *closure, zend_ast *uses_ast) /*
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use auto-global as lexical variable");
}
+ value = zend_hash_add(op_array->static_variables, var_name, &EG(uninitialized_zval));
+ if (!value) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Cannot use variable $%s twice", ZSTR_VAL(var_name));
+ }
+
opline = zend_emit_op(NULL, ZEND_BIND_LEXICAL, closure, NULL);
opline->op2_type = IS_CV;
- opline->op2.var = lookup_cv(CG(active_op_array), zend_string_copy(var_name));
- opline->extended_value = by_ref;
+ opline->op2.var = lookup_cv(CG(active_op_array), var_name);
+ opline->extended_value = (uint32_t)((char*)value - (char*)op_array->static_variables->arData) | by_ref;
}
}
/* }}} */
@@ -5681,16 +5756,10 @@ void zend_compile_closure_uses(zend_ast *ast) /* {{{ */
for (i = 0; i < list->children; ++i) {
zend_ast *var_ast = list->child[i];
zend_string *var_name = zend_ast_get_str(var_ast);
- zend_bool by_ref = var_ast->attr;
+ uint32_t by_ref = var_ast->attr;
zval zv;
ZVAL_NULL(&zv);
- if (op_array->static_variables
- && zend_hash_exists(op_array->static_variables, var_name)) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "Cannot use variable $%s twice", ZSTR_VAL(var_name));
- }
-
{
int i;
for (i = 0; i < op_array->last_var; i++) {
@@ -5753,7 +5822,9 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
}
if (in_interface) {
- if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
+ if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
+ /* pass */
+ } else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
if (!is_public || is_static) {
zend_error(E_WARNING, "The magic method __call() must have "
"public visibility and cannot be static");
@@ -5804,6 +5875,10 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
if (!ce->constructor) {
ce->constructor = (zend_function *) op_array;
}
+ } else if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
+ if (!is_static) {
+ op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
+ }
} else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
ce->constructor = (zend_function *) op_array;
} else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
@@ -5872,7 +5947,7 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
}
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
}
/* }}} */
@@ -5904,6 +5979,12 @@ static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_as
zend_error(E_DEPRECATED, "__autoload() is deprecated, use spl_autoload_register() instead");
}
+ if (zend_string_equals_literal_ci(unqualified_name, "assert")) {
+ zend_error(E_DEPRECATED,
+ "Defining a custom assert() function is deprecated, "
+ "as the function has special semantics");
+ }
+
key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
zend_hash_update_ptr(CG(function_table), key, op_array);
zend_register_seen_symbol(lcname, ZEND_SYMBOL_FUNCTION);
@@ -5919,10 +6000,9 @@ static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_as
LITERAL_STR(opline->op1, zend_string_copy(lcname));
/* RTD key is placed after lcname literal in op1 */
zend_add_literal_string(CG(active_op_array), &key);
- SET_UNUSED(opline->op2);
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
}
/* }}} */
@@ -5958,7 +6038,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
} else {
zend_begin_func_decl(result, op_array, decl);
if (uses_ast) {
- zend_compile_closure_binding(result, uses_ast);
+ zend_compile_closure_binding(result, op_array, uses_ast);
}
}
@@ -6030,7 +6110,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */
zend_ast *name_ast = prop_ast->child[0];
zend_ast *value_ast = prop_ast->child[1];
zend_ast *doc_comment_ast = prop_ast->child[2];
- zend_string *name = zend_ast_get_str(name_ast);
+ zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast));
zend_string *doc_comment = NULL;
zval value_zv;
@@ -6056,7 +6136,6 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */
ZVAL_NULL(&value_zv);
}
- name = zend_new_interned_string_safe(name);
zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment);
}
}
@@ -6078,7 +6157,7 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
zend_ast *name_ast = const_ast->child[0];
zend_ast *value_ast = const_ast->child[1];
zend_ast *doc_comment_ast = const_ast->child[2];
- zend_string *name = zend_ast_get_str(name_ast);
+ zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast));
zend_string *doc_comment = doc_comment_ast ? zend_string_copy(zend_ast_get_str(doc_comment_ast)) : NULL;
zval value_zv;
@@ -6093,20 +6172,16 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
}
zend_const_expr_to_zval(&value_zv, value_ast);
-
- name = zend_new_interned_string_safe(name);
zend_declare_class_constant_ex(ce, name, &value_zv, ast->attr, doc_comment);
}
}
/* }}} */
-static zend_trait_method_reference *zend_compile_method_ref(zend_ast *ast) /* {{{ */
+static void zend_compile_method_ref(zend_ast *ast, zend_trait_method_reference *method_ref) /* {{{ */
{
zend_ast *class_ast = ast->child[0];
zend_ast *method_ast = ast->child[1];
- zend_trait_method_reference *method_ref = emalloc(sizeof(zend_trait_method_reference));
- method_ref->ce = NULL;
method_ref->method_name = zend_string_copy(zend_ast_get_str(method_ast));
if (class_ast) {
@@ -6114,25 +6189,6 @@ static zend_trait_method_reference *zend_compile_method_ref(zend_ast *ast) /* {{
} else {
method_ref->class_name = NULL;
}
-
- return method_ref;
-}
-/* }}} */
-
-static zend_string **zend_compile_name_list(zend_ast *ast) /* {{{ */
-{
- zend_ast_list *list = zend_ast_get_list(ast);
- zend_string **names = safe_emalloc(sizeof(zend_string *), list->children + 1, 0);
- uint32_t i;
-
- for (i = 0; i < list->children; ++i) {
- zend_ast *name_ast = list->child[i];
- names[i] = zend_resolve_class_name_ast(name_ast);
- }
-
- names[list->children] = NULL;
-
- return names;
}
/* }}} */
@@ -6140,11 +6196,17 @@ static void zend_compile_trait_precedence(zend_ast *ast) /* {{{ */
{
zend_ast *method_ref_ast = ast->child[0];
zend_ast *insteadof_ast = ast->child[1];
+ zend_ast_list *insteadof_list = zend_ast_get_list(insteadof_ast);
+ uint32_t i;
- zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence));
- precedence->trait_method = zend_compile_method_ref(method_ref_ast);
- precedence->exclude_from_classes
- = (void *) zend_compile_name_list(insteadof_ast);
+ zend_trait_precedence *precedence = emalloc(sizeof(zend_trait_precedence) + (insteadof_list->children - 1) * sizeof(zend_string*));
+ zend_compile_method_ref(method_ref_ast, &precedence->trait_method);
+ precedence->num_excludes = insteadof_list->children;
+
+ for (i = 0; i < insteadof_list->children; ++i) {
+ zend_ast *name_ast = insteadof_list->child[i];
+ precedence->exclude_class_names[i] = zend_resolve_class_name_ast(name_ast);
+ }
zend_add_to_list(&CG(active_class_entry)->trait_precedences, precedence);
}
@@ -6167,7 +6229,7 @@ static void zend_compile_trait_alias(zend_ast *ast) /* {{{ */
}
alias = emalloc(sizeof(zend_trait_alias));
- alias->trait_method = zend_compile_method_ref(method_ref_ast);
+ zend_compile_method_ref(method_ref_ast, &alias->trait_method);
alias->modifiers = modifiers;
if (alias_ast) {
@@ -6283,7 +6345,8 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
zend_string *name, *lcname;
zend_class_entry *ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry));
zend_op *opline;
- znode declare_node, extends_node;
+ znode declare_node;
+ int extends_const;
zend_class_entry *original_ce = CG(active_class_entry);
znode original_implementing_class = FC(implementing_class);
@@ -6336,13 +6399,24 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
}
if (extends_ast) {
+ znode extends_node;
+ zend_string *extends_name;
+
if (!zend_is_const_default_class_ref(extends_ast)) {
- zend_string *extends_name = zend_ast_get_str(extends_ast);
+ extends_name = zend_ast_get_str(extends_ast);
zend_error_noreturn(E_COMPILE_ERROR,
"Cannot use '%s' as class name as it is reserved", ZSTR_VAL(extends_name));
}
- zend_compile_class_ref(&extends_node, extends_ast, 0);
+ zend_compile_expr(&extends_node, extends_ast);
+ if (extends_node.op_type != IS_CONST || Z_TYPE(extends_node.u.constant) != IS_STRING) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Illegal class name");
+ }
+ extends_name = Z_STR(extends_node.u.constant);
+ extends_const = zend_add_class_name_literal(CG(active_op_array),
+ zend_resolve_class_name(extends_name,
+ extends_ast->kind == ZEND_AST_ZVAL ? extends_ast->attr : ZEND_NAME_FQ));
+ zend_string_release_ex(extends_name, 0);
ce->ce_flags |= ZEND_ACC_INHERITED;
}
@@ -6357,7 +6431,8 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
if (decl->flags & ZEND_ACC_ANON_CLASS) {
if (extends_ast) {
opline->opcode = ZEND_DECLARE_ANON_INHERITED_CLASS;
- SET_NODE(opline->op2, &extends_node);
+ opline->op2_type = IS_CONST;
+ opline->op2.constant = extends_const;
} else {
opline->opcode = ZEND_DECLARE_ANON_CLASS;
}
@@ -6398,10 +6473,10 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
if (extends_ast) {
opline->opcode = ZEND_DECLARE_INHERITED_CLASS;
- SET_NODE(opline->op2, &extends_node);
+ opline->op2_type = IS_CONST;
+ opline->op2.constant = extends_const;
} else {
opline->opcode = ZEND_DECLARE_CLASS;
- SET_UNUSED(opline->op2);
}
key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
@@ -6611,7 +6686,7 @@ void zend_compile_use(zend_ast *ast) /* {{{ */
zend_check_already_in_use(type, old_name, new_name, ns_name);
}
- zend_string_free(ns_name);
+ zend_string_efree(ns_name);
} else {
if (zend_have_seen_symbol(lookup_name, type)) {
zend_check_already_in_use(type, old_name, new_name, lookup_name);
@@ -6625,8 +6700,8 @@ void zend_compile_use(zend_ast *ast) /* {{{ */
"is already in use", zend_get_use_type_str(type), ZSTR_VAL(old_name), ZSTR_VAL(new_name));
}
- zend_string_release(lookup_name);
- zend_string_release(new_name);
+ zend_string_release_ex(lookup_name, 0);
+ zend_string_release_ex(new_name, 0);
}
}
/* }}} */
@@ -6642,7 +6717,7 @@ void zend_compile_group_use(zend_ast *ast) /* {{{ */
zval *name_zval = zend_ast_get_zval(use->child[0]);
zend_string *name = Z_STR_P(name_zval);
zend_string *compound_ns = zend_concat_names(ZSTR_VAL(ns), ZSTR_LEN(ns), ZSTR_VAL(name), ZSTR_LEN(name));
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
ZVAL_STR(name_zval, compound_ns);
inline_use = zend_ast_create_list(1, ZEND_AST_USE, use);
inline_use->attr = ast->attr ? ast->attr : use->attr;
@@ -6737,7 +6812,7 @@ void zend_compile_namespace(zend_ast *ast) /* {{{ */
}
if (FC(current_namespace)) {
- zend_string_release(FC(current_namespace));
+ zend_string_release_ex(FC(current_namespace), 0);
}
if (name_ast) {
@@ -6784,7 +6859,7 @@ void zend_compile_halt_compiler(zend_ast *ast) /* {{{ */
ZSTR_VAL(filename), ZSTR_LEN(filename), 0);
zend_register_long_constant(ZSTR_VAL(name), ZSTR_LEN(name), offset, CONST_CS, 0);
- zend_string_release(name);
+ zend_string_release_ex(name, 0);
}
/* }}} */
@@ -6992,6 +7067,11 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
return 0;
}
+ if (!list->children) {
+ ZVAL_EMPTY_ARRAY(result);
+ return 1;
+ }
+
array_init_size(result, list->children);
for (i = 0; i < list->children; ++i) {
zend_ast *elem_ast = list->child[i];
@@ -6999,7 +7079,7 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
zend_ast *key_ast = elem_ast->child[1];
zval *value = zend_ast_get_zval(value_ast);
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
if (key_ast) {
zval *key = zend_ast_get_zval(key_ast);
@@ -7093,6 +7173,9 @@ void zend_compile_binary_op(znode *result, zend_ast *ast) /* {{{ */
if (right_node.op_type == IS_CONST) {
convert_to_string(&right_node.u.constant);
}
+ if (left_node.op_type == IS_CONST && right_node.op_type == IS_CONST) {
+ opcode = ZEND_FAST_CONCAT;
+ }
}
zend_emit_op_tmp(result, opcode, &left_node, &right_node);
} while (0);
@@ -7235,7 +7318,7 @@ 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_common(NULL, var_ast, BP_VAR_RW);
+ zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW);
opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_OBJ : ZEND_POST_DEC_OBJ;
zend_make_tmp_result(result, opline);
} else {
@@ -7255,7 +7338,7 @@ 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_common(result, var_ast, BP_VAR_RW);
+ zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW);
opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ;
} else {
znode var_node;
@@ -7462,8 +7545,10 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
zend_compile_expr(&obj_node, obj_ast);
if (obj_node.op_type == IS_CONST) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "instanceof expects an object instance, constant given");
+ zend_do_free(&obj_node);
+ result->op_type = IS_CONST;
+ ZVAL_FALSE(&result->u.constant);
+ return;
}
zend_compile_class_ref_ex(&class_node, class_ast,
@@ -7475,6 +7560,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_class_name_literal(
CG(active_op_array), Z_STR(class_node.u.constant));
+ opline->extended_value = zend_alloc_cache_slot();
} else {
SET_NODE(opline->op2, &class_node);
}
@@ -7531,22 +7617,24 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
}
break;
case ZEND_AST_DIM:
- opline = zend_compile_dim_common(result, var_ast, BP_VAR_IS);
+ opline = zend_compile_dim(result, var_ast, BP_VAR_IS);
opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;
break;
case ZEND_AST_PROP:
- opline = zend_compile_prop_common(result, var_ast, BP_VAR_IS);
+ opline = zend_compile_prop(result, var_ast, BP_VAR_IS);
opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;
break;
case ZEND_AST_STATIC_PROP:
- opline = zend_compile_static_prop_common(result, var_ast, BP_VAR_IS, 0);
+ opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0);
opline->opcode = ZEND_ISSET_ISEMPTY_STATIC_PROP;
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
result->op_type = opline->result_type = IS_TMP_VAR;
- opline->extended_value |= ast->kind == ZEND_AST_ISSET ? ZEND_ISSET : ZEND_ISEMPTY;
+ if (!(ast->kind == ZEND_AST_ISSET)) {
+ opline->extended_value |= ZEND_ISEMPTY;
+ }
}
/* }}} */
@@ -7681,14 +7769,14 @@ void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
if (last && last->kind == ZEND_AST_HALT_COMPILER) {
result->op_type = IS_CONST;
ZVAL_LONG(&result->u.constant, Z_LVAL_P(zend_ast_get_zval(last->child[0])));
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return;
}
}
if (zend_try_ct_eval_const(&result->u.constant, resolved_name, is_fully_qualified)) {
result->op_type = IS_CONST;
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return;
}
@@ -7699,9 +7787,9 @@ void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
opline->op2.constant = zend_add_const_name_literal(
CG(active_op_array), resolved_name, 0);
} else {
- opline->extended_value = IS_CONSTANT_UNQUALIFIED;
+ opline->op1.num = IS_CONSTANT_UNQUALIFIED;
if (FC(current_namespace)) {
- opline->extended_value |= IS_CONSTANT_IN_NAMESPACE;
+ opline->op1.num |= IS_CONSTANT_IN_NAMESPACE;
opline->op2.constant = zend_add_const_name_literal(
CG(active_op_array), resolved_name, 1);
} else {
@@ -7709,7 +7797,7 @@ void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
CG(active_op_array), resolved_name, 0);
}
}
- zend_alloc_cache_slot(opline->op2.constant);
+ opline->extended_value = zend_alloc_cache_slot();
}
/* }}} */
@@ -7724,7 +7812,7 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
if (zend_try_compile_const_expr_resolve_class_name(&result->u.constant, class_ast, const_ast, 0)) {
if (Z_TYPE(result->u.constant) == IS_NULL) {
zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
- opline->extended_value = zend_get_class_fetch_type(zend_ast_get_str(class_ast));
+ opline->op1.num = zend_get_class_fetch_type(zend_ast_get_str(class_ast));
} else {
result->op_type = IS_CONST;
}
@@ -7743,10 +7831,10 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
resolved_name = zend_resolve_class_name_ast(class_ast);
if (const_ast->kind == ZEND_AST_ZVAL && zend_try_ct_eval_class_const(&result->u.constant, resolved_name, zend_ast_get_str(const_ast))) {
result->op_type = IS_CONST;
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return;
}
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
}
if (const_ast->kind == ZEND_AST_ZVAL && zend_string_equals_literal_ci(zend_ast_get_str(const_ast), "class")) {
zend_error_noreturn(E_COMPILE_ERROR,
@@ -7761,11 +7849,7 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
zend_set_class_name_op1(opline, &class_node);
- if (opline->op1_type == IS_CONST) {
- zend_alloc_cache_slot(opline->op2.constant);
- } else {
- zend_alloc_polymorphic_cache_slot(opline->op2.constant);
- }
+ opline->extended_value = zend_alloc_polymorphic_cache_slot();
}
/* }}} */
@@ -7782,14 +7866,14 @@ void zend_compile_resolve_class_name(znode *result, zend_ast *ast) /* {{{ */
ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
} else {
zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
- opline->extended_value = fetch_type;
+ opline->op1.num = fetch_type;
}
break;
case ZEND_FETCH_CLASS_STATIC:
case ZEND_FETCH_CLASS_PARENT:
{
zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
- opline->extended_value = fetch_type;
+ opline->op1.num = fetch_type;
}
break;
case ZEND_FETCH_CLASS_DEFAULT:
@@ -7809,7 +7893,6 @@ static zend_op *zend_compile_rope_add(znode *result, uint32_t num, znode *elem_n
result->op_type = IS_TMP_VAR;
result->u.op.var = -1;
opline->opcode = ZEND_ROPE_INIT;
- SET_UNUSED(opline->op1);
} else {
opline->opcode = ZEND_ROPE_ADD;
SET_NODE(opline->op1, result);
@@ -7899,7 +7982,7 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
GET_NODE(result, opline->result);
} else {
uint32_t var;
- uint32_t range = zend_start_live_range_ex(CG(active_op_array), rope_init_lineno);
+ uint32_t range = zend_start_live_range(CG(active_op_array), rope_init_lineno);
init_opline->extended_value = j;
opline->opcode = ZEND_ROPE_END;
@@ -7947,7 +8030,7 @@ void zend_compile_magic_const(znode *result, zend_ast *ast) /* {{{ */
(CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) != 0);
opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
- opline->extended_value = ZEND_FETCH_CLASS_SELF;
+ opline->op1.num = ZEND_FETCH_CLASS_SELF;
}
/* }}} */
@@ -7972,6 +8055,7 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
zend_ast *const_ast = ast->child[1];
zend_string *class_name;
zend_string *const_name = zend_ast_get_str(const_ast);
+ zend_string *name;
zval result;
int fetch_type;
@@ -7999,16 +8083,13 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
zend_string_addref(class_name);
}
- Z_STR(result) = zend_concat3(
+ name = zend_concat3(
ZSTR_VAL(class_name), ZSTR_LEN(class_name), "::", 2, ZSTR_VAL(const_name), ZSTR_LEN(const_name));
- Z_TYPE_INFO(result) = IS_CONSTANT_EX;
- Z_CONST_FLAGS(result) = fetch_type;
-
zend_ast_destroy(ast);
- zend_string_release(class_name);
+ zend_string_release_ex(class_name, 0);
- *ast_ptr = zend_ast_create_zval(&result);
+ *ast_ptr = zend_ast_create_constant(name, fetch_type | ZEND_FETCH_CLASS_EXCEPTION);
}
/* }}} */
@@ -8018,25 +8099,21 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr) /* {{{ */
zend_ast *name_ast = ast->child[0];
zend_string *orig_name = zend_ast_get_str(name_ast);
zend_bool is_fully_qualified;
+ zval result;
+ zend_string *resolved_name;
- zval result, resolved_name;
- ZVAL_STR(&resolved_name, zend_resolve_const_name(
- orig_name, name_ast->attr, &is_fully_qualified));
+ resolved_name = zend_resolve_const_name(
+ orig_name, name_ast->attr, &is_fully_qualified);
- if (zend_try_ct_eval_const(&result, Z_STR(resolved_name), is_fully_qualified)) {
- zend_string_release(Z_STR(resolved_name));
+ if (zend_try_ct_eval_const(&result, resolved_name, is_fully_qualified)) {
+ zend_string_release_ex(resolved_name, 0);
zend_ast_destroy(ast);
*ast_ptr = zend_ast_create_zval(&result);
return;
}
- Z_TYPE_INFO(resolved_name) = IS_CONSTANT_EX;
- if (!is_fully_qualified) {
- Z_CONST_FLAGS(resolved_name) = IS_CONSTANT_UNQUALIFIED;
- }
-
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_zval(&resolved_name);
+ *ast_ptr = zend_ast_create_constant(resolved_name, !is_fully_qualified ? IS_CONSTANT_UNQUALIFIED : 0);
}
/* }}} */
@@ -8047,14 +8124,8 @@ void zend_compile_const_expr_magic_const(zend_ast **ast_ptr) /* {{{ */
/* Other cases already resolved by constant folding */
ZEND_ASSERT(ast->attr == T_CLASS_C);
- {
- zval const_zv;
- Z_STR(const_zv) = zend_string_init("__CLASS__", sizeof("__CLASS__")-1, 0);
- Z_TYPE_INFO(const_zv) = IS_CONSTANT_EX | (IS_CONSTANT_CLASS << Z_CONST_FLAGS_SHIFT);
-
- zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_zval(&const_zv);
- }
+ zend_ast_destroy(ast);
+ *ast_ptr = zend_ast_create(ZEND_AST_CONSTANT_CLASS);
}
/* }}} */
@@ -8094,7 +8165,7 @@ void zend_const_expr_to_zval(zval *result, zend_ast *ast) /* {{{ */
if (ast->kind == ZEND_AST_ZVAL) {
ZVAL_COPY_VALUE(result, zend_ast_get_zval(ast));
} else {
- ZVAL_NEW_AST(result, zend_ast_copy(ast));
+ ZVAL_AST(result, zend_ast_copy(ast));
/* destroy the ast here, it might have been replaced */
zend_ast_destroy(ast);
}
@@ -8414,18 +8485,15 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
- zend_op *opline;
switch (ast->kind) {
case ZEND_AST_VAR:
zend_compile_simple_var(result, ast, type, 1);
return;
case ZEND_AST_DIM:
- opline = zend_delayed_compile_dim(result, ast, type);
- zend_adjust_for_fetch_type(opline, type);
+ zend_delayed_compile_dim(result, ast, type);
return;
case ZEND_AST_PROP:
- opline = zend_delayed_compile_prop(result, ast, type);
- zend_adjust_for_fetch_type(opline, type);
+ zend_delayed_compile_prop(result, ast, type);
return;
case ZEND_AST_STATIC_PROP:
zend_compile_static_prop(result, ast, type, 1);
@@ -8643,11 +8711,11 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
zend_ast_get_str(name_ast), name_ast->attr, &is_fully_qualified);
if (!zend_try_ct_eval_const(&result, resolved_name, is_fully_qualified)) {
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return;
}
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
break;
}
case ZEND_AST_CLASS_CONST:
@@ -8685,11 +8753,11 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
resolved_name = zend_resolve_class_name_ast(class_ast);
if (!zend_try_ct_eval_class_const(&result, resolved_name, zend_ast_get_str(name_ast))) {
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
return;
}
- zend_string_release(resolved_name);
+ zend_string_release_ex(resolved_name, 0);
break;
}
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 47430576ec..f63b3a755d 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -45,7 +43,7 @@
#define RESET_DOC_COMMENT() do { \
if (CG(doc_comment)) { \
- zend_string_release(CG(doc_comment)); \
+ zend_string_release_ex(CG(doc_comment), 0); \
CG(doc_comment) = NULL; \
} \
} while (0)
@@ -59,12 +57,10 @@ typedef struct _zend_op zend_op;
#if SIZEOF_SIZE_T == 4
# define ZEND_USE_ABS_JMP_ADDR 1
# define ZEND_USE_ABS_CONST_ADDR 1
-# define ZEND_EX_USE_LITERALS 0
# define ZEND_EX_USE_RUN_TIME_CACHE 1
#else
# define ZEND_USE_ABS_JMP_ADDR 0
# define ZEND_USE_ABS_CONST_ADDR 0
-# define ZEND_EX_USE_LITERALS 1
# define ZEND_EX_USE_RUN_TIME_CACHE 1
#endif
@@ -99,7 +95,8 @@ typedef struct _zend_ast_znode {
uint32_t lineno;
znode node;
} zend_ast_znode;
-ZEND_API zend_ast *zend_ast_create_znode(znode *node);
+
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_znode(znode *node);
static zend_always_inline znode *zend_ast_get_znode(zend_ast *ast) {
return &((zend_ast_znode *) ast)->node;
@@ -159,6 +156,7 @@ typedef struct _zend_brk_cont_element {
int cont;
int brk;
int parent;
+ zend_bool is_switch;
} zend_brk_cont_element;
typedef struct _zend_label {
@@ -199,113 +197,143 @@ typedef struct _zend_oparray_context {
HashTable *labels;
} zend_oparray_context;
-/*
- * Function and method flags
- *
- * Free flags:
- * 0x10
- * 0x20
- * 0x8000
- * 0x2000000
- */
-
-/* method flags (types) */
-#define ZEND_ACC_STATIC 0x01
-#define ZEND_ACC_ABSTRACT 0x02
-#define ZEND_ACC_FINAL 0x04
-#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x08
-
-/* method flags (visibility) */
-/* The order of those must be kept - public < protected < private */
-#define ZEND_ACC_PUBLIC 0x100
-#define ZEND_ACC_PROTECTED 0x200
-#define ZEND_ACC_PRIVATE 0x400
-#define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)
-
-#define ZEND_ACC_CHANGED 0x800
-#define ZEND_ACC_IMPLICIT_PUBLIC 0x1000
-
-/* method flags (special method detection) */
-#define ZEND_ACC_CTOR 0x2000
-#define ZEND_ACC_DTOR 0x4000
-
-/* method flag used by Closure::__invoke() */
-#define ZEND_ACC_USER_ARG_INFO 0x80
+/* Class, property and method flags class|meth.|prop.|const*/
+/* | | | */
+/* Common flags | | | */
+/* ============ | | | */
+/* | | | */
+/* Staic method or property | | | */
+#define ZEND_ACC_STATIC (1 << 0) /* | X | X | */
+/* | | | */
+/* Final class or method | | | */
+#define ZEND_ACC_FINAL (1 << 2) /* X | X | | */
+/* | | | */
+/* Visibility flags (public < protected < private) | | | */
+#define ZEND_ACC_PUBLIC (1 << 8) /* | X | X | X */
+#define ZEND_ACC_PROTECTED (1 << 9) /* | X | X | X */
+#define ZEND_ACC_PRIVATE (1 << 10) /* | X | X | X */
+/* | | | */
+/* TODO: explain the name ??? | | | */
+#define ZEND_ACC_CHANGED (1 << 11) /* | X | X | */
+/* | | | */
+/* TODO: used only by ext/reflection ??? | | | */
+#define ZEND_ACC_IMPLICIT_PUBLIC (1 << 12) /* | ? | ? | ? */
+/* | | | */
+/* Shadow of parent's private method/property | | | */
+#define ZEND_ACC_SHADOW (1 << 17) /* | ? | X | */
+/* | | | */
+/* Class Flags (unused: 0, 1, 3, 11-18, 21, 25...) | | | */
+/* =========== | | | */
+/* | | | */
+/* class is abstarct, since it is set by any | | | */
+/* abstract method | | | */
+#define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS (1 << 4) /* X | | | */
+/* | | | */
+/* Class is explicitly defined as abstract by using | | | */
+/* the keyword. | | | */
+#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS (1 << 5) /* X | | | */
+/* | | | */
+/* Special class types | | | */
+#define ZEND_ACC_INTERFACE (1 << 6) /* X | | | */
+#define ZEND_ACC_TRAIT (1 << 7) /* X | | | */
+#define ZEND_ACC_ANON_CLASS (1 << 8) /* X | | | */
+/* | | | */
+/* Bound anonymous class | | | */
+#define ZEND_ACC_ANON_BOUND (1 << 9) /* X | | | */
+/* | | | */
+/* Class extends another class | | | */
+#define ZEND_ACC_INHERITED (1 << 10) /* X | | | */
+/* | | | */
+/* Class implements interface(s) | | | */
+#define ZEND_ACC_IMPLEMENT_INTERFACES (1 << 19) /* X | | | */
+/* | | | */
+/* Class constants updated | | | */
+#define ZEND_ACC_CONSTANTS_UPDATED (1 << 20) /* X | | | */
+/* | | | */
+/* Class uses trait(s) | | | */
+#define ZEND_ACC_IMPLEMENT_TRAITS (1 << 22) /* X | | | */
+/* | | | */
+/* User class has methods with static variables | | | */
+#define ZEND_HAS_STATIC_IN_METHODS (1 << 23) /* X | | | */
+/* | | | */
+/* Class has magic methods __get/__set/__unset/ | | | */
+/* __isset that use guards | | | */
+#define ZEND_ACC_USE_GUARDS (1 << 24) /* X | | | */
+/* | | | */
+/* Function Flags (unused: 4, 5, 17?) | | | */
+/* ============== | | | */
+/* | | | */
+/* Abstarct method | | | */
+#define ZEND_ACC_ABSTRACT (1 << 1) /* | X | | */
+/* | | | */
+/* TODO: used only during inheritance ??? | | | */
+#define ZEND_ACC_IMPLEMENTED_ABSTRACT (1 << 3) /* | X | | */
+/* | | | */
+#define ZEND_ACC_FAKE_CLOSURE (1 << 6) /* | X | | */
+/* | | | */
+/* method flag used by Closure::__invoke() | | | */
+#define ZEND_ACC_USER_ARG_INFO (1 << 7) /* | X | | */
+/* | | | */
+/* method flags (special method detection) | | | */
+#define ZEND_ACC_CTOR (1 << 13) /* | X | | */
+#define ZEND_ACC_DTOR (1 << 14) /* | X | | */
+/* | | | */
+/* "main" op_array with | | | */
+/* ZEND_DECLARE_INHERITED_CLASS_DELAYED opcodes | | | */
+#define ZEND_ACC_EARLY_BINDING (1 << 15) /* | X | | */
+/* | | | */
+/* method flag (bc only), any method that has this | | | */
+/* flag can be used statically and non statically. | | | */
+#define ZEND_ACC_ALLOW_STATIC (1 << 16) /* | X | | */
+/* | | | */
+/* deprecation flag | | | */
+#define ZEND_ACC_DEPRECATED (1 << 18) /* | X | | */
+/* | | | */
+#define ZEND_ACC_NO_RT_ARENA (1 << 19) /* | X | | */
+/* | | | */
+#define ZEND_ACC_CLOSURE (1 << 20) /* | X | | */
+/* | | | */
+/* call through user function trampoline. e.g. | | | */
+/* __call, __callstatic | | | */
+#define ZEND_ACC_CALL_VIA_TRAMPOLINE (1 << 21) /* | X | | */
+/* | | | */
+/* disable inline caching | | | */
+#define ZEND_ACC_NEVER_CACHE (1 << 22) /* | X | | */
+/* | | | */
+#define ZEND_ACC_GENERATOR (1 << 23) /* | X | | */
+/* | | | */
+/* Function with varable number of arguments | | | */
+#define ZEND_ACC_VARIADIC (1 << 24) /* | X | | */
+/* | | | */
+/* Immutable op_array (lazy loading) | | | */
+#define ZEND_ACC_IMMUTABLE (1 << 25) /* | X | | */
+/* | | | */
+/* Function returning by reference | | | */
+#define ZEND_ACC_RETURN_REFERENCE (1 << 26) /* | X | | */
+/* | | | */
+#define ZEND_ACC_DONE_PASS_TWO (1 << 27) /* | X | | */
+/* | | | */
+/* Function has typed arguments | | | */
+#define ZEND_ACC_HAS_TYPE_HINTS (1 << 28) /* | X | | */
+/* | | | */
+/* op_array has finally blocks (user only) | | | */
+#define ZEND_ACC_HAS_FINALLY_BLOCK (1 << 29) /* | X | | */
+/* | | | */
+/* internal function is allocated at arena (int only) | | | */
+#define ZEND_ACC_ARENA_ALLOCATED (1 << 29) /* | X | | */
+/* | | | */
+/* Function has a return type | | | */
+#define ZEND_ACC_HAS_RETURN_TYPE (1 << 30) /* | X | | */
+/* | | | */
+/* op_array uses strict mode types | | | */
+#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */
-/* method flag (bc only), any method that has this flag can be used statically and non statically. */
-#define ZEND_ACC_ALLOW_STATIC 0x10000
-/* shadow of parent's private method/property */
-#define ZEND_ACC_SHADOW 0x20000
-
-/* deprecation flag */
-#define ZEND_ACC_DEPRECATED 0x40000
-
-#define ZEND_ACC_CLOSURE 0x100000
-#define ZEND_ACC_FAKE_CLOSURE 0x40
-#define ZEND_ACC_GENERATOR 0x800000
-
-#define ZEND_ACC_NO_RT_ARENA 0x80000
-
-/* call through user function trampoline. e.g. __call, __callstatic */
-#define ZEND_ACC_CALL_VIA_TRAMPOLINE 0x200000
+#define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)
/* call through internal function handler. e.g. Closure::invoke() */
#define ZEND_ACC_CALL_VIA_HANDLER ZEND_ACC_CALL_VIA_TRAMPOLINE
-/* disable inline caching */
-#define ZEND_ACC_NEVER_CACHE 0x400000
-
-#define ZEND_ACC_VARIADIC 0x1000000
-
-#define ZEND_ACC_RETURN_REFERENCE 0x4000000
-#define ZEND_ACC_DONE_PASS_TWO 0x8000000
-
-/* class has magic methods __get/__set/__unset/__isset that use guards */
-#define ZEND_ACC_USE_GUARDS 0x1000000
-
-/* function has typed arguments */
-#define ZEND_ACC_HAS_TYPE_HINTS 0x10000000
-
-/* op_array has finally blocks */
-#define ZEND_ACC_HAS_FINALLY_BLOCK 0x20000000
-
-/* internal function is allocated at arena */
-#define ZEND_ACC_ARENA_ALLOCATED 0x20000000
-
-/* Function has a return type (or class has such non-private function) */
-#define ZEND_ACC_HAS_RETURN_TYPE 0x40000000
-
-/* op_array uses strict mode types */
-#define ZEND_ACC_STRICT_TYPES 0x80000000
-
-/*
- * Class flags
- *
- * Classes also use the ZEND_ACC_FINAL (0x04) flag, otherwise there is no overlap.
- */
-
-/* class flags (types) */
-/* ZEND_ACC_IMPLICIT_ABSTRACT_CLASS is used for abstract classes (since it is set by any abstract method even interfaces MAY have it set, too). */
-/* ZEND_ACC_EXPLICIT_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */
-#define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS 0x10
-#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS 0x20
-#define ZEND_ACC_INTERFACE 0x40
-#define ZEND_ACC_TRAIT 0x80
-#define ZEND_ACC_ANON_CLASS 0x100
-#define ZEND_ACC_ANON_BOUND 0x200
-#define ZEND_ACC_INHERITED 0x400
-
-/* class implement interface(s) flag */
-#define ZEND_ACC_IMPLEMENT_INTERFACES 0x80000
-#define ZEND_ACC_IMPLEMENT_TRAITS 0x400000
-
-/* class constants updated */
-#define ZEND_ACC_CONSTANTS_UPDATED 0x100000
-
-/* user class has methods with static variables */
-#define ZEND_HAS_STATIC_IN_METHODS 0x800000
-
char *zend_visibility_string(uint32_t fn_flags);
typedef struct _zend_property_info {
@@ -373,35 +401,31 @@ struct _zend_op_array {
zend_arg_info *arg_info;
/* END of common elements */
- uint32_t *refcount;
+ int cache_size; /* number of run_time_cache_slots * sizeof(void*) */
+ int last_var; /* number of CV variables */
+ uint32_t T; /* number of temporary variables */
+ uint32_t last; /* number of opcodes */
- uint32_t last;
zend_op *opcodes;
+ void **run_time_cache;
+ HashTable *static_variables;
+ zend_string **vars; /* names of CV variables */
- int last_var;
- uint32_t T;
- zend_string **vars;
+ uint32_t *refcount;
int last_live_range;
int last_try_catch;
zend_live_range *live_range;
zend_try_catch_element *try_catch_array;
- /* static variables support */
- HashTable *static_variables;
-
zend_string *filename;
uint32_t line_start;
uint32_t line_end;
zend_string *doc_comment;
- uint32_t early_binding; /* the linked list of delayed declarations */
int last_literal;
zval *literals;
- int cache_size;
- void **run_time_cache;
-
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
@@ -410,7 +434,7 @@ struct _zend_op_array {
#define ZEND_RETURN_REFERENCE 1
/* zend_internal_function_handler */
-typedef void (*zif_handler)(INTERNAL_FUNCTION_PARAMETERS);
+typedef void (ZEND_FASTCALL *zif_handler)(INTERNAL_FUNCTION_PARAMETERS);
typedef struct _zend_internal_function {
/* Common elements */
@@ -470,16 +494,13 @@ struct _zend_execute_data {
#if ZEND_EX_USE_RUN_TIME_CACHE
void **run_time_cache; /* cache op_array->run_time_cache */
#endif
-#if ZEND_EX_USE_LITERALS
- zval *literals; /* cache op_array->literals */
-#endif
};
#define ZEND_CALL_FUNCTION (0 << 0)
#define ZEND_CALL_CODE (1 << 0)
#define ZEND_CALL_NESTED (0 << 1)
#define ZEND_CALL_TOP (1 << 1)
-#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2) /* equal to IS_TYPE_REFCOUNTED */
+#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2)
#define ZEND_CALL_CTOR (1 << 3)
#define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 4)
#define ZEND_CALL_CLOSURE (1 << 5)
@@ -488,6 +509,7 @@ struct _zend_execute_data {
#define ZEND_CALL_GENERATOR (1 << 8)
#define ZEND_CALL_DYNAMIC (1 << 9)
#define ZEND_CALL_FAKE_CLOSURE (1 << 10)
+#define ZEND_CALL_SEND_ARG_BY_REF (1 << 11)
#define ZEND_CALL_INFO_SHIFT 16
@@ -508,10 +530,18 @@ struct _zend_execute_data {
call_info |= ((flag) << ZEND_CALL_INFO_SHIFT); \
} while (0)
+#define ZEND_DEL_CALL_FLAG_EX(call_info, flag) do { \
+ call_info &= ~((flag) << ZEND_CALL_INFO_SHIFT); \
+ } while (0)
+
#define ZEND_ADD_CALL_FLAG(call, flag) do { \
ZEND_ADD_CALL_FLAG_EX(Z_TYPE_INFO((call)->This), flag); \
} while (0)
+#define ZEND_DEL_CALL_FLAG(call, flag) do { \
+ ZEND_DEL_CALL_FLAG_EX(Z_TYPE_INFO((call)->This), flag); \
+ } while (0)
+
#define ZEND_CALL_NUM_ARGS(call) \
(call)->This.u2.num_args
@@ -616,64 +646,38 @@ struct _zend_execute_data {
#if ZEND_USE_ABS_CONST_ADDR
/* run-time constant */
-# define RT_CONSTANT_EX(base, node) \
+# define RT_CONSTANT(opline, node) \
(node).zv
/* convert constant from compile-time to run-time */
-# define ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, node) do { \
+# define ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, node) do { \
(node).zv = CT_CONSTANT_EX(op_array, (node).constant); \
} while (0)
-/* convert constant back from run-time to compile-time */
-# define ZEND_PASS_TWO_UNDO_CONSTANT(op_array, node) do { \
- (node).constant = (node).zv - (op_array)->literals; \
- } while (0)
-
#else
+/* At run-time, constants are allocated together with op_array->opcodes
+ * and addressed relatively to current opline.
+ */
+
/* run-time constant */
-# define RT_CONSTANT_EX(base, node) \
- ((zval*)(((char*)(base)) + (node).constant))
+# define RT_CONSTANT(opline, node) \
+ ((zval*)(((char*)(opline)) + (int32_t)(node).constant))
/* convert constant from compile-time to run-time */
-# define ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, node) do { \
- (node).constant *= sizeof(zval); \
- } while (0)
-
-/* convert constant back from run-time to compile-time (do nothing) */
-# define ZEND_PASS_TWO_UNDO_CONSTANT(op_array, node) do { \
- (node).constant /= sizeof(zval); \
+# define ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, node) do { \
+ (node).constant = \
+ (((char*)CT_CONSTANT_EX(op_array, (node).constant)) - \
+ ((char*)opline)); \
} while (0)
#endif
-#if ZEND_EX_USE_LITERALS
-
-# define EX_LITERALS() \
- EX(literals)
-
-# define EX_LOAD_LITERALS(op_array) do { \
- EX(literals) = (op_array)->literals; \
- } while (0)
-
-#else
-
-# define EX_LITERALS() \
- EX(func)->op_array.literals
-
-# define EX_LOAD_LITERALS(op_array) do { \
+/* convert constant back from run-time to compile-time */
+#define ZEND_PASS_TWO_UNDO_CONSTANT(op_array, opline, node) do { \
+ (node).constant = RT_CONSTANT(opline, node) - (op_array)->literals; \
} while (0)
-#endif
-
-/* run-time constant */
-#define RT_CONSTANT(op_array, node) \
- RT_CONSTANT_EX((op_array)->literals, node)
-
-/* constant in currently executed function */
-#define EX_CONSTANT(node) \
- RT_CONSTANT_EX(EX_LITERALS(), node)
-
#if ZEND_EX_USE_RUN_TIME_CACHE
# define EX_RUN_TIME_CACHE() \
@@ -693,11 +697,13 @@ struct _zend_execute_data {
#endif
+#define IS_UNUSED 0 /* Unused operand */
#define IS_CONST (1<<0)
#define IS_TMP_VAR (1<<1)
#define IS_VAR (1<<2)
-#define IS_UNUSED (1<<3) /* Unused variable */
-#define IS_CV (1<<4) /* Compiled variable */
+#define IS_CV (1<<3) /* Compiled variable */
+
+#define ZEND_EXTRA_VALUE 1
#include "zend_globals.h"
@@ -715,7 +721,7 @@ void zend_file_context_end(zend_file_context *prev_context);
extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type);
extern ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename);
-ZEND_API int lex_scan(zval *zendlval);
+ZEND_API int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem);
void startup_scanner(void);
void shutdown_scanner(void);
@@ -746,7 +752,7 @@ zend_ast *zend_ast_append_str(zend_ast *left, zend_ast *right);
zend_ast *zend_negate_num_string(zend_ast *ast);
uint32_t zend_add_class_modifier(uint32_t flags, uint32_t new_flag);
uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag);
-void zend_handle_encoding_declaration(zend_ast *ast);
+zend_bool zend_handle_encoding_declaration(zend_ast *ast);
/* parser-driven code generators */
void zend_do_free(znode *op1);
@@ -754,7 +760,8 @@ void zend_do_free(znode *op1);
ZEND_API int do_bind_function(const zend_op_array *op_array, const zend_op *opline, HashTable *function_table, zend_bool compile_time);
ZEND_API zend_class_entry *do_bind_class(const zend_op_array *op_array, const zend_op *opline, HashTable *class_table, zend_bool compile_time);
ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array, const zend_op *opline, HashTable *class_table, zend_class_entry *parent_ce, zend_bool compile_time);
-ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array);
+ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array);
+ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array, uint32_t first_early_binding_opline);
void zend_do_extended_info(void);
void zend_do_extended_fcall_begin(void);
@@ -795,11 +802,7 @@ ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char
#define ZEND_FUNCTION_DTOR zend_function_dtor
#define ZEND_CLASS_DTOR destroy_zend_class
-zend_op *get_next_op(zend_op_array *op_array);
-void init_op(zend_op *op);
-uint32_t get_next_op_number(zend_op_array *op_array);
ZEND_API int pass_two(zend_op_array *op_array);
-zend_brk_cont_element *get_next_brk_cont_element(void);
ZEND_API zend_bool zend_is_compiling(void);
ZEND_API char *zend_make_compiled_string_description(const char *name);
ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers);
@@ -807,6 +810,11 @@ uint32_t zend_get_class_fetch_type(zend_string *name);
ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc);
ZEND_API int zend_is_smart_branch(zend_op *opline);
+static zend_always_inline uint32_t get_next_op_number(zend_op_array *op_array)
+{
+ return op_array->last;
+}
+
typedef zend_bool (*zend_auto_global_callback)(zend_string *name);
typedef struct _zend_auto_global {
zend_string *name;
@@ -822,7 +830,7 @@ ZEND_API zend_bool zend_is_auto_global_str(char *name, size_t len);
ZEND_API size_t zend_dirname(char *path, size_t len);
ZEND_API void zend_set_function_arg_flags(zend_function *func);
-int zendlex(zend_parser_stack_elem *elem);
+int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem);
int zend_add_literal(zend_op_array *op_array, zval *zv);
@@ -868,11 +876,6 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define BP_VAR_FUNC_ARG 4
#define BP_VAR_UNSET 5
-/* Bottom 3 bits are the type, top bits are arg num for BP_VAR_FUNC_ARG */
-#define BP_VAR_SHIFT 3
-#define BP_VAR_MASK 7
-
-
#define ZEND_INTERNAL_FUNCTION 1
#define ZEND_USER_FUNCTION 2
#define ZEND_OVERLOADED_FUNCTION 3
@@ -895,19 +898,15 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define ZEND_RT (1<<1)
/* global/local fetches */
-#define ZEND_FETCH_GLOBAL 0x00000000
-#define ZEND_FETCH_LOCAL 0x10000000
-#define ZEND_FETCH_GLOBAL_LOCK 0x40000000
-
-#define ZEND_FETCH_TYPE_MASK 0x70000000
+#define ZEND_FETCH_GLOBAL (1<<1)
+#define ZEND_FETCH_LOCAL (1<<2)
+#define ZEND_FETCH_GLOBAL_LOCK (1<<3)
-#define ZEND_FETCH_STANDARD 0x00000000
+#define ZEND_FETCH_TYPE_MASK 0xe
-#define ZEND_ISSET 0x02000000
-#define ZEND_ISEMPTY 0x01000000
-#define ZEND_ISSET_ISEMPTY_MASK (ZEND_ISSET | ZEND_ISEMPTY)
+#define ZEND_ISEMPTY (1<<0)
-#define ZEND_FETCH_ARG_MASK 0x000fffff
+#define ZEND_LAST_CATCH (1<<0)
#define ZEND_FREE_ON_RETURN (1<<0)
@@ -917,6 +916,10 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define ZEND_DIM_IS 1
+#define IS_CONSTANT_UNQUALIFIED 0x010
+#define IS_CONSTANT_CLASS 0x080 /* __CLASS__ in trait */
+#define IS_CONSTANT_IN_NAMESPACE 0x100
+
static zend_always_inline int zend_check_arg_send_type(const zend_function *zf, uint32_t arg_num, uint32_t mask)
{
arg_num--;
@@ -967,6 +970,8 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf,
#define ZEND_RETURN_VAL 0
#define ZEND_RETURN_REF 1
+#define ZEND_BIND_VAL 0
+#define ZEND_BIND_REF 1
#define ZEND_RETURNS_FUNCTION (1<<0)
#define ZEND_RETURNS_VALUE (1<<1)
@@ -1034,14 +1039,17 @@ END_EXTERN_C()
/* generate ZEND_INIT_FCALL_BY_NAME for userland functions instead of ZEND_INIT_FCALL */
#define ZEND_COMPILE_IGNORE_USER_FUNCTIONS (1<<8)
-/* force IS_OBJ_USE_GUARDS for all classes */
+/* force ZEND_ACC_USE_GUARDS for all classes */
#define ZEND_COMPILE_GUARDS (1<<9)
/* disable builtin special case function calls */
#define ZEND_COMPILE_NO_BUILTINS (1<<10)
+/* result of compilation may be stored in file cache */
+#define ZEND_COMPILE_WITH_FILE_CACHE (1<<11)
+
/* disable jumptable optimization for switch statements */
-#define ZEND_COMPILE_NO_JUMPTABLES (1<<11)
+#define ZEND_COMPILE_NO_JUMPTABLES (1<<12)
/* The default value for CG(compiler_options) */
#define ZEND_COMPILE_DEFAULT ZEND_COMPILE_HANDLE_OP_ARRAY
diff --git a/Zend/zend_config.nw.h b/Zend/zend_config.nw.h
index b4700370db..c7cc81ea7f 100644
--- a/Zend/zend_config.nw.h
+++ b/Zend/zend_config.nw.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_CONFIG_NW_H
#define ZEND_CONFIG_NW_H
diff --git a/Zend/zend_config.w32.h b/Zend/zend_config.w32.h
index 43626cefe4..cb58c8bdb2 100644
--- a/Zend/zend_config.w32.h
+++ b/Zend/zend_config.w32.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_CONFIG_W32_H
#define ZEND_CONFIG_W32_H
@@ -58,19 +56,14 @@ typedef unsigned int uint;
#define zend_sprintf sprintf
+#ifndef __cplusplus
/* This will cause the compilation process to be MUCH longer, but will generate
* a much quicker PHP binary
*/
#ifdef ZEND_WIN32_FORCE_INLINE
-/* _ALLOW_KEYWORD_MACROS is only relevant for C++ */
-# ifndef _ALLOW_KEYWORD_MACROS
-# define _ALLOW_KEYWORD_MACROS
-# endif
# undef inline
# define inline __forceinline
-#elif !defined(ZEND_WIN32_KEEP_INLINE)
-# undef inline
-# define inline
+#endif
#endif
#ifdef LIBZEND_EXPORTS
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index 64265d3c19..e2a945c746 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_constants.h"
#include "zend_exceptions.h"
@@ -28,37 +26,46 @@
#include "zend_globals.h"
#include "zend_API.h"
+/* Protection from recursive self-referencing class constants */
+#define IS_CONSTANT_VISITED_MARK 0x80
+
+#define IS_CONSTANT_VISITED(zv) (Z_ACCESS_FLAGS_P(zv) & IS_CONSTANT_VISITED_MARK)
+#define MARK_CONSTANT_VISITED(zv) Z_ACCESS_FLAGS_P(zv) |= IS_CONSTANT_VISITED_MARK
+#define RESET_CONSTANT_VISITED(zv) Z_ACCESS_FLAGS_P(zv) &= ~IS_CONSTANT_VISITED_MARK
+
void free_zend_constant(zval *zv)
{
zend_constant *c = Z_PTR_P(zv);
- if (!(c->flags & CONST_PERSISTENT)) {
- zval_ptr_dtor(&c->value);
+ if (!(ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT)) {
+ zval_ptr_dtor_nogc(&c->value);
+ if (c->name) {
+ zend_string_release_ex(c->name, 0);
+ }
+ efree(c);
} else {
- zval_internal_dtor(&c->value);
- }
- if (c->name) {
- zend_string_release(c->name);
+ zval_internal_ptr_dtor(&c->value);
+ if (c->name) {
+ zend_string_release_ex(c->name, 1);
+ }
+ free(c);
}
- pefree(c, c->flags & CONST_PERSISTENT);
}
+#ifdef ZTS
static void copy_zend_constant(zval *zv)
{
zend_constant *c = Z_PTR_P(zv);
- Z_PTR_P(zv) = pemalloc(sizeof(zend_constant), c->flags & CONST_PERSISTENT);
+ ZEND_ASSERT(ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
+ Z_PTR_P(zv) = pemalloc(sizeof(zend_constant), 1);
memcpy(Z_PTR_P(zv), c, sizeof(zend_constant));
c = Z_PTR_P(zv);
c->name = zend_string_copy(c->name);
- if (!(c->flags & CONST_PERSISTENT)) {
- zval_copy_ctor(&c->value);
- } else {
- if (Z_TYPE(c->value) == IS_STRING) {
- Z_STR(c->value) = zend_string_dup(Z_STR(c->value), 1);
- }
+ if (Z_TYPE(c->value) == IS_STRING) {
+ Z_STR(c->value) = zend_string_dup(Z_STR(c->value), 1);
}
}
@@ -67,6 +74,7 @@ void zend_copy_constants(HashTable *target, HashTable *source)
{
zend_hash_copy(target, source, copy_zend_constant);
}
+#endif
static int clean_module_constant(zval *el, void *arg)
@@ -74,7 +82,7 @@ static int clean_module_constant(zval *el, void *arg)
zend_constant *c = (zend_constant *)Z_PTR_P(el);
int module_number = *(int *)arg;
- if (c->module_number == module_number) {
+ if (ZEND_CONSTANT_MODULE_NUMBER(c) == module_number) {
return 1;
} else {
return 0;
@@ -143,9 +151,8 @@ ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int
zend_constant c;
ZVAL_NULL(&c.value);
- c.flags = flags;
- c.name = zend_string_init(name, name_len, flags & CONST_PERSISTENT);
- c.module_number = module_number;
+ ZEND_CONSTANT_SET_FLAGS(&c, flags, module_number);
+ c.name = zend_string_init_interned(name, name_len, flags & CONST_PERSISTENT);
zend_register_constant(&c);
}
@@ -154,9 +161,8 @@ ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, zen
zend_constant c;
ZVAL_BOOL(&c.value, bval);
- c.flags = flags;
- c.name = zend_string_init(name, name_len, flags & CONST_PERSISTENT);
- c.module_number = module_number;
+ ZEND_CONSTANT_SET_FLAGS(&c, flags, module_number);
+ c.name = zend_string_init_interned(name, name_len, flags & CONST_PERSISTENT);
zend_register_constant(&c);
}
@@ -165,9 +171,8 @@ ZEND_API void zend_register_long_constant(const char *name, size_t name_len, zen
zend_constant c;
ZVAL_LONG(&c.value, lval);
- c.flags = flags;
- c.name = zend_string_init(name, name_len, flags & CONST_PERSISTENT);
- c.module_number = module_number;
+ ZEND_CONSTANT_SET_FLAGS(&c, flags, module_number);
+ c.name = zend_string_init_interned(name, name_len, flags & CONST_PERSISTENT);
zend_register_constant(&c);
}
@@ -177,9 +182,8 @@ ZEND_API void zend_register_double_constant(const char *name, size_t name_len, d
zend_constant c;
ZVAL_DOUBLE(&c.value, dval);
- c.flags = flags;
- c.name = zend_string_init(name, name_len, flags & CONST_PERSISTENT);
- c.module_number = module_number;
+ ZEND_CONSTANT_SET_FLAGS(&c, flags, module_number);
+ c.name = zend_string_init_interned(name, name_len, flags & CONST_PERSISTENT);
zend_register_constant(&c);
}
@@ -188,10 +192,9 @@ ZEND_API void zend_register_stringl_constant(const char *name, size_t name_len,
{
zend_constant c;
- ZVAL_NEW_STR(&c.value, zend_string_init(strval, strlen, flags & CONST_PERSISTENT));
- c.flags = flags;
- c.name = zend_string_init(name, name_len, flags & CONST_PERSISTENT);
- c.module_number = module_number;
+ ZVAL_STR(&c.value, zend_string_init_interned(strval, strlen, flags & CONST_PERSISTENT));
+ ZEND_CONSTANT_SET_FLAGS(&c, flags, module_number);
+ c.name = zend_string_init_interned(name, name_len, flags & CONST_PERSISTENT);
zend_register_constant(&c);
}
@@ -204,7 +207,7 @@ ZEND_API void zend_register_string_constant(const char *name, size_t name_len, c
static zend_constant *zend_get_special_constant(const char *name, size_t name_len)
{
zend_constant *c;
- static char haltoff[] = "__COMPILER_HALT_OFFSET__";
+ static const char haltoff[] = "__COMPILER_HALT_OFFSET__";
if (!EG(current_execute_data)) {
return NULL;
@@ -220,7 +223,7 @@ static zend_constant *zend_get_special_constant(const char *name, size_t name_le
haltname = zend_mangle_property_name(haltoff,
sizeof("__COMPILER_HALT_OFFSET__") - 1, cfilename, clen, 0);
c = zend_hash_find_ptr(EG(zend_constants), haltname);
- zend_string_free(haltname);
+ zend_string_efree(haltname);
return c;
} else {
return NULL;
@@ -240,7 +243,7 @@ ZEND_API int zend_verify_const_access(zend_class_constant *c, zend_class_entry *
}
/* }}} */
-ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len)
+static inline zend_constant *zend_get_constant_str_impl(const char *name, size_t name_len)
{
zend_constant *c;
ALLOCA_FLAG(use_heap)
@@ -249,7 +252,7 @@ ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len)
char *lcname = do_alloca(name_len + 1, use_heap);
zend_str_tolower_copy(lcname, name, name_len);
if ((c = zend_hash_str_find_ptr(EG(zend_constants), lcname, name_len)) != NULL) {
- if (c->flags & CONST_CS) {
+ if (ZEND_CONSTANT_FLAGS(c) & CONST_CS) {
c = NULL;
}
} else {
@@ -258,30 +261,64 @@ ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len)
free_alloca(lcname, use_heap);
}
+ return c;
+}
+
+ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len)
+{
+ zend_constant *c = zend_get_constant_str_impl(name, name_len);
return c ? &c->value : NULL;
}
-ZEND_API zval *zend_get_constant(zend_string *name)
+static inline zend_constant *zend_get_constant_impl(zend_string *name)
{
+ zval *zv;
zend_constant *c;
ALLOCA_FLAG(use_heap)
- if ((c = zend_hash_find_ptr(EG(zend_constants), name)) == NULL) {
+ zv = zend_hash_find(EG(zend_constants), name);
+ if (zv == NULL) {
char *lcname = do_alloca(ZSTR_LEN(name) + 1, use_heap);
zend_str_tolower_copy(lcname, ZSTR_VAL(name), ZSTR_LEN(name));
- if ((c = zend_hash_str_find_ptr(EG(zend_constants), lcname, ZSTR_LEN(name))) != NULL) {
- if (c->flags & CONST_CS) {
+ zv = zend_hash_str_find(EG(zend_constants), lcname, ZSTR_LEN(name));
+ if (zv != NULL) {
+ c = Z_PTR_P(zv);
+ if (ZEND_CONSTANT_FLAGS(c) & CONST_CS) {
c = NULL;
}
} else {
c = zend_get_special_constant(ZSTR_VAL(name), ZSTR_LEN(name));
}
free_alloca(lcname, use_heap);
+ return c;
+ } else {
+ return (zend_constant *) Z_PTR_P(zv);
}
+}
+ZEND_API zval *zend_get_constant(zend_string *name)
+{
+ zend_constant *c = zend_get_constant_impl(name);
return c ? &c->value : NULL;
}
+static zend_bool is_access_deprecated(const zend_constant *c, const char *access_name) {
+ const char *ns_sep = zend_memrchr(ZSTR_VAL(c->name), '\\', ZSTR_LEN(c->name));
+ if (ns_sep) {
+ /* Namespaces are always case-insensitive. Only compare shortname. */
+ size_t shortname_offset = ns_sep - ZSTR_VAL(c->name) + 1;
+ size_t shortname_len = ZSTR_LEN(c->name) - shortname_offset;
+ return memcmp(
+ access_name + shortname_offset,
+ ZSTR_VAL(c->name) + shortname_offset,
+ shortname_len
+ ) != 0;
+ } else {
+ /* No namespace, compare whole name */
+ return memcmp(access_name, ZSTR_VAL(c->name), ZSTR_LEN(c->name)) != 0;
+ }
+}
+
ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope, uint32_t flags)
{
zend_constant *c;
@@ -350,25 +387,27 @@ ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope,
}
}
- if (ret_constant && Z_CONSTANT_P(ret_constant)) {
- if (Z_TYPE_P(ret_constant) == IS_CONSTANT_AST) {
- if (IS_CONSTANT_VISITED(ret_constant)) {
- zend_throw_error(NULL, "Cannot declare self-referencing constant '%s::%s'", ZSTR_VAL(class_name), ZSTR_VAL(constant_name));
- ret_constant = NULL;
- goto failure;
- }
- MARK_CONSTANT_VISITED(ret_constant);
- }
- if (UNEXPECTED(zval_update_constant_ex(ret_constant, c->ce) != SUCCESS)) {
- RESET_CONSTANT_VISITED(ret_constant);
+ if (ret_constant && Z_TYPE_P(ret_constant) == IS_CONSTANT_AST) {
+ int ret;
+
+ if (IS_CONSTANT_VISITED(ret_constant)) {
+ zend_throw_error(NULL, "Cannot declare self-referencing constant '%s::%s'", ZSTR_VAL(class_name), ZSTR_VAL(constant_name));
ret_constant = NULL;
goto failure;
}
+
+ MARK_CONSTANT_VISITED(ret_constant);
+ ret = zval_update_constant_ex(ret_constant, c->ce);
RESET_CONSTANT_VISITED(ret_constant);
+
+ if (UNEXPECTED(ret != SUCCESS)) {
+ ret_constant = NULL;
+ goto failure;
+ }
}
failure:
- zend_string_release(class_name);
- zend_string_free(constant_name);
+ zend_string_release_ex(class_name, 0);
+ zend_string_efree(constant_name);
return ret_constant;
}
@@ -394,66 +433,55 @@ failure:
/* try lowercase */
zend_str_tolower(lcname + prefix_len + 1, const_name_len);
if ((c = zend_hash_str_find_ptr(EG(zend_constants), lcname, lcname_len)) != NULL) {
- if ((c->flags & CONST_CS) != 0) {
+ if ((ZEND_CONSTANT_FLAGS(c) & CONST_CS) != 0) {
c = NULL;
}
}
}
free_alloca(lcname, use_heap);
- if (c) {
- return &c->value;
+
+ if (!c) {
+ if (!(flags & IS_CONSTANT_UNQUALIFIED)) {
+ return NULL;
+ }
+
+ /* name requires runtime resolution, need to check non-namespaced name */
+ c = zend_get_constant_str_impl(constant_name, const_name_len);
+ name = constant_name;
}
- /* name requires runtime resolution, need to check non-namespaced name */
- if ((flags & IS_CONSTANT_UNQUALIFIED) != 0) {
- return zend_get_constant_str(constant_name, const_name_len);
+ } else {
+ if (cname) {
+ c = zend_get_constant_impl(cname);
+ } else {
+ c = zend_get_constant_str_impl(name, name_len);
}
- return NULL;
}
- if (cname) {
- return zend_get_constant(cname);
- } else {
- return zend_get_constant_str(name, name_len);
+ if (!c) {
+ return NULL;
}
-}
-ZEND_API zend_constant* ZEND_FASTCALL zend_quick_get_constant(const zval *key, uint32_t flags)
-{
- zend_constant *c;
-
- if ((c = zend_hash_find_ptr(EG(zend_constants), Z_STR_P(key))) == NULL) {
- key++;
- if ((c = zend_hash_find_ptr(EG(zend_constants), Z_STR_P(key))) == NULL ||
- (c->flags & CONST_CS) != 0) {
- if ((flags & (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) == (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) {
- key++;
- if ((c = zend_hash_find_ptr(EG(zend_constants), Z_STR_P(key))) == NULL) {
- key++;
- if ((c = zend_hash_find_ptr(EG(zend_constants), Z_STR_P(key))) == NULL ||
- (c->flags & CONST_CS) != 0) {
-
- key--;
- c = NULL;
- }
- }
- } else {
- key--;
- c = NULL;
- }
+ if (!(flags & ZEND_GET_CONSTANT_NO_DEPRECATION_CHECK)) {
+ if (!(ZEND_CONSTANT_FLAGS(c) & (CONST_CS|CONST_CT_SUBST)) && is_access_deprecated(c, name)) {
+ zend_error(E_DEPRECATED,
+ "Case-insensitive constants are deprecated. "
+ "The correct casing for this constant is \"%s\"",
+ ZSTR_VAL(c->name));
}
}
- return c;
+
+ return &c->value;
}
static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_constant *c)
{
void *ret;
- zend_constant *copy = pemalloc(sizeof(zend_constant), c->flags & CONST_PERSISTENT);
+ zend_constant *copy = pemalloc(sizeof(zend_constant), ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
memcpy(copy, c, sizeof(zend_constant));
ret = zend_hash_add_ptr(ht, key, copy);
if (!ret) {
- pefree(copy, c->flags & CONST_PERSISTENT);
+ pefree(copy, ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
}
return ret;
}
@@ -468,19 +496,14 @@ ZEND_API int zend_register_constant(zend_constant *c)
printf("Registering constant for module %d\n", c->module_number);
#endif
- if (c->module_number != PHP_USER_CONSTANT) {
- c->name = zend_new_interned_string(c->name);
- }
-
- if (!(c->flags & CONST_CS)) {
- lowercase_name = zend_string_alloc(ZSTR_LEN(c->name), c->flags & CONST_PERSISTENT);
- zend_str_tolower_copy(ZSTR_VAL(lowercase_name), ZSTR_VAL(c->name), ZSTR_LEN(c->name));
+ if (!(ZEND_CONSTANT_FLAGS(c) & CONST_CS)) {
+ lowercase_name = zend_string_tolower_ex(c->name, ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
lowercase_name = zend_new_interned_string(lowercase_name);
name = lowercase_name;
} else {
char *slash = strrchr(ZSTR_VAL(c->name), '\\');
if (slash) {
- lowercase_name = zend_string_init(ZSTR_VAL(c->name), ZSTR_LEN(c->name), c->flags & CONST_PERSISTENT);
+ lowercase_name = zend_string_init(ZSTR_VAL(c->name), ZSTR_LEN(c->name), ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
zend_str_tolower(ZSTR_VAL(lowercase_name), slash - ZSTR_VAL(c->name));
lowercase_name = zend_new_interned_string(lowercase_name);
name = lowercase_name;
@@ -490,8 +513,7 @@ ZEND_API int zend_register_constant(zend_constant *c)
}
/* Check if the user is trying to define the internal pseudo constant name __COMPILER_HALT_OFFSET__ */
- if ((ZSTR_LEN(c->name) == sizeof("__COMPILER_HALT_OFFSET__")-1
- && !memcmp(ZSTR_VAL(name), "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__")-1))
+ if (zend_string_equals_literal(name, "__COMPILER_HALT_OFFSET__")
|| zend_hash_add_constant(EG(zend_constants), name, c) == NULL) {
/* The internal __COMPILER_HALT_OFFSET__ is prefixed by NULL byte */
@@ -500,8 +522,8 @@ ZEND_API int zend_register_constant(zend_constant *c)
}
zend_error(E_NOTICE,"Constant %s already defined", ZSTR_VAL(name));
zend_string_release(c->name);
- if (!(c->flags & CONST_PERSISTENT)) {
- zval_dtor(&c->value);
+ if (!(ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT)) {
+ zval_ptr_dtor_nogc(&c->value);
}
ret = FAILURE;
}
diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h
index bbe2a4ce5c..d4499e09f3 100644
--- a/Zend/zend_constants.h
+++ b/Zend/zend_constants.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_CONSTANTS_H
#define ZEND_CONSTANTS_H
@@ -27,16 +25,29 @@
#define CONST_CS (1<<0) /* Case Sensitive */
#define CONST_PERSISTENT (1<<1) /* Persistent */
#define CONST_CT_SUBST (1<<2) /* Allow compile-time substitution */
+#define CONST_NO_FILE_CACHE (1<<3) /* Can't be saved in file cache */
+
+#define PHP_USER_CONSTANT 0x7fffff /* a constant defined in user space */
-#define PHP_USER_CONSTANT INT_MAX /* a constant defined in user space */
+/* Flag for zend_get_constant_ex(). Must not class with ZEND_FETCH_CLASS_* flags. */
+#define ZEND_GET_CONSTANT_NO_DEPRECATION_CHECK 0x1000
typedef struct _zend_constant {
zval value;
zend_string *name;
- int flags;
- int module_number;
} zend_constant;
+#define ZEND_CONSTANT_FLAGS(c) \
+ (Z_CONSTANT_FLAGS((c)->value) & 0xff)
+
+#define ZEND_CONSTANT_MODULE_NUMBER(c) \
+ (Z_CONSTANT_FLAGS((c)->value) >> 8)
+
+#define ZEND_CONSTANT_SET_FLAGS(c, _flags, _module_number) do { \
+ Z_CONSTANT_FLAGS((c)->value) = \
+ ((_flags) & 0xff) | ((_module_number) << 8); \
+ } while (0)
+
#define REGISTER_NULL_CONSTANT(name, flags) zend_register_null_constant((name), sizeof(name)-1, (flags), module_number)
#define REGISTER_BOOL_CONSTANT(name, bval, flags) zend_register_bool_constant((name), sizeof(name)-1, (bval), (flags), module_number)
#define REGISTER_LONG_CONSTANT(name, lval, flags) zend_register_long_constant((name), sizeof(name)-1, (lval), (flags), module_number)
@@ -75,8 +86,9 @@ ZEND_API void zend_register_double_constant(const char *name, size_t name_len, d
ZEND_API void zend_register_string_constant(const char *name, size_t name_len, char *strval, int flags, int module_number);
ZEND_API void zend_register_stringl_constant(const char *name, size_t name_len, char *strval, size_t strlen, int flags, int module_number);
ZEND_API int zend_register_constant(zend_constant *c);
+#ifdef ZTS
void zend_copy_constants(HashTable *target, HashTable *sourc);
-ZEND_API zend_constant* ZEND_FASTCALL zend_quick_get_constant(const zval *key, uint32_t flags);
+#endif
END_EXTERN_C()
#define ZEND_CONSTANT_DTOR free_zend_constant
diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c
new file mode 100644
index 0000000000..4cbd2ac776
--- /dev/null
+++ b/Zend/zend_cpuinfo.c
@@ -0,0 +1,117 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Xinchen Hui <xinchen.h@zend.com> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend_cpuinfo.h"
+
+typedef struct _zend_cpu_info {
+ uint32_t eax;
+ uint32_t ebx;
+ uint32_t ecx;
+ uint32_t edx;
+ uint32_t initialized;
+} zend_cpu_info;
+
+static zend_cpu_info cpuinfo = {0};
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+# if defined(HAVE_CPUID_H) && defined(HAVE_CPUID_COUNT)
+# include <cpuid.h>
+static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
+ __cpuid_count(func, subfunc, cpuinfo->eax, cpuinfo->ebx, cpuinfo->ecx, cpuinfo->edx);
+}
+# else
+static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
+#if defined(__i386__) && (defined(__pic__) || defined(__PIC__))
+ /* PIC on i386 uses %ebx, so preserve it. */
+ __asm__ __volatile__ (
+ "pushl %%ebx\n"
+ "cpuid\n"
+ "mov %%ebx,%1\n"
+ "popl %%ebx"
+ : "=a"(cpuinfo->eax), "=r"(cpuinfo->ebx), "=c"(cpuinfo->ecx), "=d"(cpuinfo->edx)
+ : "a"(func), "c"(subfunc)
+ );
+#else
+ __asm__ __volatile__ (
+ "cpuid"
+ : "=a"(cpuinfo->eax), "=b"(cpuinfo->ebx), "=c"(cpuinfo->ecx), "=d"(cpuinfo->edx)
+ : "a"(func), "c"(subfunc)
+ );
+#endif
+}
+# endif
+#elif defined(ZEND_WIN32) && !defined(__clang__)
+# include <intrin.h>
+static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
+ int regs[4];
+
+ __cpuidex(regs, func, subfunc);
+
+ cpuinfo->eax = regs[0];
+ cpuinfo->ebx = regs[1];
+ cpuinfo->ecx = regs[2];
+ cpuinfo->edx = regs[3];
+}
+#else
+static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
+ cpuinfo->eax = 0;
+}
+#endif
+
+void zend_cpu_startup(void)
+{
+ if (!cpuinfo.initialized) {
+ zend_cpu_info ebx;
+ int max_feature;
+
+ cpuinfo.initialized = 1;
+ __zend_cpuid(0, 0, &cpuinfo);
+ max_feature = cpuinfo.eax;
+ if (max_feature == 0) {
+ return;
+ }
+
+ __zend_cpuid(1, 0, &cpuinfo);
+
+ /* for avx2 */
+ if (max_feature >= 7) {
+ __zend_cpuid(7, 0, &ebx);
+ cpuinfo.ebx = ebx.ebx;
+ } else {
+ cpuinfo.ebx = 0;
+ }
+ }
+}
+
+ZEND_API int zend_cpu_supports(zend_cpu_feature feature) {
+ if (feature & ZEND_CPU_EDX_MASK) {
+ return (cpuinfo.edx & (feature & ~ZEND_CPU_EDX_MASK));
+ } else if (feature & ZEND_CPU_EBX_MASK) {
+ return (cpuinfo.ebx & (feature & ~ZEND_CPU_EBX_MASK));
+ } else {
+ return (cpuinfo.ecx & feature);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h
new file mode 100644
index 0000000000..2cd9626d11
--- /dev/null
+++ b/Zend/zend_cpuinfo.h
@@ -0,0 +1,213 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Xinchen Hui <xinchen.h@zend.com> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_CPU_INFO_H
+#define ZEND_CPU_INFO_H
+
+#include "zend.h"
+
+#define ZEND_CPU_EBX_MASK (1<<30)
+#define ZEND_CPU_EDX_MASK (1<<31)
+
+typedef enum _zend_cpu_feature {
+ /* ECX */
+ ZEND_CPU_FEATURE_SSE3 = (1<<0),
+ ZEND_CPU_FEATURE_PCLMULQDQ = (1<<1),
+ ZEND_CPU_FEATURE_DTES64 = (1<<2),
+ ZEND_CPU_FEATURE_MONITOR = (1<<3),
+ ZEND_CPU_FEATURE_DSCPL = (1<<4),
+ ZEND_CPU_FEATURE_VMX = (1<<5),
+ ZEND_CPU_FEATURE_SMX = (1<<6),
+ ZEND_CPU_FEATURE_EST = (1<<7),
+ ZEND_CPU_FEATURE_TM2 = (1<<8),
+ ZEND_CPU_FEATURE_SSSE3 = (1<<9),
+ ZEND_CPU_FEATURE_CID = (1<<10),
+ ZEND_CPU_FEATURE_SDBG = (1<<11),
+ ZEND_CPU_FEATURE_FMA = (1<<12),
+ ZEND_CPU_FEATURE_CX16 = (1<<13),
+ ZEND_CPU_FEATURE_XTPR = (1<<14),
+ ZEND_CPU_FEATURE_PDCM = (1<<15),
+ /* reserved = (1<<16),*/
+ ZEND_CPU_FEATURE_PCID = (1<<17),
+ ZEND_CPU_FEATURE_DCA = (1<<18),
+ ZEND_CPU_FEATURE_SSE41 = (1<<19),
+ ZEND_CPU_FEATURE_SSE42 = (1<<20),
+ ZEND_CPU_FEATURE_X2APIC = (1<<21),
+ ZEND_CPU_FEATURE_MOVBE = (1<<22),
+ ZEND_CPU_FEATURE_POPCNT = (1<<23),
+ ZEND_CPU_FEATURE_TSC_DEADLINE = (1<<24),
+ ZEND_CPU_FEATURE_AES = (1<<25),
+ ZEND_CPU_FEATURE_XSAVE = (1<<26),
+ ZEND_CPU_FEATURE_OSXSAVE = (1<<27) ,
+ ZEND_CPU_FEATURE_AVX = (1<<28),
+ ZEND_CPU_FEATURE_F16C = (1<<29),
+ /* intentionally don't support = (1<<30) */
+ /* intentionally don't support = (1<<31) */
+
+ /* EBX */
+ ZEND_CPU_FEATURE_AVX2 = (1<<5 | ZEND_CPU_EBX_MASK),
+
+ /* EDX */
+ ZEND_CPU_FEATURE_FPU = (1<<0 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_VME = (1<<1 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_DE = (1<<2 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PSE = (1<<3 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_TSC = (1<<4 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MSR = (1<<5 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PAE = (1<<6 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MCE = (1<<7 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CX8 = (1<<8 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_APIC = (1<<9 | ZEND_CPU_EDX_MASK),
+ /* reserved = (1<<10 | ZEND_CPU_EDX_MASK),*/
+ ZEND_CPU_FEATURE_SEP = (1<<11 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MTRR = (1<<12 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PGE = (1<<13 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MCA = (1<<14 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CMOV = (1<<15 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PAT = (1<<16 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PSE36 = (1<<17 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PN = (1<<18 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CLFLUSH = (1<<19 | ZEND_CPU_EDX_MASK),
+ /* reserved = (1<<20 | ZEND_CPU_EDX_MASK),*/
+ ZEND_CPU_FEATURE_DS = (1<<21 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_ACPI = (1<<22 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MMX = (1<<23 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_FXSR = (1<<24 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SSE = (1<<25 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SSE2 = (1<<26 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SS = (1<<27 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_HT = (1<<28 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_TM = (1<<29 | ZEND_CPU_EDX_MASK)
+ /*intentionally don't support = (1<<30 | ZEND_CPU_EDX_MASK)*/
+ /*intentionally don't support = (1<<31 | ZEND_CPU_EDX_MASK)*/
+} zend_cpu_feature;
+
+void zend_cpu_startup();
+ZEND_API int zend_cpu_supports(zend_cpu_feature feature);
+
+/* Address sanitizer is incompatible with ifunc resolvers, so exclude the
+ * CPU support helpers from asan.
+ * See also https://github.com/google/sanitizers/issues/342. */
+#if __has_attribute(no_sanitize_address)
+# define ZEND_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
+#else
+# define ZEND_NO_SANITIZE_ADDRESS
+#endif
+
+#if PHP_HAVE_BUILTIN_CPU_SUPPORTS
+/* NOTE: you should use following inline function in
+ * resolver functions (ifunc), as it could be called
+ * before all PLT symbols are resloved. in other words,
+ * resolver functions should not depends any external
+ * functions */
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_sse2() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("sse2");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_sse3() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("sse3");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_ssse3() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("ssse3");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_sse41() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("sse4.1");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_sse42() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("sse4.2");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_avx() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("avx");
+}
+
+ZEND_NO_SANITIZE_ADDRESS
+static zend_always_inline int zend_cpu_supports_avx2() {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+ __builtin_cpu_init();
+#endif
+ return __builtin_cpu_supports("avx2");
+}
+#else
+
+static zend_always_inline int zend_cpu_supports_sse2() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE2);
+}
+
+static zend_always_inline int zend_cpu_supports_sse3() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE3);
+}
+
+static zend_always_inline int zend_cpu_supports_ssse3() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSSE3);
+}
+
+static zend_always_inline int zend_cpu_supports_sse41() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE41);
+}
+
+static zend_always_inline int zend_cpu_supports_sse42() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE42);
+}
+
+static zend_always_inline int zend_cpu_supports_avx() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_AVX);
+}
+
+static zend_always_inline int zend_cpu_supports_avx2() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_AVX2);
+}
+
+#endif
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c
index a3e1cd69d8..47da7ad5f3 100644
--- a/Zend/zend_default_classes.c
+++ b/Zend/zend_default_classes.c
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_builtin_functions.h"
diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c
index 79c963492a..f49750e453 100644
--- a/Zend/zend_dtrace.c
+++ b/Zend/zend_dtrace.c
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id: $ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_dtrace.h"
diff --git a/Zend/zend_dtrace.d b/Zend/zend_dtrace.d
index 609663f4b1..5e659741e2 100644
--- a/Zend/zend_dtrace.d
+++ b/Zend/zend_dtrace.d
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id: $ */
-
provider php {
probe exception__caught(char *classname);
probe exception__thrown(char* classname);
diff --git a/Zend/zend_dtrace.h b/Zend/zend_dtrace.h
index d1dbc49fd4..793d27b75e 100644
--- a/Zend/zend_dtrace.h
+++ b/Zend/zend_dtrace.h
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id: $ */
-
#ifndef _ZEND_DTRACE_H
#define _ZEND_DTRACE_H
diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h
index 03eec39237..8fa82623e1 100644
--- a/Zend/zend_errors.h
+++ b/Zend/zend_errors.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_ERRORS_H
#define ZEND_ERRORS_H
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index 486a5d3908..3ad5748e4d 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -12,15 +12,13 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
| Marcus Boerger <helly@php.net> |
| Sterling Hughes <sterling@php.net> |
- | Zeev Suraski <zeev@zend.com> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_builtin_functions.h"
@@ -34,6 +32,7 @@ ZEND_API zend_class_entry *zend_ce_throwable;
ZEND_API zend_class_entry *zend_ce_exception;
ZEND_API zend_class_entry *zend_ce_error_exception;
ZEND_API zend_class_entry *zend_ce_error;
+ZEND_API zend_class_entry *zend_ce_compile_error;
ZEND_API zend_class_entry *zend_ce_parse_error;
ZEND_API zend_class_entry *zend_ce_type_error;
ZEND_API zend_class_entry *zend_ce_argument_count_error;
@@ -100,7 +99,7 @@ void zend_exception_set_previous(zend_object *exception, zend_object *add_previo
previous = zend_read_property_ex(base_ce, ex, ZSTR_KNOWN(ZEND_STR_PREVIOUS), 1, &rv);
if (Z_TYPE_P(previous) == IS_NULL) {
zend_update_property_ex(base_ce, ex, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &pv);
- GC_REFCOUNT(add_previous)--;
+ GC_DELREF(add_previous);
return;
}
ex = previous;
@@ -154,7 +153,7 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zval *exception) /* {{{ */
}
}
if (!EG(current_execute_data)) {
- if (exception && Z_OBJCE_P(exception) == zend_ce_parse_error) {
+ if (exception && (Z_OBJCE_P(exception) == zend_ce_parse_error || Z_OBJCE_P(exception) == zend_ce_compile_error)) {
return;
}
if(EG(exception)) {
@@ -221,7 +220,8 @@ static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type,
base_ce = i_get_exception_base(&obj);
- if (EXPECTED(class_type != zend_ce_parse_error || !(filename = zend_get_compiled_filename()))) {
+ if (EXPECTED((class_type != zend_ce_parse_error && class_type != zend_ce_compile_error)
+ || !(filename = zend_get_compiled_filename()))) {
ZVAL_STRING(&tmp, zend_get_executed_filename());
zend_update_property_ex(base_ce, &obj, ZSTR_KNOWN(ZEND_STR_FILE), &tmp);
zval_ptr_dtor(&tmp);
@@ -334,13 +334,12 @@ ZEND_METHOD(exception, __wakeup)
ErrorException constructor */
ZEND_METHOD(error_exception, __construct)
{
- char *message = NULL, *filename = NULL;
+ zend_string *message = NULL, *filename = NULL;
zend_long code = 0, severity = E_ERROR, lineno;
zval tmp, *object, *previous = NULL;
int argc = ZEND_NUM_ARGS();
- size_t message_len, filename_len;
- if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|sllslO!", &message, &message_len, &code, &severity, &filename, &filename_len, &lineno, &previous, zend_ce_throwable) == FAILURE) {
+ if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|SllSlO!", &message, &code, &severity, &filename, &lineno, &previous, zend_ce_throwable) == FAILURE) {
zend_class_entry *ce;
if (Z_TYPE(EX(This)) == IS_OBJECT) {
@@ -357,7 +356,7 @@ ZEND_METHOD(error_exception, __construct)
object = getThis();
if (message) {
- ZVAL_STRING(&tmp, message);
+ ZVAL_STR_COPY(&tmp, message);
zend_update_property_ex(zend_ce_exception, object, ZSTR_KNOWN(ZEND_STR_MESSAGE), &tmp);
zval_ptr_dtor(&tmp);
}
@@ -375,7 +374,7 @@ ZEND_METHOD(error_exception, __construct)
zend_update_property_ex(zend_ce_exception, object, ZSTR_KNOWN(ZEND_STR_SEVERITY), &tmp);
if (argc >= 4) {
- ZVAL_STRING(&tmp, filename);
+ ZVAL_STR_COPY(&tmp, filename);
zend_update_property_ex(zend_ce_exception, object, ZSTR_KNOWN(ZEND_STR_FILE), &tmp);
zval_ptr_dtor(&tmp);
if (argc < 5) {
@@ -544,7 +543,7 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
smart_str_appends(str, "Object(");
smart_str_appends(str, ZSTR_VAL(class_name));
smart_str_appends(str, "), ");
- zend_string_release(class_name);
+ zend_string_release_ex(class_name, 0);
break;
}
}
@@ -559,14 +558,14 @@ static void _build_trace_string(smart_str *str, HashTable *ht, uint32_t num) /*
smart_str_append_long(str, num);
smart_str_appendc(str, ' ');
- file = zend_hash_find(ht, ZSTR_KNOWN(ZEND_STR_FILE));
+ file = zend_hash_find_ex(ht, ZSTR_KNOWN(ZEND_STR_FILE), 1);
if (file) {
if (Z_TYPE_P(file) != IS_STRING) {
zend_error(E_WARNING, "Function name is no string");
smart_str_appends(str, "[unknown function]");
} else{
zend_long line;
- tmp = zend_hash_find(ht, ZSTR_KNOWN(ZEND_STR_LINE));
+ tmp = zend_hash_find_ex(ht, ZSTR_KNOWN(ZEND_STR_LINE), 1);
if (tmp) {
if (Z_TYPE_P(tmp) == IS_LONG) {
line = Z_LVAL_P(tmp);
@@ -589,7 +588,7 @@ static void _build_trace_string(smart_str *str, HashTable *ht, uint32_t num) /*
TRACE_APPEND_KEY(ZSTR_KNOWN(ZEND_STR_TYPE));
TRACE_APPEND_KEY(ZSTR_KNOWN(ZEND_STR_FUNCTION));
smart_str_appendc(str, '(');
- tmp = zend_hash_find(ht, ZSTR_KNOWN(ZEND_STR_ARGS));
+ tmp = zend_hash_find_ex(ht, ZSTR_KNOWN(ZEND_STR_ARGS), 1);
if (tmp) {
if (Z_TYPE_P(tmp) == IS_ARRAY) {
size_t last_len = ZSTR_LEN(str->s);
@@ -700,7 +699,7 @@ ZEND_METHOD(exception, __toString)
if ((Z_OBJCE_P(exception) == zend_ce_type_error || Z_OBJCE_P(exception) == zend_ce_argument_count_error) && strstr(ZSTR_VAL(message), ", called in ")) {
zend_string *real_message = zend_strpprintf(0, "%s and defined", ZSTR_VAL(message));
- zend_string_release(message);
+ zend_string_release_ex(message, 0);
message = real_message;
}
@@ -718,24 +717,24 @@ ZEND_METHOD(exception, __toString)
ZSTR_LEN(prev_str) ? "\n\nNext " : "", ZSTR_VAL(prev_str));
}
- zend_string_release(prev_str);
- zend_string_release(message);
- zend_string_release(file);
+ zend_string_release_ex(prev_str, 0);
+ zend_string_release_ex(message, 0);
+ zend_string_release_ex(file, 0);
zval_ptr_dtor(&trace);
- Z_OBJPROP_P(exception)->u.v.nApplyCount++;
+ Z_PROTECT_RECURSION_P(exception);
exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
- if (exception && Z_TYPE_P(exception) == IS_OBJECT && Z_OBJPROP_P(exception)->u.v.nApplyCount > 0) {
+ if (exception && Z_TYPE_P(exception) == IS_OBJECT && Z_IS_RECURSIVE_P(exception)) {
break;
}
}
- zend_string_release(fname);
+ zend_string_release_ex(fname, 0);
exception = getThis();
/* Reset apply counts */
while (exception && Z_TYPE_P(exception) == IS_OBJECT && (base_ce = i_get_exception_base(exception)) && instanceof_function(Z_OBJCE_P(exception), base_ce)) {
- if (Z_OBJPROP_P(exception)->u.v.nApplyCount) {
- Z_OBJPROP_P(exception)->u.v.nApplyCount--;
+ if (Z_IS_RECURSIVE_P(exception)) {
+ Z_UNPROTECT_RECURSION_P(exception);
} else {
break;
}
@@ -755,7 +754,7 @@ ZEND_METHOD(exception, __toString)
/* }}} */
/** {{{ Throwable method definition */
-const zend_function_entry zend_funcs_throwable[] = {
+static const zend_function_entry zend_funcs_throwable[] = {
ZEND_ABSTRACT_ME(throwable, getMessage, NULL)
ZEND_ABSTRACT_ME(throwable, getCode, NULL)
ZEND_ABSTRACT_ME(throwable, getFile, NULL)
@@ -821,7 +820,7 @@ void zend_register_default_exception(void) /* {{{ */
REGISTER_MAGIC_INTERFACE(throwable, Throwable);
- memcpy(&default_exception_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&default_exception_handlers, &std_object_handlers, sizeof(zend_object_handlers));
default_exception_handlers.clone_obj = NULL;
INIT_CLASS_ENTRY(ce, "Exception", default_exception_functions);
@@ -855,8 +854,12 @@ void zend_register_default_exception(void) /* {{{ */
zend_declare_property_null(zend_ce_error, "trace", sizeof("trace")-1, ZEND_ACC_PRIVATE);
zend_declare_property_null(zend_ce_error, "previous", sizeof("previous")-1, ZEND_ACC_PRIVATE);
+ INIT_CLASS_ENTRY(ce, "CompileError", NULL);
+ zend_ce_compile_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_compile_error->create_object = zend_default_exception_new;
+
INIT_CLASS_ENTRY(ce, "ParseError", NULL);
- zend_ce_parse_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_parse_error = zend_register_internal_class_ex(&ce, zend_ce_compile_error);
zend_ce_parse_error->create_object = zend_default_exception_new;
INIT_CLASS_ENTRY(ce, "TypeError", NULL);
@@ -976,21 +979,22 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* {
ZVAL_OBJ(&exception, ex);
ce_exception = Z_OBJCE(exception);
EG(exception) = NULL;
- if (ce_exception == zend_ce_parse_error) {
+ if (ce_exception == zend_ce_parse_error || ce_exception == zend_ce_compile_error) {
zend_string *message = zval_get_string(GET_PROPERTY(&exception, ZEND_STR_MESSAGE));
zend_string *file = zval_get_string(GET_PROPERTY_SILENT(&exception, ZEND_STR_FILE));
zend_long line = zval_get_long(GET_PROPERTY_SILENT(&exception, ZEND_STR_LINE));
- zend_error_helper(E_PARSE, ZSTR_VAL(file), line, "%s", ZSTR_VAL(message));
+ zend_error_helper(ce_exception == zend_ce_parse_error ? E_PARSE : E_COMPILE_ERROR,
+ ZSTR_VAL(file), line, "%s", ZSTR_VAL(message));
- zend_string_release(file);
- zend_string_release(message);
+ zend_string_release_ex(file, 0);
+ zend_string_release_ex(message, 0);
} else if (instanceof_function(ce_exception, zend_ce_throwable)) {
zval tmp, rv;
zend_string *str, *file = NULL;
zend_long line = 0;
- zend_call_method_with_0_params(&exception, ce_exception, NULL, "__tostring", &tmp);
+ zend_call_method_with_0_params(&exception, ce_exception, &ex->ce->__tostring, "__tostring", &tmp);
if (!EG(exception)) {
if (Z_TYPE(tmp) != IS_STRING) {
zend_error(E_WARNING, "%s::__toString() must return a string", ZSTR_VAL(ce_exception->name));
@@ -1015,7 +1019,7 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* {
ZSTR_VAL(Z_OBJCE(zv)->name), ZSTR_VAL(ce_exception->name));
if (file) {
- zend_string_release(file);
+ zend_string_release_ex(file, 0);
}
}
@@ -1026,8 +1030,8 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* {
zend_error_va(severity, (file && ZSTR_LEN(file) > 0) ? ZSTR_VAL(file) : NULL, line,
"Uncaught %s\n thrown", ZSTR_VAL(str));
- zend_string_release(str);
- zend_string_release(file);
+ zend_string_release_ex(str, 0);
+ zend_string_release_ex(file, 0);
} else {
zend_error(severity, "Uncaught exception '%s'", ZSTR_VAL(ce_exception->name));
}
diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h
index 44d83cfb4e..357a561ec7 100644
--- a/Zend/zend_exceptions.h
+++ b/Zend/zend_exceptions.h
@@ -12,15 +12,13 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
| Marcus Boerger <helly@php.net> |
| Sterling Hughes <sterling@php.net> |
- | Zeev Suraski <zeev@zend.com> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_EXCEPTIONS_H
#define ZEND_EXCEPTIONS_H
@@ -30,6 +28,7 @@ extern ZEND_API zend_class_entry *zend_ce_throwable;
extern ZEND_API zend_class_entry *zend_ce_exception;
extern ZEND_API zend_class_entry *zend_ce_error_exception;
extern ZEND_API zend_class_entry *zend_ce_error;
+extern ZEND_API zend_class_entry *zend_ce_compile_error;
extern ZEND_API zend_class_entry *zend_ce_parse_error;
extern ZEND_API zend_class_entry *zend_ce_type_error;
extern ZEND_API zend_class_entry *zend_ce_argument_count_error;
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index ad438f6dea..0a505f55e8 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#define ZEND_INTENSIVE_DEBUGGING 0
#include <stdio.h>
@@ -70,12 +68,20 @@
# define EXECUTE_DATA_DC
# define EXECUTE_DATA_CC
# define NO_EXECUTE_DATA_CC
+# define OPLINE_D void
+# define OPLINE_C
+# define OPLINE_DC
+# define OPLINE_CC
#else
# define EXECUTE_DATA_D zend_execute_data* execute_data
# define EXECUTE_DATA_C execute_data
# define EXECUTE_DATA_DC , EXECUTE_DATA_D
# define EXECUTE_DATA_CC , EXECUTE_DATA_C
# define NO_EXECUTE_DATA_CC , NULL
+# define OPLINE_D const zend_op* opline
+# define OPLINE_C opline
+# define OPLINE_DC , OPLINE_D
+# define OPLINE_CC , OPLINE_C
#endif
#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
@@ -93,15 +99,15 @@
typedef int (ZEND_FASTCALL *incdec_t)(zval *);
-#define get_zval_ptr(op_type, node, should_free, type) _get_zval_ptr(op_type, node, should_free, type EXECUTE_DATA_CC)
-#define get_zval_ptr_deref(op_type, node, should_free, type) _get_zval_ptr_deref(op_type, node, should_free, type EXECUTE_DATA_CC)
-#define get_zval_ptr_r(op_type, node, should_free) _get_zval_ptr_r(op_type, node, should_free EXECUTE_DATA_CC)
-#define get_zval_ptr_r_deref(op_type, node, should_free) _get_zval_ptr_r_deref(op_type, node, should_free EXECUTE_DATA_CC)
-#define get_zval_ptr_undef(op_type, node, should_free, type) _get_zval_ptr_undef(op_type, node, should_free, type EXECUTE_DATA_CC)
+#define get_zval_ptr(op_type, node, should_free, type) _get_zval_ptr(op_type, node, should_free, type EXECUTE_DATA_CC OPLINE_CC)
+#define get_zval_ptr_deref(op_type, node, should_free, type) _get_zval_ptr_deref(op_type, node, should_free, type EXECUTE_DATA_CC OPLINE_CC)
+#define get_zval_ptr_undef(op_type, node, should_free, type) _get_zval_ptr_undef(op_type, node, should_free, type EXECUTE_DATA_CC OPLINE_CC)
+#define get_op_data_zval_ptr_r(op_type, node, should_free) _get_op_data_zval_ptr_r(op_type, node, should_free EXECUTE_DATA_CC OPLINE_CC)
+#define get_op_data_zval_ptr_deref_r(op_type, node, should_free) _get_op_data_zval_ptr_deref_r(op_type, node, should_free EXECUTE_DATA_CC OPLINE_CC)
#define get_zval_ptr_ptr(op_type, node, should_free, type) _get_zval_ptr_ptr(op_type, node, should_free, type EXECUTE_DATA_CC)
#define get_zval_ptr_ptr_undef(op_type, node, should_free, type) _get_zval_ptr_ptr(op_type, node, should_free, type EXECUTE_DATA_CC)
-#define get_obj_zval_ptr(op_type, node, should_free, type) _get_obj_zval_ptr(op_type, node, should_free, type EXECUTE_DATA_CC)
-#define get_obj_zval_ptr_undef(op_type, node, should_free, type) _get_obj_zval_ptr_undef(op_type, node, should_free, type EXECUTE_DATA_CC)
+#define get_obj_zval_ptr(op_type, node, should_free, type) _get_obj_zval_ptr(op_type, node, should_free, type EXECUTE_DATA_CC OPLINE_CC)
+#define get_obj_zval_ptr_undef(op_type, node, should_free, type) _get_obj_zval_ptr_undef(op_type, node, should_free, type EXECUTE_DATA_CC OPLINE_CC)
#define get_obj_zval_ptr_ptr(op_type, node, should_free, type) _get_obj_zval_ptr_ptr(op_type, node, should_free, type EXECUTE_DATA_CC)
#define RETURN_VALUE_USED(opline) ((opline)->result_type != IS_UNUSED)
@@ -128,14 +134,19 @@ ZEND_API const zend_internal_function zend_pass_function = {
#undef zval_ptr_dtor
#define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC)
-#define READY_TO_DESTROY(zv) \
- (UNEXPECTED(zv) && Z_REFCOUNTED_P(zv) && Z_REFCOUNT_P(zv) == 1)
-
-#define EXTRACT_ZVAL_PTR(zv) do { \
- zval *__zv = (zv); \
- if (EXPECTED(Z_TYPE_P(__zv) == IS_INDIRECT)) { \
- ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \
- } \
+#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op, result) do { \
+ zval *__container_to_free = (free_op); \
+ if (UNEXPECTED(__container_to_free) \
+ && EXPECTED(Z_REFCOUNTED_P(__container_to_free))) { \
+ zend_refcounted *__ref = Z_COUNTED_P(__container_to_free); \
+ if (UNEXPECTED(!GC_DELREF(__ref))) { \
+ zval *__zv = (result); \
+ if (EXPECTED(Z_TYPE_P(__zv) == IS_INDIRECT)) { \
+ ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \
+ } \
+ rc_dtor_func(__ref); \
+ } \
+ } \
} while (0)
#define FREE_OP(should_free) \
@@ -159,12 +170,9 @@ ZEND_API const zend_internal_function zend_pass_function = {
#define ZEND_VM_STACK_PAGE_SIZE (ZEND_VM_STACK_PAGE_SLOTS * sizeof(zval))
-#define ZEND_VM_STACK_FREE_PAGE_SIZE \
- ((ZEND_VM_STACK_PAGE_SLOTS - ZEND_VM_STACK_HEADER_SLOTS) * sizeof(zval))
-
-#define ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size) \
+#define ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size, page_size) \
(((size) + ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval) \
- + (ZEND_VM_STACK_PAGE_SIZE - 1)) & ~(ZEND_VM_STACK_PAGE_SIZE - 1))
+ + ((page_size) - 1)) & ~((page_size) - 1))
static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend_vm_stack prev) {
zend_vm_stack page = (zend_vm_stack)emalloc(size);
@@ -177,12 +185,23 @@ static zend_always_inline zend_vm_stack zend_vm_stack_new_page(size_t size, zend
ZEND_API void zend_vm_stack_init(void)
{
+ EG(vm_stack_page_size) = ZEND_VM_STACK_PAGE_SIZE;
EG(vm_stack) = zend_vm_stack_new_page(ZEND_VM_STACK_PAGE_SIZE, NULL);
EG(vm_stack)->top++;
EG(vm_stack_top) = EG(vm_stack)->top;
EG(vm_stack_end) = EG(vm_stack)->end;
}
+ZEND_API void zend_vm_stack_init_ex(size_t page_size)
+{
+ /* page_size must be a power of 2 */
+ ZEND_ASSERT(page_size > 0 && (page_size & (page_size - 1)) == 0);
+ EG(vm_stack_page_size) = page_size;
+ EG(vm_stack) = zend_vm_stack_new_page(page_size, NULL);
+ EG(vm_stack_top) = EG(vm_stack)->top;
+ EG(vm_stack_end) = EG(vm_stack)->end;
+}
+
ZEND_API void zend_vm_stack_destroy(void)
{
zend_vm_stack stack = EG(vm_stack);
@@ -202,8 +221,8 @@ ZEND_API void* zend_vm_stack_extend(size_t size)
stack = EG(vm_stack);
stack->top = EG(vm_stack_top);
EG(vm_stack) = stack = zend_vm_stack_new_page(
- EXPECTED(size < ZEND_VM_STACK_FREE_PAGE_SIZE) ?
- ZEND_VM_STACK_PAGE_SIZE : ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size),
+ EXPECTED(size < EG(vm_stack_page_size) - (ZEND_VM_STACK_HEADER_SLOTS * sizeof(zval))) ?
+ EG(vm_stack_page_size) : ZEND_VM_STACK_PAGE_ALIGNED_SIZE(size, EG(vm_stack_page_size)),
stack);
ptr = stack->top;
EG(vm_stack_top) = (void*)(((char*)ptr) + size);
@@ -251,7 +270,7 @@ static zend_never_inline ZEND_COLD void zval_undefined_cv(uint32_t var EXECUTE_D
}
}
-static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int type EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int type EXECUTE_DATA_DC)
{
switch (type) {
case BP_VAR_R:
@@ -271,52 +290,50 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int
return ptr;
}
-static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, uint32_t var EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, uint32_t var EXECUTE_DATA_DC)
{
zval_undefined_cv(var EXECUTE_DATA_CC);
return &EG(uninitialized_zval);
}
-static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, uint32_t var EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, uint32_t var EXECUTE_DATA_DC)
{
zval_undefined_cv(var EXECUTE_DATA_CC);
return &EG(uninitialized_zval);
}
-static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, uint32_t var EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, uint32_t var EXECUTE_DATA_DC)
{
ZVAL_NULL(ptr);
zval_undefined_cv(var EXECUTE_DATA_CC);
return ptr;
}
-static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_W(zval *ptr, uint32_t var EXECUTE_DATA_DC)
-{
- ZVAL_NULL(ptr);
- return ptr;
-}
-
static zend_always_inline zval *_get_zval_ptr_cv(uint32_t var, int type EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(ret);
+ } else {
+ return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
+ }
}
return ret;
}
-static zend_always_inline zval *_get_zval_ptr_cv_undef(uint32_t var EXECUTE_DATA_DC)
-{
- return EX_VAR(var);
-}
-
static zend_always_inline zval *_get_zval_ptr_cv_deref(uint32_t var, int type EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(ret);
+ return ret;
+ } else {
+ return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
+ }
}
ZVAL_DEREF(ret);
return ret;
@@ -405,38 +422,24 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(uint32_t var EXECUTE_D
zval *ret = EX_VAR(var);
if (Z_TYPE_P(ret) == IS_UNDEF) {
- return _get_zval_cv_lookup_BP_VAR_W(ret, var EXECUTE_DATA_CC);
+ ZVAL_NULL(ret);
}
return ret;
}
-static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
-{
- return EX_VAR(var);
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_RW(uint32_t var EXECUTE_DATA_DC)
-{
- return EX_VAR(var);
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_UNSET(uint32_t var EXECUTE_DATA_DC)
-{
- return EX_VAR(var);
-}
-
static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
if (Z_TYPE_P(ret) == IS_UNDEF) {
- return _get_zval_cv_lookup_BP_VAR_W(ret, var EXECUTE_DATA_CC);
+ ZVAL_NULL(ret);
+ return ret;
}
ZVAL_DEREF(ret);
return ret;
}
-static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
if (op_type == IS_TMP_VAR) {
@@ -448,7 +451,7 @@ static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, zend_f
} else {
*should_free = NULL;
if (op_type == IS_CONST) {
- return EX_CONSTANT(node);
+ return RT_CONSTANT(opline, node);
} else if (op_type == IS_CV) {
return _get_zval_ptr_cv(node.var, type EXECUTE_DATA_CC);
} else {
@@ -457,7 +460,7 @@ static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, zend_f
}
}
-static zend_always_inline zval *_get_zval_ptr_r(int op_type, znode_op node, zend_free_op *should_free EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_op_data_zval_ptr_r(int op_type, znode_op node, zend_free_op *should_free EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
if (op_type == IS_TMP_VAR) {
@@ -469,7 +472,7 @@ static zend_always_inline zval *_get_zval_ptr_r(int op_type, znode_op node, zend
} else {
*should_free = NULL;
if (op_type == IS_CONST) {
- return EX_CONSTANT(node);
+ return RT_CONSTANT(opline + 1, node);
} else if (op_type == IS_CV) {
return _get_zval_ptr_cv_BP_VAR_R(node.var EXECUTE_DATA_CC);
} else {
@@ -478,7 +481,7 @@ static zend_always_inline zval *_get_zval_ptr_r(int op_type, znode_op node, zend
}
}
-static zend_always_inline zval *_get_zval_ptr_deref(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_zval_ptr_deref(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
if (op_type == IS_TMP_VAR) {
@@ -490,7 +493,7 @@ static zend_always_inline zval *_get_zval_ptr_deref(int op_type, znode_op node,
} else {
*should_free = NULL;
if (op_type == IS_CONST) {
- return EX_CONSTANT(node);
+ return RT_CONSTANT(opline, node);
} else if (op_type == IS_CV) {
return _get_zval_ptr_cv_deref(node.var, type EXECUTE_DATA_CC);
} else {
@@ -499,7 +502,7 @@ static zend_always_inline zval *_get_zval_ptr_deref(int op_type, znode_op node,
}
}
-static zend_always_inline zval *_get_zval_ptr_r_deref(int op_type, znode_op node, zend_free_op *should_free EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_op_data_zval_ptr_deref_r(int op_type, znode_op node, zend_free_op *should_free EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
if (op_type == IS_TMP_VAR) {
@@ -511,7 +514,7 @@ static zend_always_inline zval *_get_zval_ptr_r_deref(int op_type, znode_op node
} else {
*should_free = NULL;
if (op_type == IS_CONST) {
- return EX_CONSTANT(node);
+ return RT_CONSTANT(opline + 1, node);
} else if (op_type == IS_CV) {
return _get_zval_ptr_cv_deref_BP_VAR_R(node.var EXECUTE_DATA_CC);
} else {
@@ -520,7 +523,7 @@ static zend_always_inline zval *_get_zval_ptr_r_deref(int op_type, znode_op node
}
}
-static zend_always_inline zval *_get_zval_ptr_undef(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_zval_ptr_undef(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
if (op_type == IS_TMP_VAR) {
@@ -532,9 +535,9 @@ static zend_always_inline zval *_get_zval_ptr_undef(int op_type, znode_op node,
} else {
*should_free = NULL;
if (op_type == IS_CONST) {
- return EX_CONSTANT(node);
+ return RT_CONSTANT(opline, node);
} else if (op_type == IS_CV) {
- return _get_zval_ptr_cv_undef(node.var EXECUTE_DATA_CC);
+ return EX_VAR(node.var);
} else {
return NULL;
}
@@ -565,12 +568,7 @@ static inline zval *_get_zval_ptr_ptr(int op_type, znode_op node, zend_free_op *
}
}
-static zend_always_inline zval *_get_obj_zval_ptr_unused(EXECUTE_DATA_D)
-{
- return &EX(This);
-}
-
-static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type == IS_UNUSED) {
*should_free = NULL;
@@ -579,7 +577,7 @@ static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_free_op *sh
return get_zval_ptr(op_type, op, should_free, type);
}
-static inline zval *_get_obj_zval_ptr_undef(int op_type, znode_op op, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static inline zval *_get_obj_zval_ptr_undef(int op_type, znode_op op, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
{
if (op_type == IS_UNUSED) {
*should_free = NULL;
@@ -608,13 +606,13 @@ static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *v
}
ref = Z_REF_P(value_ptr);
- GC_REFCOUNT(ref)++;
+ GC_ADDREF(ref);
if (Z_REFCOUNTED_P(variable_ptr)) {
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
- if (--GC_REFCOUNT(garbage) == 0) {
+ if (GC_DELREF(garbage) == 0) {
ZVAL_REF(variable_ptr, ref);
- zval_dtor_func(garbage);
+ rc_dtor_func(garbage);
return;
} else {
gc_check_possible_root(garbage);
@@ -623,20 +621,93 @@ static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *v
ZVAL_REF(variable_ptr, ref);
}
+static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr, zend_uchar value_type OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_error(E_NOTICE, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ return 0;
+ }
+
+ value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
+ }
+ return 1;
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_assignment(zval *property OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_string *tmp_property_name;
+ zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+ zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
+ zend_tmp_string_release(tmp_property_name);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+}
+
/* this should modify object only if it's empty */
-static inline int make_real_object(zval *object)
+static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
{
- if (UNEXPECTED(Z_TYPE_P(object) != IS_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 {
- return 0;
+ zend_object *obj;
+
+ 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 (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);
+
+ if (opline->opcode == ZEND_PRE_INC_OBJ
+ || opline->opcode == ZEND_PRE_DEC_OBJ
+ || opline->opcode == ZEND_POST_INC_OBJ
+ || opline->opcode == ZEND_POST_DEC_OBJ) {
+ zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
+ } else {
+ zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
+ }
+ zend_tmp_string_release(tmp_property_name);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
- object_init(object);
- zend_error(E_WARNING, "Creating default object from empty value");
+ return 0;
}
+ object_init(object);
+ Z_ADDREF_P(object);
+ obj = Z_OBJ_P(object);
+ zend_error(E_WARNING, "Creating default object from empty value");
+ if (GC_REFCOUNT(obj) == 1) {
+ /* the enclosing container was deleted, obj is unreferenced */
+ OBJ_RELEASE(obj);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ return 0;
+ }
+ Z_DELREF_P(object);
+ return 1;
+}
+
+static zend_never_inline ZEND_COLD int 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 {
+ 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;
+ }
+ object_init(object);
return 1;
}
@@ -744,7 +815,7 @@ static ZEND_COLD void zend_verify_arg_error(
static int is_null_constant(zend_class_entry *scope, zval *default_value)
{
- if (Z_CONSTANT_P(default_value)) {
+ if (Z_TYPE_P(default_value) == IS_CONSTANT_AST) {
zval constant;
ZVAL_COPY(&constant, default_value);
@@ -754,7 +825,7 @@ static int is_null_constant(zend_class_entry *scope, zval *default_value)
if (Z_TYPE(constant) == IS_NULL) {
return 1;
}
- zval_ptr_dtor(&constant);
+ zval_ptr_dtor_nogc(&constant);
}
return 0;
}
@@ -883,6 +954,7 @@ static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t a
return 1;
}
+ ce = NULL;
if (UNEXPECTED(!zend_check_type(cur_arg_info->type, arg, &ce, cache_slot, default_value, zf->common.scope, 0))) {
zend_verify_arg_error(zf, cur_arg_info, arg_num, ce, arg);
return 0;
@@ -1017,7 +1089,7 @@ static zend_always_inline void zend_verify_return_type(zend_function *zf, zval *
}
}
-static ZEND_COLD int zend_verify_missing_return_type(zend_function *zf, void **cache_slot)
+static ZEND_COLD int zend_verify_missing_return_type(const zend_function *zf, void **cache_slot)
{
zend_arg_info *ret_info = zf->common.arg_info - 1;
@@ -1039,14 +1111,31 @@ static ZEND_COLD int zend_verify_missing_return_type(zend_function *zf, void **c
return 1;
}
-static zend_never_inline void zend_assign_to_object_dim(zval *object, zval *dim, zval *value)
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_object_as_array(void)
+{
+ zend_throw_error(NULL, "Cannot use object as array");
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_offset(void)
+{
+ zend_error(E_WARNING, "Illegal offset type");
+}
+
+static zend_never_inline void zend_assign_to_object_dim(zval *object, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC)
{
if (UNEXPECTED(!Z_OBJ_HT_P(object)->write_dimension)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ }
return;
}
Z_OBJ_HT_P(object)->write_dimension(object, dim, value);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
}
static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *property, zval *value, zval *retval, binary_op_type binary_op EXECUTE_DATA_DC)
@@ -1076,7 +1165,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
}
zval_ptr_dtor(&res);
} else {
- zend_error(E_WARNING, "Attempt to assign property of non-object");
+ zend_use_object_as_array();
if (retval) {
ZVAL_NULL(retval);
}
@@ -1110,11 +1199,11 @@ try_again:
dim = Z_REFVAL_P(dim);
goto try_again;
default:
- zend_error(E_WARNING, "Illegal offset type");
+ zend_illegal_offset();
break;
}
- offset = _zval_get_long_func(dim);
+ offset = zval_get_long_func(dim);
} else {
offset = Z_LVAL_P(dim);
}
@@ -1129,6 +1218,10 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
const zend_op *end;
uint32_t var;
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ return;
+ }
+
switch (opline->opcode) {
case ZEND_ASSIGN_ADD:
case ZEND_ASSIGN_SUB:
@@ -1148,6 +1241,7 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
case ZEND_FETCH_DIM_RW:
case ZEND_FETCH_DIM_FUNC_ARG:
case ZEND_FETCH_DIM_UNSET:
+ case ZEND_FETCH_LIST_W:
/* TODO: Encode the "reason" into opline->extended_value??? */
var = opline->result.var;
opline++;
@@ -1190,6 +1284,7 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
case ZEND_FETCH_DIM_RW:
case ZEND_FETCH_DIM_FUNC_ARG:
case ZEND_FETCH_DIM_UNSET:
+ case ZEND_FETCH_LIST_W:
case ZEND_ASSIGN_DIM:
msg = "Cannot use string offset as an array";
break;
@@ -1219,6 +1314,7 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
break;
case ZEND_SEND_REF:
case ZEND_SEND_VAR_EX:
+ case ZEND_SEND_FUNC_ARG:
msg = "Only variables can be passed by reference";
break;
case ZEND_FE_RESET_RW:
@@ -1238,12 +1334,43 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
EMPTY_SWITCH_DEFAULT_CASE();
}
ZEND_ASSERT(msg != NULL);
- zend_throw_error(NULL, msg);
+ zend_throw_error(NULL, "%s", msg);
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_read(zval *property)
+{
+ zend_string *tmp_property_name;
+ zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+ zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
+ zend_tmp_string_release(tmp_property_name);
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_unset(zval *property)
+{
+ zend_string *tmp_property_name;
+ zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+ zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
+ zend_tmp_string_release(tmp_property_name);
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_check(zval *property)
+{
+ zend_string *tmp_property_name;
+ zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+ zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
+ zend_tmp_string_release(tmp_property_name);
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc)
+{
+ zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
+ fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
+ fbc->common.scope ? "::" : "",
+ ZSTR_VAL(fbc->common.function_name));
}
-static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value, zval *result EXECUTE_DATA_DC)
+static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC)
{
- zend_string *old_str;
zend_uchar c;
size_t string_len;
zend_long offset;
@@ -1252,19 +1379,19 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
if (offset < -(zend_long)Z_STRLEN_P(str)) {
/* Error on negative offset */
zend_error(E_WARNING, "Illegal string offset: " ZEND_LONG_FMT, offset);
- if (result) {
- ZVAL_NULL(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
return;
}
if (Z_TYPE_P(value) != IS_STRING) {
/* Convert to string, just the time to pick the 1st byte */
- zend_string *tmp = zval_get_string(value);
+ zend_string *tmp = zval_get_string_func(value);
string_len = ZSTR_LEN(tmp);
c = (zend_uchar)ZSTR_VAL(tmp)[0];
- zend_string_release(tmp);
+ zend_string_release_ex(tmp, 0);
} else {
string_len = Z_STRLEN_P(value);
c = (zend_uchar)Z_STRVAL_P(value)[0];
@@ -1273,8 +1400,8 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
if (string_len == 0) {
/* Error on empty input string */
zend_error(E_WARNING, "Cannot assign an empty string to a string offset");
- if (result) {
- ZVAL_NULL(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
return;
}
@@ -1286,29 +1413,27 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
if ((size_t)offset >= Z_STRLEN_P(str)) {
/* Extend string if needed */
zend_long old_len = Z_STRLEN_P(str);
- Z_STR_P(str) = zend_string_extend(Z_STR_P(str), offset + 1, 0);
- Z_TYPE_INFO_P(str) = IS_STRING_EX;
+ ZVAL_NEW_STR(str, zend_string_extend(Z_STR_P(str), offset + 1, 0));
memset(Z_STRVAL_P(str) + old_len, ' ', offset - old_len);
Z_STRVAL_P(str)[offset+1] = 0;
} else if (!Z_REFCOUNTED_P(str)) {
- old_str = Z_STR_P(str);
- Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
- Z_TYPE_INFO_P(str) = IS_STRING_EX;
- zend_string_release(old_str);
+ ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0));
+ } else if (Z_REFCOUNT_P(str) > 1) {
+ Z_DELREF_P(str);
+ ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0));
} else {
- SEPARATE_STRING(str);
zend_string_forget_hash_val(Z_STR_P(str));
}
Z_STRVAL_P(str)[offset] = c;
- if (result) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
/* Return the new character */
- ZVAL_INTERNED_STR(result, ZSTR_CHAR(c));
+ ZVAL_INTERNED_STR(EX_VAR(opline->result.var), ZSTR_CHAR(c));
}
}
-static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result)
+static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC)
{
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
zval rv, obj;
@@ -1320,7 +1445,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object,
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
if (UNEXPECTED(EG(exception))) {
OBJ_RELEASE(Z_OBJ(obj));
- ZVAL_UNDEF(result);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
return;
}
@@ -1333,12 +1458,8 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object,
ZVAL_COPY_VALUE(z, value);
}
- if (UNEXPECTED(Z_TYPE_P(z) == IS_REFERENCE)) {
- ZVAL_COPY(result, Z_REFVAL_P(z));
- } else {
- ZVAL_COPY(result, z);
- }
- ZVAL_DUP(&z_copy, result);
+ ZVAL_COPY_DEREF(&z_copy, z);
+ ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
if (inc) {
increment_function(&z_copy);
} else {
@@ -1350,24 +1471,25 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object,
zval_ptr_dtor(z);
} else {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- ZVAL_NULL(result);
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
}
-static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result)
+static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC)
{
zval rv;
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
- zval *z, *zptr, obj;
+ zval *z, obj;
+ zval z_copy;
ZVAL_OBJ(&obj, Z_OBJ_P(object));
Z_ADDREF(obj);
- zptr = z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
+ z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
if (UNEXPECTED(EG(exception))) {
OBJ_RELEASE(Z_OBJ(obj));
- if (result) {
- ZVAL_UNDEF(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
return;
}
@@ -1381,32 +1503,31 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object,
}
ZVAL_COPY_VALUE(z, value);
}
- ZVAL_DEREF(z);
- SEPARATE_ZVAL_NOREF(z);
+ ZVAL_COPY_DEREF(&z_copy, z);
if (inc) {
- increment_function(z);
+ increment_function(&z_copy);
} else {
- decrement_function(z);
+ decrement_function(&z_copy);
}
- if (UNEXPECTED(result)) {
- ZVAL_COPY(result, z);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
}
- Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot);
+ Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
OBJ_RELEASE(Z_OBJ(obj));
- zval_ptr_dtor(zptr);
+ zval_ptr_dtor(&z_copy);
+ zval_ptr_dtor(z);
} else {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (UNEXPECTED(result)) {
- ZVAL_NULL(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
}
}
-static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result)
+static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op OPLINE_DC EXECUTE_DATA_DC)
{
zval *z;
- zval rv, obj;
- zval *zptr;
+ zval rv, obj, res;
ZVAL_OBJ(&obj, Z_OBJ_P(object));
Z_ADDREF(obj);
@@ -1414,8 +1535,8 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z
z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
if (UNEXPECTED(EG(exception))) {
OBJ_RELEASE(Z_OBJ(obj));
- if (result) {
- ZVAL_UNDEF(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
}
return;
}
@@ -1428,19 +1549,17 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z
}
ZVAL_COPY_VALUE(z, value);
}
- zptr = z;
- ZVAL_DEREF(z);
- SEPARATE_ZVAL_NOREF(z);
- binary_op(z, z, value);
- Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot);
- if (UNEXPECTED(result)) {
- ZVAL_COPY(result, z);
+ binary_op(&res, z, value);
+ Z_OBJ_HT(obj)->write_property(&obj, property, &res, cache_slot);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &res);
}
- zval_ptr_dtor(zptr);
+ zval_ptr_dtor(z);
+ zval_ptr_dtor(&res);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
- if (UNEXPECTED(result)) {
- ZVAL_NULL(result);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
}
OBJ_RELEASE(Z_OBJ(obj));
@@ -1475,11 +1594,10 @@ static zend_always_inline HashTable *zend_get_target_symbol_table(int fetch_type
{
HashTable *ht;
- if (EXPECTED(fetch_type == ZEND_FETCH_GLOBAL_LOCK) ||
- EXPECTED(fetch_type == ZEND_FETCH_GLOBAL)) {
+ if (EXPECTED(fetch_type & (ZEND_FETCH_GLOBAL_LOCK | ZEND_FETCH_GLOBAL))) {
ht = &EG(symbol_table);
} else {
- ZEND_ASSERT(fetch_type == ZEND_FETCH_LOCAL);
+ ZEND_ASSERT(fetch_type & ZEND_FETCH_LOCAL);
if (!(EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE)) {
zend_rebuild_symbol_table();
}
@@ -1488,9 +1606,82 @@ static zend_always_inline HashTable *zend_get_target_symbol_table(int fetch_type
return ht;
}
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_offset(zend_long lval)
+{
+ zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, lval);
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_index(const zend_string *offset)
+{
+ zend_error(E_NOTICE, "Undefined index: %s", ZSTR_VAL(offset));
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_method(const zend_class_entry *ce, const zend_string *method)
+{
+ zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), ZSTR_VAL(method));
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(zval *object, zval *function_name)
+{
+ zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc)
+{
+ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
+ zend_error(E_DEPRECATED,
+ "Non-static method %s::%s() should not be called statically",
+ ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ } else {
+ zend_throw_error(
+ zend_ce_error,
+ "Non-static method %s::%s() cannot be called statically",
+ ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ }
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num)
+{
+ zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
+ arg_num,
+ func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
+ func->common.scope ? "::" : "",
+ ZSTR_VAL(func->common.function_name));
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_scalar_as_array(void)
+{
+ zend_error(E_WARNING, "Cannot use a scalar value as an array");
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void)
+{
+ zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim)
+{
+ zend_error(E_NOTICE, "Resource ID#%d used as offset, casting to integer (%d)", Z_RES_HANDLE_P(dim), Z_RES_HANDLE_P(dim));
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_string(void)
+{
+ zend_throw_error(NULL, "[] operator not supported for strings");
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_access_undefined_propery_in_overloaded_object(void)
+{
+ zend_throw_error(NULL, "Cannot access undefined property for object with overloaded property access");
+}
+
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_unsupported_property_reference(void)
+{
+ zend_error(E_WARNING, "This object doesn't support property references");
+}
+
static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht, const zval *dim, int dim_type, int type EXECUTE_DATA_DC)
{
- zval *retval;
+ zval *retval = NULL;
zend_string *offset_key;
zend_ulong hval;
@@ -1503,14 +1694,14 @@ num_index:
num_undef:
switch (type) {
case BP_VAR_R:
- zend_error(E_NOTICE,"Undefined offset: " ZEND_LONG_FMT, hval);
+ zend_undefined_offset(hval);
/* break missing intentionally */
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined offset: " ZEND_LONG_FMT, hval);
+ zend_undefined_offset(hval);
retval = zend_hash_index_update(ht, hval, &EG(uninitialized_zval));
break;
case BP_VAR_W:
@@ -1525,7 +1716,7 @@ num_undef:
}
}
str_index:
- retval = zend_hash_find(ht, offset_key);
+ retval = zend_hash_find_ex(ht, offset_key, dim_type == IS_CONST);
if (retval) {
/* support for $GLOBALS[...] */
if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
@@ -1533,14 +1724,14 @@ str_index:
if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
switch (type) {
case BP_VAR_R:
- zend_error(E_NOTICE, "Undefined index: %s", ZSTR_VAL(offset_key));
+ zend_undefined_index(offset_key);
/* break missing intentionally */
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined index: %s", ZSTR_VAL(offset_key));
+ zend_undefined_index(offset_key);
/* break missing intentionally */
case BP_VAR_W:
ZVAL_NULL(retval);
@@ -1551,14 +1742,14 @@ str_index:
} else {
switch (type) {
case BP_VAR_R:
- zend_error(E_NOTICE, "Undefined index: %s", ZSTR_VAL(offset_key));
+ zend_undefined_index(offset_key);
/* break missing intentionally */
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined index: %s", ZSTR_VAL(offset_key));
+ zend_undefined_index(offset_key);
retval = zend_hash_update(ht, offset_key, &EG(uninitialized_zval));
break;
case BP_VAR_W:
@@ -1578,7 +1769,7 @@ str_index:
hval = zend_dval_to_lval(Z_DVAL_P(dim));
goto num_index;
case IS_RESOURCE:
- zend_error(E_NOTICE, "Resource ID#%d used as offset, casting to integer (%d)", Z_RES_HANDLE_P(dim), Z_RES_HANDLE_P(dim));
+ zend_use_resource_as_offset(dim);
hval = Z_RES_HANDLE_P(dim);
goto num_index;
case IS_FALSE:
@@ -1591,7 +1782,7 @@ str_index:
dim = Z_REFVAL_P(dim);
goto try_again;
default:
- zend_error(E_WARNING, "Illegal offset type");
+ zend_illegal_offset();
retval = (type == BP_VAR_W || type == BP_VAR_RW) ?
NULL : &EG(uninitialized_zval);
}
@@ -1630,7 +1821,7 @@ fetch_from_array:
if (dim == NULL) {
retval = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(retval == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
ZVAL_ERROR(result);
return;
}
@@ -1651,12 +1842,10 @@ fetch_from_array:
}
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (dim == NULL) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, type EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
ZVAL_ERROR(result);
} else if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -1665,9 +1854,12 @@ fetch_from_array:
dim = &EG(uninitialized_zval);
}
if (!Z_OBJ_HT_P(container)->read_dimension) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
ZVAL_ERROR(result);
} else {
+ if (dim_type == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
retval = Z_OBJ_HT_P(container)->read_dimension(container, dim, type, result);
if (UNEXPECTED(retval == &EG(uninitialized_zval))) {
@@ -1704,8 +1896,7 @@ fetch_from_array:
}
if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
if (type != BP_VAR_UNSET) {
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ array_init(container);
goto fetch_from_array;
} else {
/* for read-mode only */
@@ -1718,25 +1909,28 @@ fetch_from_array:
zend_error(E_WARNING, "Cannot unset offset in a non-array variable");
ZVAL_NULL(result);
} else {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
ZVAL_ERROR(result);
}
}
}
}
-static zend_never_inline void zend_fetch_dimension_address_W(zval *result, zval *container_ptr, zval *dim, int dim_type EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_W(zval *container_ptr, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_W EXECUTE_DATA_CC);
}
-static zend_never_inline void zend_fetch_dimension_address_RW(zval *result, zval *container_ptr, zval *dim, int dim_type EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_RW(zval *container_ptr, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_RW EXECUTE_DATA_CC);
}
-static zend_never_inline void zend_fetch_dimension_address_UNSET(zval *result, zval *container_ptr, zval *dim, int dim_type EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_UNSET(zval *container_ptr, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_UNSET EXECUTE_DATA_CC);
}
@@ -1748,7 +1942,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
try_array:
retval = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, dim_type, type EXECUTE_DATA_CC);
- ZVAL_COPY(result, retval);
+ ZVAL_COPY_DEREF(result, retval);
return;
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
@@ -1788,11 +1982,11 @@ try_string_offset:
dim = Z_REFVAL_P(dim);
goto try_string_offset;
default:
- zend_error(E_WARNING, "Illegal offset type");
+ zend_illegal_offset();
break;
}
- offset = _zval_get_long_func(dim);
+ offset = zval_get_long_func(dim);
} else {
offset = Z_LVAL_P(dim);
}
@@ -1820,15 +2014,20 @@ try_string_offset:
dim = &EG(uninitialized_zval);
}
if (!Z_OBJ_HT_P(container)->read_dimension) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
ZVAL_NULL(result);
} else {
+ if (dim_type == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
retval = Z_OBJ_HT_P(container)->read_dimension(container, dim, type, result);
ZEND_ASSERT(result != NULL);
if (retval) {
if (result != retval) {
- ZVAL_COPY(result, retval);
+ ZVAL_COPY_DEREF(result, retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(result);
}
} else {
ZVAL_NULL(result);
@@ -1845,36 +2044,155 @@ try_string_offset:
}
}
-static zend_never_inline void zend_fetch_dimension_address_read_R(zval *result, zval *container, zval *dim, int dim_type EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_R(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 1, 0 EXECUTE_DATA_CC);
}
-static zend_never_inline void zend_fetch_dimension_address_read_R_slow(zval *result, zval *container, zval *dim EXECUTE_DATA_DC)
+static zend_never_inline void zend_fetch_dimension_address_read_R_slow(zval *container, zval *dim OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address_read(result, container, dim, IS_CV, BP_VAR_R, 1, 1 EXECUTE_DATA_CC);
}
-static zend_never_inline void zend_fetch_dimension_address_read_IS(zval *result, zval *container, zval *dim, int dim_type EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_IS(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
+ zval *result = EX_VAR(opline->result.var);
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 1, 0 EXECUTE_DATA_CC);
}
-static zend_never_inline void zend_fetch_dimension_address_read_LIST(zval *result, zval *container, zval *dim EXECUTE_DATA_DC)
+static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_LIST_r(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC)
{
- zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, BP_VAR_R, 0, 0 EXECUTE_DATA_CC);
+ zval *result = EX_VAR(opline->result.var);
+ zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 0, 0 EXECUTE_DATA_CC);
}
ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type)
{
- if (type == BP_VAR_IS) {
- zend_fetch_dimension_address_read_IS(result, container, dim, IS_CONST NO_EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, type, 1, 0 NO_EXECUTE_DATA_CC);
+}
+
+static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable *ht, zval *offset EXECUTE_DATA_DC)
+{
+ zend_ulong hval;
+
+ if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+num_idx:
+ return zend_hash_index_find(ht, hval);
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+str_idx:
+ return zend_hash_find_ex_ind(ht, ZSTR_EMPTY_ALLOC(), 1);
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_idx;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_idx;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_idx;
+ } else if (/*OP2_TYPE == IS_CV &&*/ Z_TYPE_P(offset) == IS_UNDEF) {
+ zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ goto str_idx;
} else {
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CONST NO_EXECUTE_DATA_CC);
+ zend_error(E_WARNING, "Illegal offset type in isset or empty");
+ return NULL;
}
}
-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)
+static zend_never_inline int ZEND_FASTCALL zend_isset_dim_slow(zval *container, zval *offset EXECUTE_DATA_DC)
+{
+ if (/*OP2_TYPE == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ offset = &EG(uninitialized_zval);
+ }
+
+ if (/*OP1_TYPE != IS_CONST &&*/ EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
+ return Z_OBJ_HT_P(container)->has_dimension(container, offset, 0);
+ } else {
+ zend_use_object_as_array();
+ return 0;
+ }
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
+ zend_long lval;
+
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ lval = Z_LVAL_P(offset);
+str_offset:
+ if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
+ lval += (zend_long)Z_STRLEN_P(container);
+ }
+ if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else {
+ /*if (OP2_TYPE & (IS_CV|IS_VAR)) {*/
+ ZVAL_DEREF(offset);
+ /*}*/
+ if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+ || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+ && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+ lval = zval_get_long(offset);
+ goto str_offset;
+ }
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+}
+
+static zend_never_inline int ZEND_FASTCALL zend_isempty_dim_slow(zval *container, zval *offset EXECUTE_DATA_DC)
+{
+ if (/*OP2_TYPE == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ offset = &EG(uninitialized_zval);
+ }
+
+ if (/*OP1_TYPE != IS_CONST &&*/ EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
+ return !Z_OBJ_HT_P(container)->has_dimension(container, offset, 1);
+ } else {
+ zend_use_object_as_array();
+ return 1;
+ }
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
+ zend_long lval;
+
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ lval = Z_LVAL_P(offset);
+str_offset:
+ if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
+ lval += (zend_long)Z_STRLEN_P(container);
+ }
+ if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
+ return (Z_STRVAL_P(container)[lval] == '0');
+ } else {
+ return 1;
+ }
+ } else {
+ /*if (OP2_TYPE & (IS_CV|IS_VAR)) {*/
+ ZVAL_DEREF(offset);
+ /*}*/
+ if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+ || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+ && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+ lval = zval_get_long(offset);
+ goto str_offset;
+ }
+ return 1;
+ }
+ } else {
+ return 1;
+ }
+}
+
+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)
{
if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
do {
@@ -1886,17 +2204,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
}
/* this should modify object only if it's empty */
- if (type != BP_VAR_UNSET &&
- EXPECTED(Z_TYPE_P(container) <= IS_FALSE ||
- (Z_TYPE_P(container) == IS_STRING && Z_STRLEN_P(container)==0))) {
- zval_ptr_dtor_nogc(container);
- object_init(container);
- } else {
- if (container_op_type != IS_VAR || EXPECTED(!Z_ISERROR_P(container))) {
- zend_string *property_name = zval_get_string(prop_ptr);
- zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
+ if (type == BP_VAR_UNSET ||
+ UNEXPECTED(!make_real_object_rw(container, prop_ptr OPLINE_CC))) {
ZVAL_ERROR(result);
return;
}
@@ -1904,11 +2213,11 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
}
if (prop_op_type == IS_CONST &&
EXPECTED(Z_OBJCE_P(container) == CACHED_PTR_EX(cache_slot))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ 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);
@@ -1917,11 +2226,11 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
} else if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- retval = zend_hash_find(zobj->properties, Z_STR_P(prop_ptr));
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(prop_ptr), 1);
if (EXPECTED(retval)) {
ZVAL_INDIRECT(result, retval);
return;
@@ -1940,7 +2249,7 @@ use_read_property:
ZVAL_UNREF(ptr);
}
} else {
- zend_throw_error(NULL, "Cannot access undefined property for object with overloaded property access");
+ zend_access_undefined_propery_in_overloaded_object();
ZVAL_ERROR(result);
}
} else {
@@ -1949,101 +2258,47 @@ use_read_property:
} else if (EXPECTED(Z_OBJ_HT_P(container)->read_property)) {
goto use_read_property;
} else {
- zend_error(E_WARNING, "This object doesn't support property references");
+ zend_unsupported_property_reference();
ZVAL_ERROR(result);
}
}
-static zend_always_inline zval* zend_fetch_static_property_address(zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type, int type EXECUTE_DATA_DC)
+static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC)
{
- zval *retval;
- zend_string *name;
- zend_class_entry *ce;
-
- if (varname_type == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- zend_string_addref(name);
- } else {
- if (varname_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
- }
- name = zval_get_string(varname);
- }
-
- if (op2_type == IS_CONST) {
- if (varname_type == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(varname))) != NULL)) {
- retval = CACHED_PTR(Z_CACHE_SLOT_P(varname) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- if (type != BP_VAR_IS) {
- zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
- }
- return NULL;
- }
-
- return retval;
- } else {
- zval *class_name = EX_CONSTANT(op2);
+ zval *result = EX_VAR(opline->result.var);
- if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- if (varname_type != IS_CONST) {
- zend_string_release(name);
- }
- return NULL;
- }
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- }
- } else {
- if (op2_type == IS_UNUSED) {
- ce = zend_fetch_class(NULL, op2.num);
- if (UNEXPECTED(ce == NULL)) {
- if (varname_type != IS_CONST) {
- zend_string_release(name);
- }
- return NULL;
+ switch (type) {
+ case BP_VAR_R:
+ if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
+ ZVAL_OBJ(result, Z_OBJ(EX(This)));
+ Z_ADDREF_P(result);
+ } else {
+ ZVAL_NULL(result);
+ zend_error(E_NOTICE,"Undefined variable: this");
}
- } else {
- ce = Z_CE_P(EX_VAR(op2.var));
- }
- if (varname_type == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(varname)) == ce)) {
- retval = CACHED_PTR(Z_CACHE_SLOT_P(varname) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- if (type != BP_VAR_IS) {
- zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
- }
- return NULL;
+ break;
+ case BP_VAR_IS:
+ if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
+ ZVAL_OBJ(result, Z_OBJ(EX(This)));
+ Z_ADDREF_P(result);
+ } else {
+ ZVAL_NULL(result);
}
-
- return retval;
- }
- }
-
- retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
-
- if (varname_type != IS_CONST) {
- zend_string_release(name);
- }
-
- if (UNEXPECTED(retval == NULL)) {
- return NULL;
- }
-
- if (varname_type == IS_CONST) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce, retval);
+ break;
+ case BP_VAR_RW:
+ case BP_VAR_W:
+ ZVAL_UNDEF(result);
+ zend_throw_error(NULL, "Cannot re-assign $this");
+ break;
+ case BP_VAR_UNSET:
+ ZVAL_UNDEF(result);
+ zend_throw_error(NULL, "Cannot unset $this");
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
}
-
- return retval;
}
+
#if ZEND_INTENSIVE_DEBUGGING
#define CHECK_SYMBOL_TABLES() \
@@ -2099,23 +2354,24 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{
static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
{
zval *cv = EX_VAR_NUM(0);
- zval *end = cv + EX(func)->op_array.last_var;
- while (EXPECTED(cv != end)) {
+ int count = EX(func)->op_array.last_var;
+ while (EXPECTED(count != 0)) {
if (Z_REFCOUNTED_P(cv)) {
zend_refcounted *r = Z_COUNTED_P(cv);
- if (!--GC_REFCOUNT(r)) {
+ if (!GC_DELREF(r)) {
ZVAL_NULL(cv);
- zval_dtor_func(r);
+ rc_dtor_func(r);
} else {
gc_check_possible_root(r);
}
}
cv++;
- }
+ count--;
+ }
}
/* }}} */
-void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
+ZEND_API void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
{
i_free_compiled_variables(execute_data);
}
@@ -2153,12 +2409,75 @@ void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
* +----------------------------------------+
*/
-static zend_always_inline void i_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */
+static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D)
+{
+ zend_op_array *op_array = &EX(func)->op_array;
+ uint32_t first_extra_arg = op_array->num_args;
+ uint32_t num_args = EX_NUM_ARGS();
+ zval *src;
+ size_t delta;
+ uint32_t count;
+ uint32_t type_flags = 0;
+
+ if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) {
+ /* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ opline += first_extra_arg;
+#else
+ EX(opline) += first_extra_arg;
+#endif
+
+ }
+
+ /* move extra args into separate array after all CV and TMP vars */
+ src = EX_VAR_NUM(num_args - 1);
+ delta = op_array->last_var + op_array->T - first_extra_arg;
+ count = num_args - first_extra_arg;
+ if (EXPECTED(delta != 0)) {
+ delta *= sizeof(zval);
+ do {
+ type_flags |= Z_TYPE_INFO_P(src);
+ ZVAL_COPY_VALUE((zval*)(((char*)src) + delta), src);
+ ZVAL_UNDEF(src);
+ src--;
+ } while (--count);
+ if (Z_TYPE_INFO_REFCOUNTED(type_flags)) {
+ ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS);
+ }
+ } else {
+ do {
+ if (Z_REFCOUNTED_P(src)) {
+ ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS);
+ break;
+ }
+ src--;
+ } while (--count);
+ }
+}
+
+static zend_always_inline void zend_init_cvs(uint32_t first, uint32_t last EXECUTE_DATA_DC)
+{
+ if (EXPECTED(first < last)) {
+ uint32_t count = last - first;
+ zval *var = EX_VAR_NUM(first);
+
+ do {
+ ZVAL_UNDEF(var);
+ var++;
+ } while (--count);
+ }
+}
+
+static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array, zval *return_value, zend_bool may_be_trampoline EXECUTE_DATA_DC) /* {{{ */
{
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ opline = op_array->opcodes;
+#else
EX(opline) = op_array->opcodes;
+#endif
EX(call) = NULL;
EX(return_value) = return_value;
@@ -2166,55 +2485,27 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
first_extra_arg = op_array->num_args;
num_args = EX_NUM_ARGS();
if (UNEXPECTED(num_args > first_extra_arg)) {
- if (EXPECTED(!(op_array->fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))) {
- zval *end, *src, *dst;
- uint32_t type_flags = 0;
-
- if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) {
- /* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */
- EX(opline) += first_extra_arg;
- }
-
- /* move extra args into separate array after all CV and TMP vars */
- end = EX_VAR_NUM(first_extra_arg - 1);
- src = end + (num_args - first_extra_arg);
- dst = src + (op_array->last_var + op_array->T - first_extra_arg);
- if (EXPECTED(src != dst)) {
- do {
- type_flags |= Z_TYPE_INFO_P(src);
- ZVAL_COPY_VALUE(dst, src);
- ZVAL_UNDEF(src);
- src--;
- dst--;
- } while (src != end);
- } else {
- do {
- type_flags |= Z_TYPE_INFO_P(src);
- src--;
- } while (src != end);
- }
- ZEND_ADD_CALL_FLAG(execute_data, ((type_flags >> Z_TYPE_FLAGS_SHIFT) & IS_TYPE_REFCOUNTED));
+ if (!may_be_trampoline || EXPECTED(!(op_array->fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))) {
+ zend_copy_extra_args(EXECUTE_DATA_C);
}
} else if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) {
/* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ opline += num_args;
+#else
EX(opline) += num_args;
+#endif
}
/* Initialize CV variables (skip arguments) */
- if (EXPECTED((int)num_args < op_array->last_var)) {
- zval *var = EX_VAR_NUM(num_args);
- zval *end = EX_VAR_NUM(op_array->last_var);
-
- do {
- ZVAL_UNDEF(var);
- var++;
- } while (var != end);
- }
+ zend_init_cvs(num_args, op_array->last_var EXECUTE_DATA_CC);
EX_LOAD_RUN_TIME_CACHE(op_array);
- EX_LOAD_LITERALS(op_array);
EG(current_execute_data) = execute_data;
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ EX(opline) = opline;
+#endif
}
/* }}} */
@@ -2226,6 +2517,64 @@ static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache(zend_op_arr
}
/* }}} */
+static zend_always_inline zend_function* ZEND_FASTCALL init_func_run_time_cache_i(zval *zv) /* {{{ */
+{
+ zend_op_array *op_array = Z_PTR_P(zv);
+
+ ZEND_ASSERT(op_array->run_time_cache == NULL);
+ if (op_array->fn_flags & ZEND_ACC_IMMUTABLE) {
+ zend_op_array *new_op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array) + op_array->cache_size);
+
+ Z_PTR_P(zv) = new_op_array;
+ memcpy(new_op_array, op_array, sizeof(zend_op_array));
+ new_op_array->fn_flags &= ~ZEND_ACC_IMMUTABLE;
+ new_op_array->run_time_cache = (void**)(new_op_array + 1);
+ memset(new_op_array->run_time_cache, 0, new_op_array->cache_size);
+ return (zend_function*)new_op_array;
+ } else {
+ op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
+ memset(op_array->run_time_cache, 0, op_array->cache_size);
+ return (zend_function*)op_array;
+ }
+}
+/* }}} */
+
+static zend_never_inline zend_function* init_func_run_time_cache_ex(zval *zv) /* {{{ */
+{
+ return init_func_run_time_cache_i(zv);
+}
+/* }}} */
+
+ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name) /* {{{ */
+{
+ zval *zv = zend_hash_find(EG(function_table), name);
+
+ if (EXPECTED(zv != NULL)) {
+ zend_function *fbc = Z_FUNC_P(zv);
+
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ fbc = (zend_function*)init_func_run_time_cache_i(zv);
+ }
+ return fbc;
+ }
+ return NULL;
+} /* }}} */
+
+ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name, size_t len) /* {{{ */
+{
+ zval *zv = zend_hash_str_find(EG(function_table), name, len);
+
+ if (EXPECTED(zv != NULL)) {
+ zend_function *fbc = Z_FUNC_P(zv);
+
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ fbc = (zend_function*)init_func_run_time_cache_i(zv);
+ }
+ return fbc;
+ }
+ return NULL;
+} /* }}} */
+
static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */
{
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
@@ -2241,20 +2590,32 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
memset(op_array->run_time_cache, 0, op_array->cache_size);
}
EX_LOAD_RUN_TIME_CACHE(op_array);
- EX_LOAD_LITERALS(op_array);
EG(current_execute_data) = execute_data;
}
/* }}} */
-ZEND_API void zend_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */
+ZEND_API void zend_init_func_execute_data(zend_execute_data *ex, zend_op_array *op_array, zval *return_value) /* {{{ */
{
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ zend_execute_data *orig_execute_data = execute_data;
+ const zend_op *orig_opline = opline;
+ execute_data = ex;
+#else
+ zend_execute_data *execute_data = ex;
+#endif
+
EX(prev_execute_data) = EG(current_execute_data);
if (!op_array->run_time_cache) {
- op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
- memset(op_array->run_time_cache, 0, op_array->cache_size);
+ init_func_run_time_cache(op_array);
}
- i_init_func_execute_data(execute_data, op_array, return_value);
+ i_init_func_execute_data(op_array, return_value, 1 EXECUTE_DATA_CC);
+
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+ EX(opline) = opline;
+ opline = orig_opline;
+ execute_data = orig_execute_data;
+#endif
}
/* }}} */
@@ -2279,14 +2640,12 @@ ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_ar
}
/* }}} */
-static zend_always_inline zend_bool zend_is_by_ref_func_arg_fetch(const zend_op *opline, zend_execute_data *call) /* {{{ */
+static zend_always_inline zend_bool zend_is_by_ref_func_arg_fetch(uint32_t arg_num, zend_function *func) /* {{{ */
{
- uint32_t arg_num = opline->extended_value & ZEND_FETCH_ARG_MASK;
-
if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- return QUICK_ARG_SHOULD_BE_SENT_BY_REF(call->func, arg_num);
+ return QUICK_ARG_SHOULD_BE_SENT_BY_REF(func, arg_num);
}
- return ARG_SHOULD_BE_SENT_BY_REF(call->func, arg_num);
+ return ARG_SHOULD_BE_SENT_BY_REF(func, arg_num);
}
/* }}} */
@@ -2399,6 +2758,7 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
case ZEND_SEND_VAL_EX:
case ZEND_SEND_VAR:
case ZEND_SEND_VAR_EX:
+ case ZEND_SEND_FUNC_ARG:
case ZEND_SEND_REF:
case ZEND_SEND_VAR_NO_REF:
case ZEND_SEND_VAR_NO_REF_EX:
@@ -2453,7 +2813,7 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
- GC_REFCOUNT(Z_OBJ(call->This))--;
+ GC_DELREF(Z_OBJ(call->This));
if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
zend_object_store_ctor_failed(Z_OBJ(call->This));
}
@@ -2461,9 +2821,9 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
OBJ_RELEASE(Z_OBJ(call->This));
}
if (call->func->common.fn_flags & ZEND_ACC_CLOSURE) {
- zend_object_release((zend_object *) call->func->common.prototype);
+ zend_object_release(ZEND_CLOSURE_OBJECT(call->func));
} else if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release(call->func->common.function_name);
+ zend_string_release_ex(call->func->common.function_name, 0);
zend_free_trampoline(call->func);
}
@@ -2475,6 +2835,20 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
}
/* }}} */
+static const zend_live_range *find_live_range(const zend_op_array *op_array, uint32_t op_num, uint32_t var_num) /* {{{ */
+{
+ int i;
+ for (i = 0; i < op_array->last_live_range; i++) {
+ const zend_live_range *range = &op_array->live_range[i];
+ if (op_num >= range->start && op_num < range->end
+ && var_num == (range->var & ~ZEND_LIVE_MASK)) {
+ return range;
+ }
+ }
+ return NULL;
+}
+/* }}} */
+
static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num) /* {{{ */
{
int i;
@@ -2506,11 +2880,11 @@ static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num,
last--;
}
if (last->opcode == ZEND_ROPE_INIT) {
- zend_string_release(*rope);
+ zend_string_release_ex(*rope, 0);
} else {
int j = last->extended_value;
do {
- zend_string_release(rope[j]);
+ zend_string_release_ex(rope[j], 0);
} while (j--);
}
} else if (kind == ZEND_LIVE_SILENCE) {
@@ -2525,7 +2899,7 @@ static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num,
}
/* }}} */
-void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num) {
+ZEND_API void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num) {
cleanup_unfinished_calls(execute_data, op_num);
cleanup_live_vars(execute_data, op_num, catch_op_num);
}
@@ -2564,7 +2938,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
called_scope = zend_fetch_class_by_name(lcname, NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(called_scope == NULL)) {
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
return NULL;
}
@@ -2577,32 +2951,25 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(called_scope->name), ZSTR_VAL(mname));
+ zend_undefined_method(called_scope, mname);
}
- zend_string_release(lcname);
- zend_string_release(mname);
+ zend_string_release_ex(lcname, 0);
+ zend_string_release_ex(mname, 0);
return NULL;
}
- zend_string_release(lcname);
- zend_string_release(mname);
+ zend_string_release_ex(lcname, 0);
+ zend_string_release_ex(mname, 0);
if (UNEXPECTED(!(fbc->common.fn_flags & ZEND_ACC_STATIC))) {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- return NULL;
- }
- } else {
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
return NULL;
}
}
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
} else {
if (ZSTR_VAL(function)[0] == '\\') {
lcname = zend_string_alloc(ZSTR_LEN(function) - 1, 0);
@@ -2612,19 +2979,18 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
}
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
zend_throw_error(NULL, "Call to undefined function %s()", ZSTR_VAL(function));
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
return NULL;
}
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
fbc = Z_FUNC_P(func);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ fbc = init_func_run_time_cache_ex(func);
+ }
called_scope = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
-
return zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC,
fbc, num_args, called_scope, NULL);
}
@@ -2642,15 +3008,14 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval *
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
- ZEND_ASSERT(GC_TYPE((zend_object*)fbc->common.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)fbc->common.prototype)++;
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(fbc));
call_info |= ZEND_CALL_CLOSURE;
if (fbc->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
}
} else if (object) {
call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ GC_ADDREF(object); /* For $this pointer */
}
} else {
zend_throw_error(NULL, "Function name must be a string");
@@ -2710,23 +3075,13 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(called_scope->name), Z_STRVAL_P(method));
+ zend_undefined_method(called_scope, Z_STR_P(method));
}
return NULL;
}
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- return NULL;
- }
- } else {
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
return NULL;
}
}
@@ -2737,7 +3092,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
fbc = Z_OBJ_HT_P(obj)->get_method(&object, Z_STR_P(method), NULL);
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(object->ce->name), Z_STRVAL_P(method));
+ zend_undefined_method(object->ce, Z_STR_P(method));
}
return NULL;
}
@@ -2746,7 +3101,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
object = NULL;
} else {
call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ GC_ADDREF(object); /* For $this pointer */
}
}
} else {
@@ -2772,76 +3127,81 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
ZVAL_UNDEF(&tmp_inc_filename);
if (Z_TYPE_P(inc_filename) != IS_STRING) {
- ZVAL_STR(&tmp_inc_filename, zval_get_string(inc_filename));
+ ZVAL_STR(&tmp_inc_filename, zval_get_string_func(inc_filename));
inc_filename = &tmp_inc_filename;
}
- if (type != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
- if (type == ZEND_INCLUDE_ONCE || type == ZEND_INCLUDE) {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
- } else {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename));
- }
- } else {
- switch (type) {
- case ZEND_INCLUDE_ONCE:
- case ZEND_REQUIRE_ONCE: {
- zend_file_handle file_handle;
- zend_string *resolved_path;
-
- resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), (int)Z_STRLEN_P(inc_filename));
- if (resolved_path) {
- if (zend_hash_exists(&EG(included_files), resolved_path)) {
- goto already_compiled;
- }
- } else {
- resolved_path = zend_string_copy(Z_STR_P(inc_filename));
+ switch (type) {
+ case ZEND_INCLUDE_ONCE:
+ case ZEND_REQUIRE_ONCE: {
+ zend_file_handle file_handle;
+ zend_string *resolved_path;
+
+ resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
+ if (EXPECTED(resolved_path)) {
+ if (zend_hash_exists(&EG(included_files), resolved_path)) {
+ goto already_compiled;
}
+ } else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
+ zend_message_dispatcher(
+ (type == ZEND_INCLUDE_ONCE) ?
+ ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
+ Z_STRVAL_P(inc_filename));
+ break;
+ } else {
+ resolved_path = zend_string_copy(Z_STR_P(inc_filename));
+ }
- if (SUCCESS == zend_stream_open(ZSTR_VAL(resolved_path), &file_handle)) {
+ if (SUCCESS == zend_stream_open(ZSTR_VAL(resolved_path), &file_handle)) {
- if (!file_handle.opened_path) {
- file_handle.opened_path = zend_string_copy(resolved_path);
- }
+ if (!file_handle.opened_path) {
+ file_handle.opened_path = zend_string_copy(resolved_path);
+ }
- if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path)) {
- zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE));
- zend_destroy_file_handle(&file_handle);
- zend_string_release(resolved_path);
- if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp_inc_filename));
- }
- return op_array;
- } else {
- zend_file_handle_dtor(&file_handle);
-already_compiled:
- new_op_array = ZEND_FAKE_OP_ARRAY;
+ if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path)) {
+ zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE));
+ zend_destroy_file_handle(&file_handle);
+ zend_string_release_ex(resolved_path, 0);
+ if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
+ zval_ptr_dtor_str(&tmp_inc_filename);
}
+ return op_array;
} else {
- if (type == ZEND_INCLUDE_ONCE) {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
- } else {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename));
- }
+ zend_file_handle_dtor(&file_handle);
+already_compiled:
+ new_op_array = ZEND_FAKE_OP_ARRAY;
}
- zend_string_release(resolved_path);
- }
- break;
- case ZEND_INCLUDE:
- case ZEND_REQUIRE:
- new_op_array = compile_filename(type, inc_filename);
- break;
- case ZEND_EVAL: {
- char *eval_desc = zend_make_compiled_string_description("eval()'d code");
- new_op_array = zend_compile_string(inc_filename, eval_desc);
- efree(eval_desc);
+ } else {
+ zend_message_dispatcher(
+ (type == ZEND_INCLUDE_ONCE) ?
+ ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
+ Z_STRVAL_P(inc_filename));
}
+ zend_string_release_ex(resolved_path, 0);
+ }
+ break;
+ case ZEND_INCLUDE:
+ case ZEND_REQUIRE:
+ if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
+ zend_message_dispatcher(
+ (type == ZEND_INCLUDE) ?
+ ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
+ Z_STRVAL_P(inc_filename));
break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
+ }
+ new_op_array = compile_filename(type, inc_filename);
+ break;
+ case ZEND_EVAL: {
+ char *eval_desc = zend_make_compiled_string_description("eval()'d code");
+ new_op_array = zend_compile_string(inc_filename, eval_desc);
+ efree(eval_desc);
+ }
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
}
+
if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp_inc_filename));
+ zval_ptr_dtor_str(&tmp_inc_filename);
}
return new_op_array;
}
@@ -2856,7 +3216,7 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
if (UNEXPECTED(Z_TYPE(call->This) != IS_OBJECT)) {
zend_vm_stack_free_args(call);
if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
- zend_string_release(fbc->common.function_name);
+ zend_string_release_ex(fbc->common.function_name, 0);
}
efree(fbc);
zend_vm_stack_free_call_frame(call);
@@ -2876,7 +3236,7 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
zend_vm_stack_free_args(call);
if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
- zend_string_release(fbc->common.function_name);
+ zend_string_release_ex(fbc->common.function_name, 0);
}
efree(fbc);
@@ -2884,6 +3244,168 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
}
/* }}} */
+static zend_never_inline zend_bool ZEND_FASTCALL zend_fe_reset_iterator(zval *array_ptr, int by_ref OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
+{
+ zend_class_entry *ce = Z_OBJCE_P(array_ptr);
+ zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, by_ref);
+ zend_bool is_empty;
+
+ if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
+ if (iter) {
+ OBJ_RELEASE(&iter->std);
+ }
+ if (!EG(exception)) {
+ zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
+ }
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ return 1;
+ }
+
+ iter->index = 0;
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ return 1;
+ }
+ }
+
+ is_empty = iter->funcs->valid(iter) != SUCCESS;
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ OBJ_RELEASE(&iter->std);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ return 1;
+ }
+ iter->index = -1; /* will be set to 0 before using next handler */
+
+ ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
+ Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+
+ return is_empty;
+}
+/* }}} */
+
+static zend_always_inline int _zend_quick_get_constant(
+ const zval *key, uint32_t flags, int check_defined_only OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
+{
+ zval *zv;
+ const zval *orig_key = key;
+ zend_constant *c = NULL;
+
+ zv = zend_hash_find_ex(EG(zend_constants), Z_STR_P(key), 1);
+ if (zv) {
+ c = (zend_constant*)Z_PTR_P(zv);
+ } else {
+ key++;
+ zv = zend_hash_find_ex(EG(zend_constants), Z_STR_P(key), 1);
+ if (zv && (ZEND_CONSTANT_FLAGS((zend_constant*)Z_PTR_P(zv)) & CONST_CS) == 0) {
+ c = (zend_constant*)Z_PTR_P(zv);
+ } else {
+ if ((flags & (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) == (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) {
+ key++;
+ zv = zend_hash_find_ex(EG(zend_constants), Z_STR_P(key), 1);
+ if (zv) {
+ c = (zend_constant*)Z_PTR_P(zv);
+ } else {
+ key++;
+ zv = zend_hash_find_ex(EG(zend_constants), Z_STR_P(key), 1);
+ if (zv && (ZEND_CONSTANT_FLAGS((zend_constant*)Z_PTR_P(zv)) & CONST_CS) == 0) {
+ c = (zend_constant*)Z_PTR_P(zv);
+ }
+ }
+ }
+ }
+ }
+
+ if (!c) {
+ if (!check_defined_only) {
+ if ((opline->op1.num & IS_CONSTANT_UNQUALIFIED) != 0) {
+ char *actual = (char *)zend_memrchr(Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)), '\\', Z_STRLEN_P(RT_CONSTANT(opline, opline->op2)));
+ if (!actual) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_STR_P(RT_CONSTANT(opline, opline->op2)));
+ } else {
+ actual++;
+ ZVAL_STRINGL(EX_VAR(opline->result.var),
+ actual, Z_STRLEN_P(RT_CONSTANT(opline, opline->op2)) - (actual - Z_STRVAL_P(RT_CONSTANT(opline, opline->op2))));
+ }
+ /* non-qualified constant - allow text substitution */
+ zend_error(E_WARNING, "Use of undefined constant %s - assumed '%s' (this will throw an Error in a future version of PHP)",
+ Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var)));
+ } else {
+ zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ }
+ }
+ return FAILURE;
+ }
+
+ if (!check_defined_only) {
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value);
+ if (!(ZEND_CONSTANT_FLAGS(c) & (CONST_CS|CONST_CT_SUBST))) {
+ const char *ns_sep;
+ size_t shortname_offset;
+ size_t shortname_len;
+ zend_bool is_deprecated;
+
+ if (flags & IS_CONSTANT_UNQUALIFIED) {
+ const zval *access_key;
+
+ if (!(flags & IS_CONSTANT_IN_NAMESPACE)) {
+ access_key = orig_key - 1;
+ } else {
+ if (key < orig_key + 2) {
+ goto check_short_name;
+ } else {
+ access_key = orig_key + 2;
+ }
+ }
+ is_deprecated = !zend_string_equals(c->name, Z_STR_P(access_key));
+ } else {
+check_short_name:
+ ns_sep = zend_memrchr(ZSTR_VAL(c->name), '\\', ZSTR_LEN(c->name));
+ ZEND_ASSERT(ns_sep);
+ /* Namespaces are always case-insensitive. Only compare shortname. */
+ shortname_offset = ns_sep - ZSTR_VAL(c->name) + 1;
+ shortname_len = ZSTR_LEN(c->name) - shortname_offset;
+
+ is_deprecated = memcmp(ZSTR_VAL(c->name) + shortname_offset, Z_STRVAL_P(orig_key - 1) + shortname_offset, shortname_len) != 0;
+ }
+
+ if (is_deprecated) {
+ zend_error(E_DEPRECATED,
+ "Case-insensitive constants are deprecated. "
+ "The correct casing for this constant is \"%s\"",
+ ZSTR_VAL(c->name));
+ return SUCCESS;
+ }
+ }
+ }
+
+ CACHE_PTR(opline->extended_value, c);
+ return SUCCESS;
+}
+/* }}} */
+
+static zend_never_inline void ZEND_FASTCALL zend_quick_get_constant(
+ const zval *key, uint32_t flags OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
+{
+ _zend_quick_get_constant(key, flags, 0 OPLINE_CC EXECUTE_DATA_CC);
+} /* }}} */
+
+static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
+ const zval *key OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
+{
+ return _zend_quick_get_constant(key, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+} /* }}} */
+
+#ifdef ZEND_VM_TRACE_HANDLERS
+# include "zend_vm_trace_handlers.h"
+#elif defined(ZEND_VM_TRACE_MAP)
+# include "zend_vm_trace_map.h"
+#endif
+
#define ZEND_VM_NEXT_OPCODE_EX(check_exception, skip) \
CHECK_SYMBOL_TABLES() \
if (check_exception) { \
@@ -2911,14 +3433,17 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
#define ZEND_VM_SET_RELATIVE_OPCODE(opline, offset) \
ZEND_VM_SET_OPCODE(ZEND_OFFSET_TO_OPLINE(opline, offset))
-#define ZEND_VM_JMP(new_op) do { \
- if (UNEXPECTED(EG(exception))) { \
+#define ZEND_VM_JMP_EX(new_op, check_exception) do { \
+ if (check_exception && UNEXPECTED(EG(exception))) { \
HANDLE_EXCEPTION(); \
} \
ZEND_VM_SET_OPCODE(new_op); \
ZEND_VM_CONTINUE(); \
} while (0)
+#define ZEND_VM_JMP(new_op) \
+ ZEND_VM_JMP_EX(new_op, 1)
+
#define ZEND_VM_INC_OPCODE() \
OPLINE++
@@ -3003,8 +3528,18 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
} \
} while (0)
+#if ZEND_GCC_VERSION >= 4000 && !defined(__clang__)
+# pragma GCC push_options
+# pragma GCC optimize("no-gcse")
+# pragma GCC optimize("no-ivopts")
+#endif
+
#include "zend_vm_execute.h"
+#if ZEND_GCC_VERSION >= 4000 && !defined(__clang__)
+# pragma GCC pop_options
+#endif
+
ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler)
{
if (opcode != ZEND_USER_OPCODE) {
@@ -3025,13 +3560,13 @@ ZEND_API user_opcode_handler_t zend_get_user_opcode_handler(zend_uchar opcode)
return zend_user_opcode_handlers[opcode];
}
-ZEND_API zval *zend_get_zval_ptr(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type)
+ZEND_API zval *zend_get_zval_ptr(const zend_op *opline, int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type)
{
zval *ret;
switch (op_type) {
case IS_CONST:
- ret = EX_CONSTANT(*node);
+ ret = RT_CONSTANT(opline, *node);
*should_free = NULL;
break;
case IS_TMP_VAR:
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 51a6dc84d5..af329194bc 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_EXECUTE_H
#define ZEND_EXECUTE_H
@@ -85,25 +83,29 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
if (ZEND_CONST_COND(value_type & (IS_VAR|IS_CV), 1) && variable_ptr == value) {
if (value_type == IS_VAR && ref) {
ZEND_ASSERT(GC_REFCOUNT(ref) > 1);
- --GC_REFCOUNT(ref);
+ GC_DELREF(ref);
}
return variable_ptr;
}
garbage = Z_COUNTED_P(variable_ptr);
- if (--GC_REFCOUNT(garbage) == 0) {
+ if (GC_DELREF(garbage) == 0) {
ZVAL_COPY_VALUE(variable_ptr, value);
- if (value_type & (IS_CONST|IS_CV)) {
+ if (ZEND_CONST_COND(value_type == IS_CONST, 0)) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
Z_ADDREF_P(variable_ptr);
}
+ } else if (value_type & (IS_CONST|IS_CV)) {
+ if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
+ Z_ADDREF_P(variable_ptr);
+ }
} else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) {
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
Z_ADDREF_P(variable_ptr);
}
}
- zval_dtor_func(garbage);
+ rc_dtor_func(garbage);
return variable_ptr;
} else { /* we need to split */
/* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
@@ -115,12 +117,16 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
} while (0);
ZVAL_COPY_VALUE(variable_ptr, value);
- if (value_type & (IS_CONST|IS_CV)) {
+ if (ZEND_CONST_COND(value_type == IS_CONST, 0)) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
Z_ADDREF_P(variable_ptr);
}
+ } else if (value_type & (IS_CONST|IS_CV)) {
+ if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
+ Z_ADDREF_P(variable_ptr);
+ }
} else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) {
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
Z_ADDREF_P(variable_ptr);
@@ -131,6 +137,7 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
ZEND_API int zval_update_constant(zval *pp);
ZEND_API int zval_update_constant_ex(zval *pp, zend_class_entry *scope);
+ZEND_API int zend_use_undefined_constant(zend_string *name, zend_ast_attr attr, zval *result);
/* dedicated Zend executor functions - do not use! */
struct _zend_vm_stack {
@@ -161,6 +168,7 @@ struct _zend_vm_stack {
#endif
ZEND_API void zend_vm_stack_init(void);
+ZEND_API void zend_vm_stack_init_ex(size_t page_size);
ZEND_API void zend_vm_stack_destroy(void);
ZEND_API void* zend_vm_stack_extend(size_t size);
@@ -216,20 +224,20 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint3
static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_info, zend_execute_data *call)
{
if (UNEXPECTED(call_info & ZEND_CALL_FREE_EXTRA_ARGS)) {
- zval *end = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T);
- zval *p = end + (ZEND_CALL_NUM_ARGS(call) - call->func->op_array.num_args);
+ uint32_t count = ZEND_CALL_NUM_ARGS(call) - call->func->op_array.num_args;
+ zval *p = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T);
do {
- p--;
if (Z_REFCOUNTED_P(p)) {
zend_refcounted *r = Z_COUNTED_P(p);
- if (!--GC_REFCOUNT(r)) {
+ if (!GC_DELREF(r)) {
ZVAL_NULL(p);
- zval_dtor_func(r);
+ rc_dtor_func(r);
} else {
gc_check_possible_root(r);
}
}
- } while (p != end);
+ p++;
+ } while (--count);
}
}
@@ -243,19 +251,18 @@ static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call)
uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
if (EXPECTED(num_args > 0)) {
- zval *end = ZEND_CALL_ARG(call, 1);
- zval *p = end + num_args;
+ zval *p = ZEND_CALL_ARG(call, 1);
do {
- p--;
if (Z_REFCOUNTED_P(p)) {
- if (!Z_DELREF_P(p)) {
- zend_refcounted *r = Z_COUNTED_P(p);
+ zend_refcounted *r = Z_COUNTED_P(p);
+ if (!GC_DELREF(r)) {
ZVAL_NULL(p);
- zval_dtor_func(r);
+ rc_dtor_func(r);
}
}
- } while (p != end);
+ p++;
+ } while (--num_args);
}
}
@@ -300,6 +307,9 @@ ZEND_API zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_t
ZEND_API zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, const zval *key, int fetch_type);
void zend_verify_abstract_class(zend_class_entry *ce);
+ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name);
+ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name, size_t len);
+
ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type);
ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data_ptr, uint32_t var);
@@ -318,11 +328,11 @@ ZEND_API user_opcode_handler_t zend_get_user_opcode_handler(zend_uchar opcode);
/* former zend_execute_locks.h */
typedef zval* zend_free_op;
-ZEND_API zval *zend_get_zval_ptr(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type);
+ZEND_API zval *zend_get_zval_ptr(const zend_op *opline, int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type);
ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table);
-void zend_free_compiled_variables(zend_execute_data *execute_data);
-void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num);
+ZEND_API void zend_free_compiled_variables(zend_execute_data *execute_data);
+ZEND_API void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num);
ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zval *ret);
@@ -362,6 +372,23 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
(slot)[1] = (ptr); \
} while (0)
+#define CACHE_SPECIAL (1<<0)
+
+#define IS_SPECIAL_CACHE_VAL(ptr) \
+ (((uintptr_t)(ptr)) & CACHE_SPECIAL)
+
+#define ENCODE_SPECIAL_CACHE_NUM(num) \
+ ((void*)((((uintptr_t)(num)) << 1) | CACHE_SPECIAL))
+
+#define DECODE_SPECIAL_CACHE_NUM(ptr) \
+ (((uintptr_t)(ptr)) >> 1)
+
+#define ENCODE_SPECIAL_CACHE_PTR(ptr) \
+ ((void*)(((uintptr_t)(ptr)) | CACHE_SPECIAL))
+
+#define DECODE_SPECIAL_CACHE_PTR(ptr) \
+ ((void*)(((uintptr_t)(ptr)) & ~CACHE_SPECIAL))
+
#define SKIP_EXT_OPLINE(opline) do { \
while (UNEXPECTED((opline)->opcode >= ZEND_EXT_STMT \
&& (opline)->opcode <= ZEND_TICKS)) { \
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 9f10843b6b..a551449e79 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <stdio.h>
#include <signal.h>
@@ -47,7 +45,7 @@ ZEND_API void (*zend_execute_internal)(zend_execute_data *execute_data, zval *re
/* true globals */
ZEND_API const zend_fcall_info empty_fcall_info = { 0, {{0}, {{0}}, {0}}, NULL, NULL, NULL, 0, 0 };
-ZEND_API const zend_fcall_info_cache empty_fcall_info_cache = { 0, NULL, NULL, NULL, NULL };
+ZEND_API const zend_fcall_info_cache empty_fcall_info_cache = { NULL, NULL, NULL, NULL };
#ifdef ZEND_WIN32
ZEND_TLS HANDLE tq_timer = NULL;
@@ -103,7 +101,7 @@ static void zend_extension_deactivator(zend_extension *extension) /* {{{ */
static int clean_non_persistent_constant_full(zval *zv) /* {{{ */
{
zend_constant *c = Z_PTR_P(zv);
- return (c->flags & CONST_PERSISTENT) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE;
+ return (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE;
}
/* }}} */
@@ -181,6 +179,10 @@ void init_executor(void) /* {{{ */
EG(each_deprecation_thrown) = 0;
+ EG(persistent_constants_count) = EG(zend_constants)->nNumUsed;
+ EG(persistent_functions_count) = EG(function_table)->nNumUsed;
+ EG(persistent_classes_count) = EG(class_table)->nNumUsed;
+
EG(active) = 1;
}
/* }}} */
@@ -279,31 +281,15 @@ void shutdown_executor(void) /* {{{ */
* Zend Memory Manager frees memory by its own. We don't have to free
* each allocated block separately.
*/
- ZEND_HASH_REVERSE_FOREACH_VAL(EG(zend_constants), zv) {
- zend_constant *c = Z_PTR_P(zv);
- if (c->flags & CONST_PERSISTENT) {
- break;
- }
- } ZEND_HASH_FOREACH_END_DEL();
- ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) {
- zend_function *func = Z_PTR_P(zv);
- if (func->type == ZEND_INTERNAL_FUNCTION) {
- break;
- }
- } ZEND_HASH_FOREACH_END_DEL();
- ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
- zend_class_entry *ce = Z_PTR_P(zv);
- if (ce->type == ZEND_INTERNAL_CLASS) {
- break;
- }
- } ZEND_HASH_FOREACH_END_DEL();
-
+ zend_hash_discard(EG(zend_constants), EG(persistent_constants_count));
+ zend_hash_discard(EG(function_table), EG(persistent_functions_count));
+ zend_hash_discard(EG(class_table), EG(persistent_classes_count));
zend_cleanup_internal_classes();
} else {
zend_hash_graceful_reverse_destroy(&EG(symbol_table));
#if ZEND_DEBUG
- if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
+ if (gc_enabled() && !CG(unclean_shutdown)) {
gc_collect_cycles();
}
#endif
@@ -333,15 +319,15 @@ void shutdown_executor(void) /* {{{ */
} else {
ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(zend_constants), key, zv) {
zend_constant *c = Z_PTR_P(zv);
- if (c->flags & CONST_PERSISTENT) {
+ if (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) {
break;
}
- zval_ptr_dtor(&c->value);
+ zval_ptr_dtor_nogc(&c->value);
if (c->name) {
- zend_string_release(c->name);
+ zend_string_release_ex(c->name, 0);
}
efree(c);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
} ZEND_HASH_FOREACH_END_DEL();
ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(function_table), key, zv) {
zend_function *func = Z_PTR_P(zv);
@@ -349,7 +335,7 @@ void shutdown_executor(void) /* {{{ */
break;
}
destroy_op_array(&func->op_array);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
} ZEND_HASH_FOREACH_END_DEL();
ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) {
zend_class_entry *ce = Z_PTR_P(zv);
@@ -357,7 +343,7 @@ void shutdown_executor(void) /* {{{ */
break;
}
destroy_zend_class(zv);
- zend_string_release(key);
+ zend_string_release_ex(key, 0);
} ZEND_HASH_FOREACH_END_DEL();
}
@@ -528,107 +514,64 @@ ZEND_API zend_bool zend_is_executing(void) /* {{{ */
}
/* }}} */
-ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API int zend_use_undefined_constant(zend_string *name, zend_ast_attr attr, zval *result) /* {{{ */
{
- i_zval_ptr_dtor(zval_ptr ZEND_FILE_LINE_RELAY_CC);
-}
-/* }}} */
+ char *colon;
-ZEND_API void _zval_internal_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
-{
- if (Z_REFCOUNTED_P(zval_ptr)) {
- Z_DELREF_P(zval_ptr);
- if (Z_REFCOUNT_P(zval_ptr) == 0) {
- _zval_internal_dtor_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
+ if (UNEXPECTED(EG(exception))) {
+ return FAILURE;
+ } else if ((colon = (char*)zend_memrchr(ZSTR_VAL(name), ':', ZSTR_LEN(name)))) {
+ zend_throw_error(NULL, "Undefined class constant '%s'", ZSTR_VAL(name));
+ return FAILURE;
+ } else if ((attr & IS_CONSTANT_UNQUALIFIED) == 0) {
+ zend_throw_error(NULL, "Undefined constant '%s'", ZSTR_VAL(name));
+ return FAILURE;
+ } else {
+ char *actual = ZSTR_VAL(name);
+ size_t actual_len = ZSTR_LEN(name);
+ char *slash = (char *) zend_memrchr(actual, '\\', actual_len);
+
+ if (slash) {
+ actual = slash + 1;
+ actual_len -= (actual - ZSTR_VAL(name));
+ }
+
+ zend_error(E_WARNING, "Use of undefined constant %s - assumed '%s' (this will throw an Error in a future version of PHP)", actual, actual);
+ if (EG(exception)) {
+ return FAILURE;
+ } else {
+ zend_string *result_str = zend_string_init(actual, actual_len, 0);
+ zval_ptr_dtor_nogc(result);
+ ZVAL_NEW_STR(result, result_str);
}
}
+ return SUCCESS;
}
/* }}} */
ZEND_API int zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
{
- zval *const_value;
- char *colon;
- zend_bool inline_change;
-
- if (Z_TYPE_P(p) == IS_CONSTANT) {
- if (IS_CONSTANT_VISITED(p)) {
- zend_throw_error(NULL, "Cannot declare self-referencing constant '%s'", Z_STRVAL_P(p));
- return FAILURE;
- }
- inline_change = (Z_TYPE_FLAGS_P(p) & IS_TYPE_REFCOUNTED) != 0;
- SEPARATE_ZVAL_NOREF(p);
- MARK_CONSTANT_VISITED(p);
- if (Z_CONST_FLAGS_P(p) & IS_CONSTANT_CLASS) {
- ZEND_ASSERT(EG(current_execute_data));
- if (inline_change) {
- zend_string_release(Z_STR_P(p));
- }
- if (scope && scope->name) {
- ZVAL_STR_COPY(p, scope->name);
- } else {
- ZVAL_EMPTY_STRING(p);
- }
- } else if (UNEXPECTED((const_value = zend_get_constant_ex(Z_STR_P(p), scope, Z_CONST_FLAGS_P(p))) == NULL)) {
- if (UNEXPECTED(EG(exception))) {
- RESET_CONSTANT_VISITED(p);
- return FAILURE;
- } else if ((colon = (char*)zend_memrchr(Z_STRVAL_P(p), ':', Z_STRLEN_P(p)))) {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(p));
- RESET_CONSTANT_VISITED(p);
- return FAILURE;
- } else {
- if ((Z_CONST_FLAGS_P(p) & IS_CONSTANT_UNQUALIFIED) == 0) {
- zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(p));
- RESET_CONSTANT_VISITED(p);
- return FAILURE;
- } else {
- zend_string *save = Z_STR_P(p);
- char *actual = Z_STRVAL_P(p);
- size_t actual_len = Z_STRLEN_P(p);
- char *slash = (char *) zend_memrchr(actual, '\\', actual_len);
- if (slash) {
- actual = slash + 1;
- actual_len -= (actual - Z_STRVAL_P(p));
- }
+ if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
+ zend_ast *ast = Z_ASTVAL_P(p);
- zend_error(E_WARNING, "Use of undefined constant %s - assumed '%s' (this will throw an Error in a future version of PHP)", actual, actual);
- if (EG(exception)) {
- RESET_CONSTANT_VISITED(p);
- return FAILURE;
- }
+ if (ast->kind == ZEND_AST_CONSTANT) {
+ zend_string *name = zend_ast_get_constant_name(ast);
+ zval *zv = zend_get_constant_ex(name, scope, ast->attr);
- if (!inline_change) {
- ZVAL_STRINGL(p, actual, actual_len);
- } else {
- if (slash) {
- ZVAL_STRINGL(p, actual, actual_len);
- zend_string_release(save);
- } else {
- Z_TYPE_INFO_P(p) = Z_REFCOUNTED_P(p) ?
- IS_STRING_EX : IS_INTERNED_STRING_EX;
- }
- }
- }
+ if (UNEXPECTED(zv == NULL)) {
+ return zend_use_undefined_constant(name, ast->attr, p);
}
+ zval_ptr_dtor_nogc(p);
+ ZVAL_COPY_OR_DUP(p, zv);
} else {
- if (inline_change) {
- zend_string_release(Z_STR_P(p));
- }
- ZVAL_COPY_VALUE(p, const_value);
- zval_opt_copy_ctor(p);
- }
- } else if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
- zval tmp;
+ zval tmp;
- inline_change = (Z_TYPE_FLAGS_P(p) & IS_TYPE_REFCOUNTED) != 0;
- if (UNEXPECTED(zend_ast_evaluate(&tmp, Z_ASTVAL_P(p), scope) != SUCCESS)) {
- return FAILURE;
- }
- if (inline_change) {
- zval_ptr_dtor(p);
+ if (UNEXPECTED(zend_ast_evaluate(&tmp, ast, scope) != SUCCESS)) {
+ return FAILURE;
+ }
+ zval_ptr_dtor_nogc(p);
+ ZVAL_COPY_VALUE(p, &tmp);
}
- ZVAL_COPY_VALUE(p, &tmp);
}
return SUCCESS;
}
@@ -673,13 +616,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
return FAILURE; /* we would result in an instable executor otherwise */
}
- switch (fci->size) {
- case sizeof(zend_fcall_info):
- break; /* nothing to do currently */
- default:
- zend_error_noreturn(E_CORE_ERROR, "Corrupted fcall_info provided to zend_call_function()");
- break;
- }
+ ZEND_ASSERT(fci->size == sizeof(zend_fcall_info));
/* Initialize execute_data */
if (!EG(current_execute_data)) {
@@ -704,7 +641,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
EG(current_execute_data) = &dummy_execute_data;
}
- if (!fci_cache || !fci_cache->initialized) {
+ if (!fci_cache || !fci_cache->function_handler) {
char *error = NULL;
if (!fci_cache) {
@@ -717,7 +654,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
= zend_get_callable_name_ex(&fci->function_name, fci->object);
zend_error(E_WARNING, "Invalid callback %s, %s", ZSTR_VAL(callable_name), error);
efree(error);
- zend_string_release(callable_name);
+ zend_string_release_ex(callable_name, 0);
}
if (EG(current_execute_data) == &dummy_execute_data) {
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
@@ -803,8 +740,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
if (UNEXPECTED(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
uint32_t call_info;
- ZEND_ASSERT(GC_TYPE((zend_object*)func->op_array.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)func->op_array.prototype)++;
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
call_info = ZEND_CALL_CLOSURE;
if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
@@ -821,7 +757,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
EG(opline_before_exception) = current_opline_before_exception;
if (call_via_handler) {
/* We must re-initialize function again */
- fci_cache->initialized = 0;
+ fci_cache->function_handler = NULL;
}
} else if (func->type == ZEND_INTERNAL_FUNCTION) {
int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0;
@@ -845,7 +781,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
if (call_via_handler) {
/* We must re-initialize function again */
- fci_cache->initialized = 0;
+ fci_cache->function_handler = NULL;
}
} else { /* ZEND_OVERLOADED_FUNCTION */
ZVAL_NULL(fci->retval);
@@ -863,7 +799,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
zend_vm_stack_free_args(call);
if (func->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
- zend_string_release(func->common.function_name);
+ zend_string_release_ex(func->common.function_name, 0);
}
efree(func);
@@ -895,7 +831,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *key, int use_autoload) /* {{{ */
{
zend_class_entry *ce = NULL;
- zval args[1];
+ zval args[1], *zv;
zval local_retval;
zend_string *lc_name;
zend_fcall_info fcall_info;
@@ -916,12 +852,12 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
}
}
- ce = zend_hash_find_ptr(EG(class_table), lc_name);
- if (ce) {
+ zv = zend_hash_find(EG(class_table), lc_name);
+ if (zv) {
if (!key) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
}
- return ce;
+ return (zend_class_entry*)Z_PTR_P(zv);
}
/* The compiler is not-reentrant. Make sure we __autoload() only during run-time
@@ -929,18 +865,19 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
*/
if (!use_autoload || zend_is_compiling()) {
if (!key) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
}
return NULL;
}
if (!EG(autoload_func)) {
- zend_function *func = zend_hash_find_ptr(EG(function_table), ZSTR_KNOWN(ZEND_STR_MAGIC_AUTOLOAD));
+ zend_function *func = zend_fetch_function(ZSTR_KNOWN(ZEND_STR_MAGIC_AUTOLOAD));
+
if (func) {
EG(autoload_func) = func;
} else {
if (!key) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
}
return NULL;
}
@@ -949,7 +886,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
/* Verify class name before passing it to __autoload() */
if (!key && strspn(ZSTR_VAL(name), "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\") != ZSTR_LEN(name)) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
return NULL;
}
@@ -960,7 +897,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
if (zend_hash_add_empty_element(EG(in_autoload), lc_name) == NULL) {
if (!key) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
}
return NULL;
}
@@ -981,9 +918,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
fcall_info.object = NULL;
fcall_info.no_separation = 1;
- fcall_cache.initialized = 1;
fcall_cache.function_handler = EG(autoload_func);
- fcall_cache.calling_scope = NULL;
fcall_cache.called_scope = NULL;
fcall_cache.object = NULL;
@@ -994,14 +929,14 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
zend_exception_restore();
zval_ptr_dtor(&args[0]);
- zval_dtor(&fcall_info.function_name);
+ zval_ptr_dtor_str(&fcall_info.function_name);
zend_hash_del(EG(in_autoload), lc_name);
zval_ptr_dtor(&local_retval);
if (!key) {
- zend_string_release(lc_name);
+ zend_string_release_ex(lc_name, 0);
}
return ce;
}
@@ -1055,7 +990,7 @@ ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char
int retval;
if (retval_ptr) {
- ZVAL_NEW_STR(&pv, zend_string_alloc(str_len + sizeof("return ;")-1, 1));
+ ZVAL_NEW_STR(&pv, zend_string_alloc(str_len + sizeof("return ;")-1, 0));
memcpy(Z_STRVAL(pv), "return ", sizeof("return ") - 1);
memcpy(Z_STRVAL(pv) + sizeof("return ") - 1, str, str_len);
Z_STRVAL(pv)[Z_STRLEN(pv) - 1] = ';';
@@ -1106,7 +1041,7 @@ ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char
} else {
retval = FAILURE;
}
- zval_dtor(&pv);
+ zval_ptr_dtor_str(&pv);
return retval;
}
/* }}} */
@@ -1530,12 +1465,11 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
}
zend_hash_extend(symbol_table, ex->func->op_array.last_var, 0);
} else {
- symbol_table = ex->symbol_table = emalloc(sizeof(zend_array));
- zend_hash_init(symbol_table, ex->func->op_array.last_var, NULL, ZVAL_PTR_DTOR, 0);
+ symbol_table = ex->symbol_table = zend_new_array(ex->func->op_array.last_var);
if (!ex->func->op_array.last_var) {
return symbol_table;
}
- zend_hash_real_init(symbol_table, 0);
+ zend_hash_real_init_mixed(symbol_table);
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
if (EXPECTED(ex->func->op_array.last_var)) {
@@ -1566,7 +1500,7 @@ ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data) /* {{{ *
zval *var = EX_VAR_NUM(0);
do {
- zval *zv = zend_hash_find(ht, *str);
+ zval *zv = zend_hash_find_ex(ht, *str, 1);
if (zv) {
if (Z_TYPE_P(zv) == IS_INDIRECT) {
@@ -1632,8 +1566,7 @@ ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force) /* {{
do {
if (ZSTR_H(*str) == h &&
- ZSTR_LEN(*str) == ZSTR_LEN(name) &&
- memcmp(ZSTR_VAL(*str), ZSTR_VAL(name), ZSTR_LEN(name)) == 0) {
+ zend_string_equal_content(*str, name)) {
zval *var = EX_VAR_NUM(str - op_array->vars);
ZVAL_COPY_VALUE(var, value);
return SUCCESS;
@@ -1644,11 +1577,13 @@ ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force) /* {{
if (force) {
zend_array *symbol_table = zend_rebuild_symbol_table();
if (symbol_table) {
- return zend_hash_update(symbol_table, name, value) ? SUCCESS : FAILURE;
+ zend_hash_update(symbol_table, name, value);
+ return SUCCESS;
}
}
} else {
- return (zend_hash_update_ind(execute_data->symbol_table, name, value) != NULL) ? SUCCESS : FAILURE;
+ zend_hash_update_ind(execute_data->symbol_table, name, value);
+ return SUCCESS;
}
}
return FAILURE;
@@ -1686,11 +1621,13 @@ ZEND_API int zend_set_local_var_str(const char *name, size_t len, zval *value, i
if (force) {
zend_array *symbol_table = zend_rebuild_symbol_table();
if (symbol_table) {
- return zend_hash_str_update(symbol_table, name, len, value) ? SUCCESS : FAILURE;
+ zend_hash_str_update(symbol_table, name, len, value);
+ return SUCCESS;
}
}
} else {
- return (zend_hash_str_update_ind(execute_data->symbol_table, name, len, value) != NULL) ? SUCCESS : FAILURE;
+ zend_hash_str_update_ind(execute_data->symbol_table, name, len, value);
+ return SUCCESS;
}
}
return FAILURE;
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c
index cca40dd191..b08cef4326 100644
--- a/Zend/zend_extensions.c
+++ b/Zend/zend_extensions.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend_extensions.h"
ZEND_API zend_llist zend_extensions;
@@ -125,14 +123,6 @@ int zend_load_extension_handle(DL_HANDLE handle, const char *path)
#endif
DL_UNLOAD(handle);
return FAILURE;
- } else if (zend_get_extension(new_extension->name)) {
- fprintf(stderr, "Cannot load %s - extension already loaded\n", new_extension->name);
-/* See http://support.microsoft.com/kb/190351 */
-#ifdef PHP_WIN32
- fflush(stderr);
-#endif
- DL_UNLOAD(handle);
- return FAILURE;
}
return zend_register_extension(new_extension, handle);
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index b865644403..9e0e826e08 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_EXTENSIONS_H
#define ZEND_EXTENSIONS_H
@@ -46,7 +44,7 @@ You can use the following macro to check the extension API version for compatibi
/* The first number is the engine version and the rest is the date (YYYYMMDD).
* This way engine 2/3 API no. is always greater than engine 1 API no.. */
-#define ZEND_EXTENSION_API_NO 320170718
+#define ZEND_EXTENSION_API_NO 320180731
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
diff --git a/Zend/zend_float.c b/Zend/zend_float.c
index 04f2acce8f..649a61c270 100644
--- a/Zend/zend_float.c
+++ b/Zend/zend_float.c
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_compile.h"
#include "zend_float.h"
diff --git a/Zend/zend_float.h b/Zend/zend_float.h
index ef2f2dba56..44c7ff93b8 100644
--- a/Zend/zend_float.h
+++ b/Zend/zend_float.h
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_FLOAT_H
#define ZEND_FLOAT_H
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index 1b6d53a83d..3a36a8cc0d 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -13,13 +13,10 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: David Wang <planetbeing@gmail.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
-
/**
* zend_gc_collect_cycles
* ======================
@@ -51,7 +48,7 @@
* gc_scan_roots will be called, and each root will be called with
* gc_scan(root->ref)
*
- * gc_scan checkes the colors of possible members.
+ * gc_scan checks the colors of possible members.
*
* If the node is marked as grey and the refcount > 0
* gc_scan_black will be called on that node to scan it's subgraph.
@@ -72,23 +69,24 @@
#include "zend.h"
#include "zend_API.h"
-/* one (0) is reserved */
-#define GC_ROOT_BUFFER_MAX_ENTRIES 10001
-
-#define GC_HAS_DESTRUCTORS (1<<0)
+#ifndef GC_BENCH
+# define GC_BENCH 0
+#endif
#ifndef ZEND_GC_DEBUG
# define ZEND_GC_DEBUG 0
#endif
-#ifdef ZTS
-ZEND_API int gc_globals_id;
-#else
-ZEND_API zend_gc_globals gc_globals;
-#endif
+/* GC_INFO layout */
+#define GC_ADDRESS 0x0fffff
+#define GC_COLOR 0x300000
-ZEND_API int (*gc_collect_cycles)(void);
+#define GC_BLACK 0x000000 /* must be zero */
+#define GC_WHITE 0x100000
+#define GC_GREY 0x200000
+#define GC_PURPLE 0x300000
+/* Debug tracing */
#if ZEND_GC_DEBUG > 1
# define GC_TRACE(format, ...) fprintf(stderr, format "\n", ##__VA_ARGS__);
# define GC_TRACE_REF(ref, format, ...) \
@@ -104,16 +102,274 @@ ZEND_API int (*gc_collect_cycles)(void);
# define GC_TRACE(str)
#endif
-#define GC_REF_SET_ADDRESS(ref, a) \
- GC_INFO_SET_ADDRESS(GC_INFO(ref), a)
-#define GC_REF_GET_COLOR(ref) \
- GC_INFO_GET_COLOR(GC_INFO(ref))
-#define GC_REF_SET_COLOR(ref, c) \
- do { GC_TRACE_SET_COLOR(ref, c); GC_INFO_SET_COLOR(GC_INFO(ref), c); } while (0)
-#define GC_REF_SET_BLACK(ref) \
- do { GC_TRACE_SET_COLOR(ref, GC_BLACK); GC_INFO_SET_BLACK(GC_INFO(ref)); } while (0)
-#define GC_REF_SET_PURPLE(ref) \
- do { GC_TRACE_SET_COLOR(ref, GC_PURPLE); GC_INFO_SET_PURPLE(GC_INFO(ref)); } while (0)
+/* GC_INFO access */
+#define GC_REF_ADDRESS(ref) \
+ (((GC_TYPE_INFO(ref)) & (GC_ADDRESS << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
+
+#define GC_REF_COLOR(ref) \
+ (((GC_TYPE_INFO(ref)) & (GC_COLOR << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
+
+#define GC_REF_CHECK_COLOR(ref, color) \
+ ((GC_TYPE_INFO(ref) & (GC_COLOR << GC_INFO_SHIFT)) == ((color) << GC_INFO_SHIFT))
+
+#define GC_REF_SET_INFO(ref, info) do { \
+ GC_TYPE_INFO(ref) = \
+ (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK)) | \
+ ((info) << GC_INFO_SHIFT); \
+ } while (0)
+
+#define GC_REF_SET_COLOR(ref, c) do { \
+ GC_TRACE_SET_COLOR(ref, c); \
+ GC_TYPE_INFO(ref) = \
+ (GC_TYPE_INFO(ref) & ~(GC_COLOR << GC_INFO_SHIFT)) | \
+ ((c) << GC_INFO_SHIFT); \
+ } while (0)
+
+#define GC_REF_SET_BLACK(ref) do { \
+ GC_TRACE_SET_COLOR(ref, GC_BLACK); \
+ GC_TYPE_INFO(ref) &= ~(GC_COLOR << GC_INFO_SHIFT); \
+ } while (0)
+
+#define GC_REF_SET_PURPLE(ref) do { \
+ GC_TRACE_SET_COLOR(ref, GC_PURPLE); \
+ GC_TYPE_INFO(ref) |= (GC_COLOR << GC_INFO_SHIFT); \
+ } while (0)
+
+/* bit stealing tags for gc_root_buffer.ref */
+#define GC_BITS 0x3
+
+#define GC_ROOT 0x0 /* possible root of circular garbage */
+#define GC_UNUSED 0x1 /* part of linked list of unused buffers */
+#define GC_GARBAGE 0x2 /* garbage to delete */
+
+#define GC_GET_PTR(ptr) \
+ ((void*)(((uintptr_t)(ptr)) & ~GC_BITS))
+
+#define GC_IS_ROOT(ptr) \
+ ((((uintptr_t)(ptr)) & GC_BITS) == GC_ROOT)
+#define GC_IS_UNUSED(ptr) \
+ ((((uintptr_t)(ptr)) & GC_BITS) == GC_UNUSED)
+#define GC_IS_GARBAGE(ptr) \
+ ((((uintptr_t)(ptr)) & GC_BITS) == GC_GARBAGE)
+
+#define GC_MAKE_GARBAGE(ptr) \
+ ((void*)(((uintptr_t)(ptr)) | GC_GARBAGE))
+
+/* GC address conversion */
+#define GC_IDX2PTR(idx) (GC_G(buf) + (idx))
+#define GC_PTR2IDX(ptr) ((ptr) - GC_G(buf))
+
+#define GC_IDX2LIST(idx) ((void*)(uintptr_t)(((idx) * sizeof(void*)) | GC_UNUSED))
+#define GC_LIST2IDX(list) (((uint32_t)(uintptr_t)(list)) / sizeof(void*))
+
+/* GC buffers */
+#define GC_INVALID 0
+#define GC_FIRST_ROOT 1
+
+#define GC_DEFAULT_BUF_SIZE (16 * 1024)
+#define GC_BUF_GROW_STEP (128 * 1024)
+
+#define GC_MAX_UNCOMPRESSED (512 * 1024)
+#define GC_MAX_BUF_SIZE 0x40000000
+
+#define GC_THRESHOLD_DEFAULT 10000
+#define GC_THRESHOLD_STEP 10000
+#define GC_THRESHOLD_MAX 1000000000
+#define GC_THRESHOLD_TRIGGER 100
+
+/* GC flags */
+#define GC_HAS_DESTRUCTORS (1<<0)
+
+/* unused buffers */
+#define GC_HAS_UNUSED() \
+ (GC_G(unused) != GC_INVALID)
+#define GC_FETCH_UNUSED() \
+ gc_fetch_unused()
+#define GC_LINK_UNUSED(root) \
+ gc_link_unused(root)
+
+#define GC_HAS_NEXT_UNUSED_UNDER_THRESHOLD() \
+ (GC_G(first_unused) < GC_G(gc_threshold))
+#define GC_HAS_NEXT_UNUSED() \
+ (GC_G(first_unused) != GC_G(buf_size))
+#define GC_FETCH_NEXT_UNUSED() \
+ gc_fetch_next_unused()
+
+ZEND_API int (*gc_collect_cycles)(void);
+
+typedef struct _gc_root_buffer {
+ zend_refcounted *ref;
+} gc_root_buffer;
+
+typedef struct _zend_gc_globals {
+ zend_bool gc_enabled;
+ zend_bool gc_active; /* GC currently running, forbid nested GC */
+ zend_bool gc_protected; /* GC protected, forbid root additions */
+ zend_bool gc_full;
+
+ gc_root_buffer *buf; /* preallocated arrays of buffers */
+ uint32_t unused; /* linked list of unused buffers */
+ uint32_t first_unused; /* first unused buffer */
+ uint32_t gc_threshold; /* GC collection threshold */
+ uint32_t buf_size; /* size of the GC buffer */
+ uint32_t num_roots; /* number of roots in GC buffer */
+
+ uint32_t gc_runs;
+ uint32_t collected;
+
+#if GC_BENCH
+ uint32_t root_buf_length;
+ uint32_t root_buf_peak;
+ uint32_t zval_possible_root;
+ uint32_t zval_buffered;
+ uint32_t zval_remove_from_buffer;
+ uint32_t zval_marked_grey;
+#endif
+} zend_gc_globals;
+
+#ifdef ZTS
+static int gc_globals_id;
+#define GC_G(v) ZEND_TSRMG(gc_globals_id, zend_gc_globals *, v)
+#else
+#define GC_G(v) (gc_globals.v)
+static zend_gc_globals gc_globals;
+#endif
+
+#if GC_BENCH
+# define GC_BENCH_INC(counter) GC_G(counter)++
+# define GC_BENCH_DEC(counter) GC_G(counter)--
+# define GC_BENCH_PEAK(peak, counter) do { \
+ if (GC_G(counter) > GC_G(peak)) { \
+ GC_G(peak) = GC_G(counter); \
+ } \
+ } while (0)
+#else
+# define GC_BENCH_INC(counter)
+# define GC_BENCH_DEC(counter)
+# define GC_BENCH_PEAK(peak, counter)
+#endif
+
+
+#define GC_STACK_SEGMENT_SIZE (((4096 - ZEND_MM_OVERHEAD) / sizeof(void*)) - 2)
+
+typedef struct _gc_stack gc_stack;
+
+struct _gc_stack {
+ gc_stack *prev;
+ gc_stack *next;
+ zend_refcounted *data[GC_STACK_SEGMENT_SIZE];
+};
+
+#define GC_STACK_DCL(init) \
+ gc_stack *_stack = init; \
+ size_t _top = 0;
+
+#define GC_STACK_PUSH(ref) \
+ gc_stack_push(&_stack, &_top, ref);
+
+#define GC_STACK_POP() \
+ gc_stack_pop(&_stack, &_top)
+
+static zend_never_inline gc_stack* gc_stack_next(gc_stack *stack)
+{
+ if (UNEXPECTED(!stack->next)) {
+ gc_stack *segment = emalloc(sizeof(gc_stack));
+ segment->prev = stack;
+ segment->next = NULL;
+ stack->next = segment;
+ }
+ return stack->next;
+}
+
+static zend_always_inline void gc_stack_push(gc_stack **stack, size_t *top, zend_refcounted *ref)
+{
+ if (UNEXPECTED(*top == GC_STACK_SEGMENT_SIZE)) {
+ (*stack) = gc_stack_next(*stack);
+ (*top) = 0;
+ }
+ (*stack)->data[(*top)++] = ref;
+}
+
+static zend_always_inline zend_refcounted* gc_stack_pop(gc_stack **stack, size_t *top)
+{
+ if (UNEXPECTED((*top) == 0)) {
+ if (!(*stack)->prev) {
+ return NULL;
+ } else {
+ (*stack) = (*stack)->prev;
+ (*top) = GC_STACK_SEGMENT_SIZE - 1;
+ return (*stack)->data[GC_STACK_SEGMENT_SIZE - 1];
+ }
+ } else {
+ return (*stack)->data[--(*top)];
+ }
+}
+
+static void gc_stack_free(gc_stack *stack)
+{
+ gc_stack *p = stack->next;
+
+ while (p) {
+ stack = p->next;
+ efree(p);
+ p = stack;
+ }
+}
+
+static zend_always_inline uint32_t gc_compress(uint32_t idx)
+{
+ if (EXPECTED(idx < GC_MAX_UNCOMPRESSED)) {
+ return idx;
+ }
+ return (idx % GC_MAX_UNCOMPRESSED) | GC_MAX_UNCOMPRESSED;
+}
+
+static zend_always_inline gc_root_buffer* gc_decompress(zend_refcounted *ref, uint32_t idx)
+{
+ gc_root_buffer *root = GC_IDX2PTR(idx);
+
+ if (EXPECTED(GC_GET_PTR(root->ref) == ref)) {
+ return root;
+ }
+
+ while (1) {
+ idx += GC_MAX_UNCOMPRESSED;
+ ZEND_ASSERT(idx < GC_G(first_unused));
+ root = GC_IDX2PTR(idx);
+ if (GC_GET_PTR(root->ref) == ref) {
+ return root;
+ }
+ }
+}
+
+static zend_always_inline uint32_t gc_fetch_unused(void)
+{
+ uint32_t idx;
+ gc_root_buffer *root;
+
+ ZEND_ASSERT(GC_HAS_UNUSED());
+ idx = GC_G(unused);
+ root = GC_IDX2PTR(idx);
+ ZEND_ASSERT(GC_IS_UNUSED(root->ref));
+ GC_G(unused) = GC_LIST2IDX(root->ref);
+ return idx;
+}
+
+static zend_always_inline void gc_link_unused(gc_root_buffer *root)
+{
+ root->ref = GC_IDX2LIST(GC_G(unused));
+ GC_G(unused) = GC_PTR2IDX(root);
+}
+
+static zend_always_inline uint32_t gc_fetch_next_unused(void)
+{
+ uint32_t idx;
+
+ ZEND_ASSERT(GC_HAS_NEXT_UNUSED());
+ idx = GC_G(first_unused);
+ GC_G(first_unused) = GC_G(first_unused) + 1;
+ return idx;
+}
#if ZEND_GC_DEBUG > 1
static const char *gc_color_name(uint32_t color) {
@@ -129,19 +385,19 @@ static void gc_trace_ref(zend_refcounted *ref) {
if (GC_TYPE(ref) == IS_OBJECT) {
zend_object *obj = (zend_object *) ref;
fprintf(stderr, "[%p] rc=%d addr=%d %s object(%s)#%d ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
obj->ce->name->val, obj->handle);
} else if (GC_TYPE(ref) == IS_ARRAY) {
zend_array *arr = (zend_array *) ref;
fprintf(stderr, "[%p] rc=%d addr=%d %s array(%d) ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
zend_hash_num_elements(arr));
} else {
fprintf(stderr, "[%p] rc=%d addr=%d %s %s ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
zend_get_type_by_const(GC_TYPE(ref)));
}
}
@@ -149,19 +405,11 @@ static void gc_trace_ref(zend_refcounted *ref) {
static zend_always_inline void gc_remove_from_roots(gc_root_buffer *root)
{
- root->next->prev = root->prev;
- root->prev->next = root->next;
- root->prev = GC_G(unused);
- GC_G(unused) = root;
+ GC_LINK_UNUSED(root);
+ GC_G(num_roots)--;
GC_BENCH_DEC(root_buf_length);
}
-static zend_always_inline void gc_remove_from_additional_roots(gc_root_buffer *root)
-{
- root->next->prev = root->prev;
- root->prev->next = root->next;
-}
-
static void root_buffer_dtor(zend_gc_globals *gc_globals)
{
if (gc_globals->buf) {
@@ -174,22 +422,19 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals)
{
gc_globals->gc_enabled = 0;
gc_globals->gc_active = 0;
+ gc_globals->gc_protected = 1;
+ gc_globals->gc_full = 0;
gc_globals->buf = NULL;
-
- gc_globals->roots.next = &gc_globals->roots;
- gc_globals->roots.prev = &gc_globals->roots;
- gc_globals->unused = NULL;
- gc_globals->next_to_free = NULL;
-
- gc_globals->to_free.next = &gc_globals->to_free;
- gc_globals->to_free.prev = &gc_globals->to_free;
+ gc_globals->unused = GC_INVALID;
+ gc_globals->first_unused = GC_INVALID;
+ gc_globals->gc_threshold = GC_INVALID;
+ gc_globals->buf_size = GC_INVALID;
+ gc_globals->num_roots = 0;
gc_globals->gc_runs = 0;
gc_globals->collected = 0;
- gc_globals->additional_buffer = NULL;
-
#if GC_BENCH
gc_globals->root_buf_length = 0;
gc_globals->root_buf_peak = 0;
@@ -200,7 +445,7 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals)
#endif
}
-ZEND_API void gc_globals_ctor(void)
+void gc_globals_ctor(void)
{
#ifdef ZTS
ts_allocate_id(&gc_globals_id, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
@@ -209,177 +454,245 @@ ZEND_API void gc_globals_ctor(void)
#endif
}
-ZEND_API void gc_globals_dtor(void)
+void gc_globals_dtor(void)
{
#ifndef ZTS
root_buffer_dtor(&gc_globals);
#endif
}
-ZEND_API void gc_reset(void)
+void gc_reset(void)
{
- GC_G(gc_runs) = 0;
- GC_G(collected) = 0;
- GC_G(gc_full) = 0;
+ if (GC_G(buf)) {
+ GC_G(gc_active) = 0;
+ GC_G(gc_protected) = 0;
+ GC_G(gc_full) = 0;
+ GC_G(unused) = GC_INVALID;
+ GC_G(first_unused) = GC_FIRST_ROOT;
+ GC_G(num_roots) = 0;
+
+ GC_G(gc_runs) = 0;
+ GC_G(collected) = 0;
#if GC_BENCH
- GC_G(root_buf_length) = 0;
- GC_G(root_buf_peak) = 0;
- GC_G(zval_possible_root) = 0;
- GC_G(zval_buffered) = 0;
- GC_G(zval_remove_from_buffer) = 0;
- GC_G(zval_marked_grey) = 0;
+ GC_G(root_buf_length) = 0;
+ GC_G(root_buf_peak) = 0;
+ GC_G(zval_possible_root) = 0;
+ GC_G(zval_buffered) = 0;
+ GC_G(zval_remove_from_buffer) = 0;
+ GC_G(zval_marked_grey) = 0;
#endif
+ }
+}
- GC_G(roots).next = &GC_G(roots);
- GC_G(roots).prev = &GC_G(roots);
+ZEND_API zend_bool gc_enable(zend_bool enable)
+{
+ zend_bool old_enabled = GC_G(gc_enabled);
+ GC_G(gc_enabled) = enable;
+ if (enable && !old_enabled && GC_G(buf) == NULL) {
+ GC_G(buf) = (gc_root_buffer*) pemalloc(sizeof(gc_root_buffer) * GC_DEFAULT_BUF_SIZE, 1);
+ GC_G(buf)[0].ref = NULL;
+ GC_G(buf_size) = GC_DEFAULT_BUF_SIZE;
+ GC_G(gc_threshold) = GC_THRESHOLD_DEFAULT + GC_FIRST_ROOT;
+ gc_reset();
+ }
+ return old_enabled;
+}
- GC_G(to_free).next = &GC_G(to_free);
- GC_G(to_free).prev = &GC_G(to_free);
+ZEND_API zend_bool gc_enabled(void)
+{
+ return GC_G(gc_enabled);
+}
- if (GC_G(buf)) {
- GC_G(unused) = NULL;
- GC_G(first_unused) = GC_G(buf) + 1;
+ZEND_API zend_bool gc_protect(zend_bool protect)
+{
+ zend_bool old_protected = GC_G(gc_protected);
+ GC_G(gc_protected) = protect;
+ return old_protected;
+}
+
+ZEND_API zend_bool gc_protected(void)
+{
+ return GC_G(gc_protected);
+}
+
+static void gc_grow_root_buffer(void)
+{
+ size_t new_size;
+
+ if (GC_G(buf_size) >= GC_MAX_BUF_SIZE) {
+ if (!GC_G(gc_full)) {
+ zend_error(E_WARNING, "GC buffer overflow (GC disabled)\n");
+ GC_G(gc_active) = 1;
+ GC_G(gc_protected) = 1;
+ GC_G(gc_full) = 1;
+ return;
+ }
+ }
+ if (GC_G(buf_size) < GC_BUF_GROW_STEP) {
+ new_size = GC_G(buf_size) * 2;
} else {
- GC_G(unused) = NULL;
- GC_G(first_unused) = NULL;
- GC_G(last_unused) = NULL;
+ new_size = GC_G(buf_size) + GC_BUF_GROW_STEP;
}
-
- GC_G(additional_buffer) = NULL;
+ if (new_size > GC_MAX_BUF_SIZE) {
+ new_size = GC_MAX_BUF_SIZE;
+ }
+ GC_G(buf) = perealloc(GC_G(buf), sizeof(gc_root_buffer) * new_size, 1);
+ GC_G(buf_size) = new_size;
}
-ZEND_API void gc_init(void)
+static void gc_adjust_threshold(int count)
{
- if (GC_G(buf) == NULL && GC_G(gc_enabled)) {
- GC_G(buf) = (gc_root_buffer*) malloc(sizeof(gc_root_buffer) * GC_ROOT_BUFFER_MAX_ENTRIES);
- GC_G(last_unused) = &GC_G(buf)[GC_ROOT_BUFFER_MAX_ENTRIES];
- gc_reset();
+ uint32_t new_threshold;
+
+ /* TODO Very simple heuristic for dynamic GC buffer resizing:
+ * If there are "too few" collections, increase the collection threshold
+ * by a fixed step */
+ if (count < GC_THRESHOLD_TRIGGER) {
+ /* increase */
+ if (GC_G(gc_threshold) < GC_THRESHOLD_MAX) {
+ new_threshold = GC_G(gc_threshold) + GC_THRESHOLD_STEP;
+ if (new_threshold > GC_THRESHOLD_MAX) {
+ new_threshold = GC_THRESHOLD_MAX;
+ }
+ if (new_threshold > GC_G(buf_size)) {
+ gc_grow_root_buffer();
+ }
+ if (new_threshold <= GC_G(buf_size)) {
+ GC_G(gc_threshold) = new_threshold;
+ }
+ }
+ } else if (GC_G(gc_threshold) > GC_THRESHOLD_DEFAULT) {
+ new_threshold = GC_G(gc_threshold) - GC_THRESHOLD_STEP;
+ if (new_threshold < GC_THRESHOLD_DEFAULT) {
+ new_threshold = GC_THRESHOLD_DEFAULT;
+ }
+ GC_G(gc_threshold) = new_threshold;
}
}
-ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref)
+static zend_never_inline void ZEND_FASTCALL gc_possible_root_when_full(zend_refcounted *ref)
{
+ uint32_t idx;
gc_root_buffer *newRoot;
- if (UNEXPECTED(CG(unclean_shutdown)) || UNEXPECTED(GC_G(gc_active))) {
- return;
- }
-
ZEND_ASSERT(GC_TYPE(ref) == IS_ARRAY || GC_TYPE(ref) == IS_OBJECT);
- ZEND_ASSERT(EXPECTED(GC_REF_GET_COLOR(ref) == GC_BLACK));
- ZEND_ASSERT(!GC_ADDRESS(GC_INFO(ref)));
+ ZEND_ASSERT(GC_INFO(ref) == 0);
- GC_BENCH_INC(zval_possible_root);
-
- newRoot = GC_G(unused);
- if (newRoot) {
- GC_G(unused) = newRoot->prev;
- } else if (GC_G(first_unused) != GC_G(last_unused)) {
- newRoot = GC_G(first_unused);
- GC_G(first_unused)++;
- } else {
- if (!GC_G(gc_enabled)) {
- return;
- }
- GC_REFCOUNT(ref)++;
- gc_collect_cycles();
- GC_REFCOUNT(ref)--;
- if (UNEXPECTED(GC_REFCOUNT(ref)) == 0) {
- zval_dtor_func(ref);
+ if (GC_G(gc_enabled) && !GC_G(gc_active)) {
+ GC_ADDREF(ref);
+ gc_adjust_threshold(gc_collect_cycles());
+ if (UNEXPECTED(GC_DELREF(ref)) == 0) {
+ rc_dtor_func(ref);
return;
- }
- if (UNEXPECTED(GC_INFO(ref))) {
+ } else if (UNEXPECTED(GC_INFO(ref))) {
return;
}
- newRoot = GC_G(unused);
- if (!newRoot) {
-#if ZEND_GC_DEBUG
- if (!GC_G(gc_full)) {
- fprintf(stderr, "GC: no space to record new root candidate\n");
- GC_G(gc_full) = 1;
- }
-#endif
+ }
+
+ if (GC_HAS_UNUSED()) {
+ idx = GC_FETCH_UNUSED();
+ } else if (EXPECTED(GC_HAS_NEXT_UNUSED())) {
+ idx = GC_FETCH_NEXT_UNUSED();
+ } else {
+ gc_grow_root_buffer();
+ if (UNEXPECTED(!GC_HAS_NEXT_UNUSED())) {
return;
}
- GC_G(unused) = newRoot->prev;
+ idx = GC_FETCH_NEXT_UNUSED();
}
+ newRoot = GC_IDX2PTR(idx);
+ newRoot->ref = ref; /* GC_ROOT tag is 0 */
GC_TRACE_SET_COLOR(ref, GC_PURPLE);
- GC_INFO(ref) = (newRoot - GC_G(buf)) | GC_PURPLE;
- newRoot->ref = ref;
- newRoot->next = GC_G(roots).next;
- newRoot->prev = &GC_G(roots);
- GC_G(roots).next->prev = newRoot;
- GC_G(roots).next = newRoot;
+ idx = gc_compress(idx);
+ GC_REF_SET_INFO(ref, idx | GC_PURPLE);
+ GC_G(num_roots)++;
GC_BENCH_INC(zval_buffered);
GC_BENCH_INC(root_buf_length);
GC_BENCH_PEAK(root_buf_peak, root_buf_length);
}
-static zend_always_inline gc_root_buffer* gc_find_additional_buffer(zend_refcounted *ref)
+ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref)
{
- gc_additional_buffer *additional_buffer = GC_G(additional_buffer);
-
- /* We have to check each additional_buffer to find which one holds the ref */
- while (additional_buffer) {
- uint32_t idx = GC_ADDRESS(GC_INFO(ref)) - GC_ROOT_BUFFER_MAX_ENTRIES;
- if (idx < additional_buffer->used) {
- gc_root_buffer *root = additional_buffer->buf + idx;
- if (root->ref == ref) {
- return root;
- }
- }
- additional_buffer = additional_buffer->next;
+ uint32_t idx;
+ gc_root_buffer *newRoot;
+
+ if (UNEXPECTED(GC_G(gc_protected))) {
+ return;
}
- ZEND_ASSERT(0);
- return NULL;
+ GC_BENCH_INC(zval_possible_root);
+
+ if (EXPECTED(GC_HAS_UNUSED())) {
+ idx = GC_FETCH_UNUSED();
+ } else if (EXPECTED(GC_HAS_NEXT_UNUSED_UNDER_THRESHOLD())) {
+ idx = GC_FETCH_NEXT_UNUSED();
+ } else {
+ gc_possible_root_when_full(ref);
+ return;
+ }
+
+ ZEND_ASSERT(GC_TYPE(ref) == IS_ARRAY || GC_TYPE(ref) == IS_OBJECT);
+ ZEND_ASSERT(GC_INFO(ref) == 0);
+
+ newRoot = GC_IDX2PTR(idx);
+ newRoot->ref = ref; /* GC_ROOT tag is 0 */
+ GC_TRACE_SET_COLOR(ref, GC_PURPLE);
+
+ idx = gc_compress(idx);
+ GC_REF_SET_INFO(ref, idx | GC_PURPLE);
+ GC_G(num_roots)++;
+
+ GC_BENCH_INC(zval_buffered);
+ GC_BENCH_INC(root_buf_length);
+ GC_BENCH_PEAK(root_buf_peak, root_buf_length);
+}
+
+static zend_never_inline void ZEND_FASTCALL gc_remove_compressed(zend_refcounted *ref, uint32_t idx)
+{
+ gc_root_buffer *root = gc_decompress(ref, idx);
+ gc_remove_from_roots(root);
}
ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref)
{
gc_root_buffer *root;
-
- ZEND_ASSERT(GC_ADDRESS(GC_INFO(ref)));
+ uint32_t idx = GC_REF_ADDRESS(ref);
GC_BENCH_INC(zval_remove_from_buffer);
- if (EXPECTED(GC_ADDRESS(GC_INFO(ref)) < GC_ROOT_BUFFER_MAX_ENTRIES)) {
- root = GC_G(buf) + GC_ADDRESS(GC_INFO(ref));
- gc_remove_from_roots(root);
- } else {
- root = gc_find_additional_buffer(ref);
- gc_remove_from_additional_roots(root);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_TRACE_SET_COLOR(ref, GC_BLACK);
}
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
- GC_TRACE_SET_COLOR(ref, GC_PURPLE);
- }
- GC_INFO(ref) = 0;
+ GC_REF_SET_INFO(ref, 0);
- /* updete next root that is going to be freed */
- if (GC_G(next_to_free) == root) {
- GC_G(next_to_free) = root->next;
+ /* Perform decompression only in case of large buffers */
+ if (UNEXPECTED(GC_G(first_unused) >= GC_MAX_UNCOMPRESSED)) {
+ gc_remove_compressed(ref, idx);
+ return;
}
+
+ ZEND_ASSERT(idx);
+ root = GC_IDX2PTR(idx);
+ gc_remove_from_roots(root);
}
-static void gc_scan_black(zend_refcounted *ref)
+static void gc_scan_black(zend_refcounted *ref, gc_stack *stack)
{
- HashTable *ht;
+ HashTable *ht = NULL;
Bucket *p, *end;
zval *zv;
+ GC_STACK_DCL(stack);
tail_call:
- ht = NULL;
- GC_REF_SET_BLACK(ref);
-
if (GC_TYPE(ref) == IS_OBJECT) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) {
int n;
zval *zv, *end;
@@ -388,11 +701,11 @@ tail_call:
ZVAL_OBJ(&tmp, obj);
ht = get_gc(&tmp, &zv, &n);
end = zv + n;
- if (EXPECTED(!ht) || UNEXPECTED(GC_REF_GET_COLOR(ht) == GC_BLACK)) {
+ if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
- if (!n) return;
+ if (!n) goto next;
while (!Z_REFCOUNTED_P(--end)) {
- if (zv == end) return;
+ if (zv == end) goto next;
}
} else {
GC_REF_SET_BLACK(ht);
@@ -400,44 +713,47 @@ tail_call:
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
- gc_scan_black(ref);
+ GC_ADDREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
+ GC_STACK_PUSH(ref);
}
}
zv++;
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
+ GC_ADDREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
goto tail_call;
}
- return;
+ goto next;
}
} else {
- return;
+ goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
if ((zend_array*)ref != &EG(symbol_table)) {
ht = (zend_array*)ref;
} else {
- return;
+ goto next;
}
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
- GC_REFCOUNT(ref)++;
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
+ GC_ADDREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
goto tail_call;
}
}
- return;
+ goto next;
} else {
- return;
+ goto next;
}
- if (!ht->nNumUsed) return;
+ if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
while (1) {
@@ -449,7 +765,7 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
break;
}
- if (p == end) return;
+ if (p == end) goto next;
}
while (p != end) {
zv = &p->val;
@@ -458,9 +774,10 @@ tail_call:
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
- gc_scan_black(ref);
+ GC_ADDREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
+ GC_STACK_PUSH(ref);
}
}
p++;
@@ -470,30 +787,35 @@ tail_call:
zv = Z_INDIRECT_P(zv);
}
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
+ GC_ADDREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
+ goto tail_call;
+ }
+
+next:
+ ref = GC_STACK_POP();
+ if (ref) {
goto tail_call;
}
}
-static void gc_mark_grey(zend_refcounted *ref)
+static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
{
- HashTable *ht;
+ HashTable *ht = NULL;
Bucket *p, *end;
zval *zv;
+ GC_STACK_DCL(stack);
-tail_call:
- if (GC_REF_GET_COLOR(ref) != GC_GREY) {
- ht = NULL;
+ do {
GC_BENCH_INC(zval_marked_grey);
- GC_REF_SET_COLOR(ref, GC_GREY);
if (GC_TYPE(ref) == IS_OBJECT) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
+ (get_gc = obj->handlers->get_gc) != NULL)) {
int n;
zval *zv, *end;
zval tmp;
@@ -501,11 +823,11 @@ tail_call:
ZVAL_OBJ(&tmp, obj);
ht = get_gc(&tmp, &zv, &n);
end = zv + n;
- if (EXPECTED(!ht) || UNEXPECTED(GC_REF_GET_COLOR(ht) == GC_GREY)) {
+ if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
- if (!n) return;
+ if (!n) goto next;
while (!Z_REFCOUNTED_P(--end)) {
- if (zv == end) return;
+ if (zv == end) goto next;
}
} else {
GC_REF_SET_COLOR(ht, GC_GREY);
@@ -514,24 +836,31 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
- GC_REFCOUNT(ref)--;
- gc_mark_grey(ref);
+ GC_DELREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_GREY);
+ GC_STACK_PUSH(ref);
+ }
}
zv++;
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
- GC_REFCOUNT(ref)--;
- goto tail_call;
+ GC_DELREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_GREY);
+ continue;
+ }
+ goto next;
}
} else {
- return;
+ goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
if (((zend_array*)ref) == &EG(symbol_table)) {
GC_REF_SET_BLACK(ref);
- return;
+ goto next;
} else {
ht = (zend_array*)ref;
}
@@ -539,15 +868,18 @@ tail_call:
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
- GC_REFCOUNT(ref)--;
- goto tail_call;
+ GC_DELREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_GREY);
+ continue;
+ }
}
- return;
+ goto next;
} else {
- return;
+ goto next;
}
- if (!ht->nNumUsed) return;
+ if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
while (1) {
@@ -559,7 +891,7 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
break;
}
- if (p == end) return;
+ if (p == end) goto next;
}
while (p != end) {
zv = &p->val;
@@ -569,8 +901,11 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
- GC_REFCOUNT(ref)--;
- gc_mark_grey(ref);
+ GC_DELREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_GREY);
+ GC_STACK_PUSH(ref);
+ }
}
p++;
}
@@ -580,41 +915,100 @@ tail_call:
}
ref = Z_COUNTED_P(zv);
ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
- GC_REFCOUNT(ref)--;
- goto tail_call;
+ GC_DELREF(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_GREY);
+ continue;
+ }
+
+next:
+ ref = GC_STACK_POP();
+ } while (ref);
+}
+
+/* Two-Finger compaction algorithm */
+static void gc_compact(void)
+{
+ if (GC_G(num_roots) + GC_FIRST_ROOT != GC_G(first_unused)) {
+ if (GC_G(num_roots)) {
+ gc_root_buffer *free = GC_IDX2PTR(GC_FIRST_ROOT);
+ gc_root_buffer *scan = GC_IDX2PTR(GC_G(first_unused) - 1);
+ gc_root_buffer *end = GC_IDX2PTR(GC_G(num_roots));
+ uint32_t idx;
+ zend_refcounted *p;
+
+ while (free < scan) {
+ while (!GC_IS_UNUSED(free->ref)) {
+ free++;
+ }
+ while (GC_IS_UNUSED(scan->ref)) {
+ scan--;
+ }
+ if (scan > free) {
+ p = scan->ref;
+ free->ref = p;
+ p = GC_GET_PTR(p);
+ idx = gc_compress(GC_PTR2IDX(free));
+ GC_REF_SET_INFO(p, idx | GC_REF_COLOR(p));
+ free++;
+ scan--;
+ if (scan <= end) {
+ break;
+ }
+ }
+ }
+ }
+ GC_G(unused) = GC_INVALID;
+ GC_G(first_unused) = GC_G(num_roots) + GC_FIRST_ROOT;
}
}
-static void gc_mark_roots(void)
+static void gc_mark_roots(gc_stack *stack)
{
- gc_root_buffer *current = GC_G(roots).next;
+ gc_root_buffer *current, *last;
+
+ gc_compact();
- while (current != &GC_G(roots)) {
- if (GC_REF_GET_COLOR(current->ref) == GC_PURPLE) {
- gc_mark_grey(current->ref);
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
+ last = GC_IDX2PTR(GC_G(first_unused));
+ while (current != last) {
+ if (GC_IS_ROOT(current->ref)) {
+ if (GC_REF_CHECK_COLOR(current->ref, GC_PURPLE)) {
+ GC_REF_SET_COLOR(current->ref, GC_GREY);
+ gc_mark_grey(current->ref, stack);
+ }
}
- current = current->next;
+ current++;
}
}
-static void gc_scan(zend_refcounted *ref)
+static void gc_scan(zend_refcounted *ref, gc_stack *stack)
{
- HashTable *ht;
+ HashTable *ht = NULL;
Bucket *p, *end;
zval *zv;
+ GC_STACK_DCL(stack);
tail_call:
- if (GC_REF_GET_COLOR(ref) == GC_GREY) {
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
if (GC_REFCOUNT(ref) > 0) {
- gc_scan_black(ref);
+ if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
+ GC_REF_SET_BLACK(ref);
+ if (UNEXPECTED(!_stack->next)) {
+ gc_stack_next(_stack);
+ }
+ /* Split stack and reuse the tail */
+ _stack->next->prev = NULL;
+ gc_scan_black(ref, _stack->next);
+ _stack->next->prev = _stack;
+ }
} else {
- GC_REF_SET_COLOR(ref, GC_WHITE);
if (GC_TYPE(ref) == IS_OBJECT) {
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
+ (get_gc = obj->handlers->get_gc) != NULL)) {
int n;
zval *zv, *end;
zval tmp;
@@ -622,11 +1016,11 @@ tail_call:
ZVAL_OBJ(&tmp, obj);
ht = get_gc(&tmp, &zv, &n);
end = zv + n;
- if (EXPECTED(!ht) || UNEXPECTED(GC_REF_GET_COLOR(ht) != GC_GREY)) {
+ if (EXPECTED(!ht) || UNEXPECTED(!GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
- if (!n) return;
+ if (!n) goto next;
while (!Z_REFCOUNTED_P(--end)) {
- if (zv == end) return;
+ if (zv == end) goto next;
}
} else {
GC_REF_SET_COLOR(ht, GC_WHITE);
@@ -634,35 +1028,45 @@ tail_call:
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- gc_scan(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_WHITE);
+ GC_STACK_PUSH(ref);
+ }
}
zv++;
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
- goto tail_call;
+ if (GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_WHITE);
+ goto tail_call;
+ }
+ goto next;
}
} else {
- return;
+ goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
if ((zend_array*)ref == &EG(symbol_table)) {
GC_REF_SET_BLACK(ref);
- return;
+ goto next;
} else {
ht = (zend_array*)ref;
}
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
- goto tail_call;
+ if (GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_WHITE);
+ goto tail_call;
+ }
}
- return;
+ goto next;
} else {
- return;
+ goto next;
}
- if (!ht->nNumUsed) return;
+ if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
while (1) {
@@ -674,7 +1078,7 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
break;
}
- if (p == end) return;
+ if (p == end) goto next;
}
while (p != end) {
zv = &p->val;
@@ -683,7 +1087,10 @@ tail_call:
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- gc_scan(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_WHITE);
+ GC_STACK_PUSH(ref);
+ }
}
p++;
}
@@ -692,83 +1099,70 @@ tail_call:
zv = Z_INDIRECT_P(zv);
}
ref = Z_COUNTED_P(zv);
- goto tail_call;
+ if (GC_REF_CHECK_COLOR(ref, GC_GREY)) {
+ GC_REF_SET_COLOR(ref, GC_WHITE);
+ goto tail_call;
+ }
}
}
+
+next:
+ ref = GC_STACK_POP();
+ if (ref) {
+ goto tail_call;
+ }
}
-static void gc_scan_roots(void)
+static void gc_scan_roots(gc_stack *stack)
{
- gc_root_buffer *current = GC_G(roots).next;
-
- while (current != &GC_G(roots)) {
- gc_scan(current->ref);
- current = current->next;
+ gc_root_buffer *current = GC_IDX2PTR(GC_FIRST_ROOT);
+ gc_root_buffer *last = GC_IDX2PTR(GC_G(first_unused));
+
+ while (current != last) {
+ if (GC_IS_ROOT(current->ref)) {
+ if (GC_REF_CHECK_COLOR(current->ref, GC_GREY)) {
+ GC_REF_SET_COLOR(current->ref, GC_WHITE);
+ gc_scan(current->ref, stack);
+ }
+ }
+ current++;
}
}
static void gc_add_garbage(zend_refcounted *ref)
{
- gc_root_buffer *buf = GC_G(unused);
+ uint32_t idx;
+ gc_root_buffer *buf;
- if (buf) {
- GC_G(unused) = buf->prev;
-#if 1
- /* optimization: color is already GC_BLACK (0) */
- GC_INFO(ref) = buf - GC_G(buf);
-#else
- GC_REF_SET_ADDRESS(ref, buf - GC_G(buf));
-#endif
- } else if (GC_G(first_unused) != GC_G(last_unused)) {
- buf = GC_G(first_unused);
- GC_G(first_unused)++;
-#if 1
- /* optimization: color is already GC_BLACK (0) */
- GC_INFO(ref) = buf - GC_G(buf);
-#else
- GC_REF_SET_ADDRESS(ref, buf - GC_G(buf));
-#endif
+ if (GC_HAS_UNUSED()) {
+ idx = GC_FETCH_UNUSED();
+ } else if (GC_HAS_NEXT_UNUSED()) {
+ idx = GC_FETCH_NEXT_UNUSED();
} else {
- /* If we don't have free slots in the buffer, allocate a new one and
- * set it's address above GC_ROOT_BUFFER_MAX_ENTRIES that have special
- * meaning.
- */
- if (!GC_G(additional_buffer) || GC_G(additional_buffer)->used == GC_NUM_ADDITIONAL_ENTRIES) {
- gc_additional_buffer *new_buffer = emalloc(sizeof(gc_additional_buffer));
- new_buffer->used = 0;
- new_buffer->next = GC_G(additional_buffer);
- GC_G(additional_buffer) = new_buffer;
+ gc_grow_root_buffer();
+ if (UNEXPECTED(!GC_HAS_NEXT_UNUSED())) {
+ return;
}
- buf = GC_G(additional_buffer)->buf + GC_G(additional_buffer)->used;
-#if 1
- /* optimization: color is already GC_BLACK (0) */
- GC_INFO(ref) = GC_ROOT_BUFFER_MAX_ENTRIES + GC_G(additional_buffer)->used;
-#else
- GC_REF_SET_ADDRESS(ref, GC_ROOT_BUFFER_MAX_ENTRIES) + GC_G(additional_buffer)->used;
-#endif
- GC_G(additional_buffer)->used++;
- }
- if (buf) {
- buf->ref = ref;
- buf->next = GC_G(roots).next;
- buf->prev = &GC_G(roots);
- GC_G(roots).next->prev = buf;
- GC_G(roots).next = buf;
+ idx = GC_FETCH_NEXT_UNUSED();
}
+
+ buf = GC_IDX2PTR(idx);
+ buf->ref = GC_MAKE_GARBAGE(ref);
+
+ idx = gc_compress(idx);
+ GC_REF_SET_INFO(ref, idx | GC_BLACK);
+ GC_G(num_roots)++;
}
-static int gc_collect_white(zend_refcounted *ref, uint32_t *flags)
+static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *stack)
{
int count = 0;
- HashTable *ht;
+ HashTable *ht = NULL;
Bucket *p, *end;
zval *zv;
+ GC_STACK_DCL(stack);
-tail_call:
- if (GC_REF_GET_COLOR(ref) == GC_WHITE) {
- ht = NULL;
- GC_REF_SET_BLACK(ref);
-
+ do {
/* don't count references for compatibility ??? */
if (GC_TYPE(ref) != IS_REFERENCE) {
count++;
@@ -778,37 +1172,33 @@ tail_call:
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
+ (get_gc = obj->handlers->get_gc) != NULL)) {
int n;
zval *zv, *end;
zval tmp;
-#if 1
/* optimization: color is GC_BLACK (0) */
if (!GC_INFO(ref)) {
-#else
- if (!GC_ADDRESS(GC_INFO(ref))) {
-#endif
gc_add_garbage(ref);
}
if (obj->handlers->dtor_obj &&
- ((obj->handlers->dtor_obj != zend_objects_destroy_object) ||
- (obj->ce->destructor != NULL))) {
+ ((obj->handlers->dtor_obj != zend_objects_destroy_object) ||
+ (obj->ce->destructor != NULL))) {
*flags |= GC_HAS_DESTRUCTORS;
}
ZVAL_OBJ(&tmp, obj);
ht = get_gc(&tmp, &zv, &n);
end = zv + n;
- if (EXPECTED(!ht) || UNEXPECTED(GC_REF_GET_COLOR(ht) == GC_BLACK)) {
+ if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
- if (!n) return count;
+ if (!n) goto next;
while (!Z_REFCOUNTED_P(--end)) {
/* count non-refcounted for compatibility ??? */
if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
}
- if (zv == end) return count;
+ if (zv == end) goto next;
}
} else {
GC_REF_SET_BLACK(ht);
@@ -816,8 +1206,11 @@ tail_call:
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- count += gc_collect_white(ref, flags);
+ GC_ADDREF(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ GC_STACK_PUSH(ref);
+ }
/* count non-refcounted for compatibility ??? */
} else if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
@@ -826,34 +1219,37 @@ tail_call:
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- goto tail_call;
+ GC_ADDREF(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ continue;
+ }
+ goto next;
}
} else {
- return count;
+ goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
-#if 1
- /* optimization: color is GC_BLACK (0) */
- if (!GC_INFO(ref)) {
-#else
- if (!GC_ADDRESS(GC_INFO(ref))) {
-#endif
+ /* optimization: color is GC_BLACK (0) */
+ if (!GC_INFO(ref)) {
gc_add_garbage(ref);
}
ht = (zend_array*)ref;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
- GC_REFCOUNT(ref)++;
- goto tail_call;
+ GC_ADDREF(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ continue;
+ }
}
- return count;
+ goto next;
} else {
- return count;
+ goto next;
}
- if (!ht->nNumUsed) return count;
+ if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
while (1) {
@@ -869,7 +1265,7 @@ tail_call:
if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
}
- if (p == end) return count;
+ if (p == end) goto next;
}
while (p != end) {
zv = &p->val;
@@ -878,8 +1274,11 @@ tail_call:
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- count += gc_collect_white(ref, flags);
+ GC_ADDREF(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ GC_STACK_PUSH(ref);
+ }
/* count non-refcounted for compatibility ??? */
} else if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
@@ -891,58 +1290,56 @@ tail_call:
zv = Z_INDIRECT_P(zv);
}
ref = Z_COUNTED_P(zv);
- GC_REFCOUNT(ref)++;
- goto tail_call;
- }
+ GC_ADDREF(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ continue;
+ }
+
+next:
+ ref = GC_STACK_POP();
+ } while (ref);
+
return count;
}
-static int gc_collect_roots(uint32_t *flags)
+static int gc_collect_roots(uint32_t *flags, gc_stack *stack)
{
+ uint32_t idx, end;
+ zend_refcounted *ref;
int count = 0;
- gc_root_buffer *current = GC_G(roots).next;
+ gc_root_buffer *current = GC_IDX2PTR(GC_FIRST_ROOT);
+ gc_root_buffer *last = GC_IDX2PTR(GC_G(first_unused));
/* remove non-garbage from the list */
- while (current != &GC_G(roots)) {
- gc_root_buffer *next = current->next;
- if (GC_REF_GET_COLOR(current->ref) == GC_BLACK) {
- if (EXPECTED(GC_ADDRESS(GC_INFO(current->ref)) < GC_ROOT_BUFFER_MAX_ENTRIES)) {
+ while (current != last) {
+ if (GC_IS_ROOT(current->ref)) {
+ if (GC_REF_CHECK_COLOR(current->ref, GC_BLACK)) {
+ GC_REF_SET_INFO(current->ref, 0); /* reset GC_ADDRESS() and keep GC_BLACK */
gc_remove_from_roots(current);
- } else {
- gc_remove_from_additional_roots(current);
}
- GC_INFO(current->ref) = 0; /* reset GC_ADDRESS() and keep GC_BLACK */
}
- current = next;
+ current++;
}
- current = GC_G(roots).next;
- while (current != &GC_G(roots)) {
- if (GC_REF_GET_COLOR(current->ref) == GC_WHITE) {
- count += gc_collect_white(current->ref, flags);
+ gc_compact();
+
+ /* Root buffer might be reallocated during gc_collect_white,
+ * make sure to reload pointers. */
+ idx = GC_FIRST_ROOT;
+ end = GC_G(first_unused);
+ while (idx != end) {
+ current = GC_IDX2PTR(idx);
+ ref = current->ref;
+ ZEND_ASSERT(GC_IS_ROOT(ref));
+ current->ref = GC_MAKE_GARBAGE(ref);
+ if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) {
+ GC_REF_SET_BLACK(ref);
+ count += gc_collect_white(ref, flags, stack);
}
- current = current->next;
+ idx++;
}
- /* relink remaining roots into list to free */
- if (GC_G(roots).next != &GC_G(roots)) {
- if (GC_G(to_free).next == &GC_G(to_free)) {
- /* move roots into list to free */
- GC_G(to_free).next = GC_G(roots).next;
- GC_G(to_free).prev = GC_G(roots).prev;
- GC_G(to_free).next->prev = &GC_G(to_free);
- GC_G(to_free).prev->next = &GC_G(to_free);
- } else {
- /* add roots into list to free */
- GC_G(to_free).prev->next = GC_G(roots).next;
- GC_G(roots).next->prev = GC_G(to_free).prev;
- GC_G(roots).prev->next = &GC_G(to_free);
- GC_G(to_free).prev = GC_G(roots).prev;
- }
-
- GC_G(roots).next = &GC_G(roots);
- GC_G(roots).prev = &GC_G(roots);
- }
return count;
}
@@ -956,15 +1353,11 @@ tail_call:
do {
if (root) {
GC_TRACE_REF(ref, "removing from buffer");
- if (EXPECTED(GC_ADDRESS(GC_INFO(root->ref)) < GC_ROOT_BUFFER_MAX_ENTRIES)) {
- gc_remove_from_roots(root);
- } else {
- gc_remove_from_additional_roots(root);
- }
- GC_INFO(ref) = 0;
+ gc_remove_from_roots(root);
+ GC_REF_SET_INFO(ref, 0);
root = NULL;
- } else if (GC_ADDRESS(GC_INFO(ref)) != 0
- && GC_REF_GET_COLOR(ref) == GC_BLACK) {
+ } else if (GC_REF_ADDRESS(ref) != 0
+ && GC_REF_CHECK_COLOR(ref, GC_BLACK)) {
GC_TRACE_REF(ref, "removing from buffer");
GC_REMOVE_FROM_BUFFER(ref);
} else if (GC_TYPE(ref) == IS_REFERENCE) {
@@ -981,7 +1374,7 @@ tail_call:
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) {
int n;
zval *zv, *end;
@@ -1007,7 +1400,7 @@ tail_call:
ref = Z_COUNTED_P(zv);
goto tail_call;
}
- if (GC_ADDRESS(GC_INFO(ht)) != 0 && GC_REF_GET_COLOR(ht) == GC_BLACK) {
+ if (GC_REF_ADDRESS(ht) != 0 && GC_REF_CHECK_COLOR(ht, GC_BLACK)) {
GC_TRACE_REF(ht, "removing from buffer");
GC_REMOVE_FROM_BUFFER(ht);
}
@@ -1058,15 +1451,15 @@ ZEND_API int zend_gc_collect_cycles(void)
{
int count = 0;
- if (GC_G(roots).next != &GC_G(roots)) {
- gc_root_buffer *current, *next, *orig_next_to_free;
+ if (GC_G(num_roots)) {
+ gc_root_buffer *current, *last;
zend_refcounted *p;
- gc_root_buffer to_free;
uint32_t gc_flags = 0;
- gc_additional_buffer *additional_buffer_snapshot;
-#if ZEND_GC_DEBUG
- zend_bool orig_gc_full;
-#endif
+ uint32_t idx, end;
+ gc_stack stack;
+
+ stack.prev = NULL;
+ stack.next = NULL;
if (GC_G(gc_active)) {
return 0;
@@ -1077,158 +1470,165 @@ ZEND_API int zend_gc_collect_cycles(void)
GC_G(gc_active) = 1;
GC_TRACE("Marking roots");
- gc_mark_roots();
+ gc_mark_roots(&stack);
GC_TRACE("Scanning roots");
- gc_scan_roots();
-
-#if ZEND_GC_DEBUG
- orig_gc_full = GC_G(gc_full);
- GC_G(gc_full) = 0;
-#endif
+ gc_scan_roots(&stack);
GC_TRACE("Collecting roots");
- additional_buffer_snapshot = GC_G(additional_buffer);
- count = gc_collect_roots(&gc_flags);
-#if ZEND_GC_DEBUG
- GC_G(gc_full) = orig_gc_full;
-#endif
- GC_G(gc_active) = 0;
+ count = gc_collect_roots(&gc_flags, &stack);
- if (GC_G(to_free).next == &GC_G(to_free)) {
+ gc_stack_free(&stack);
+
+ if (!GC_G(num_roots)) {
/* nothing to free */
GC_TRACE("Nothing to free");
+ GC_G(gc_active) = 0;
return 0;
}
- /* Copy global to_free list into local list */
- to_free.next = GC_G(to_free).next;
- to_free.prev = GC_G(to_free).prev;
- to_free.next->prev = &to_free;
- to_free.prev->next = &to_free;
-
- /* Free global list */
- GC_G(to_free).next = &GC_G(to_free);
- GC_G(to_free).prev = &GC_G(to_free);
-
- orig_next_to_free = GC_G(next_to_free);
-
-#if ZEND_GC_DEBUG
- orig_gc_full = GC_G(gc_full);
- GC_G(gc_full) = 0;
-#endif
+ end = GC_G(first_unused);
if (gc_flags & GC_HAS_DESTRUCTORS) {
+ uint32_t *refcounts;
+
GC_TRACE("Calling destructors");
+ // TODO: may be use emalloc() ???
+ refcounts = pemalloc(sizeof(uint32_t) * end, 1);
+
/* Remember reference counters before calling destructors */
- current = to_free.next;
- while (current != &to_free) {
- current->refcount = GC_REFCOUNT(current->ref);
- current = current->next;
+ idx = GC_FIRST_ROOT;
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
+ while (idx != end) {
+ if (GC_IS_GARBAGE(current->ref)) {
+ p = GC_GET_PTR(current->ref);
+ refcounts[idx] = GC_REFCOUNT(p);
+ }
+ current++;
+ idx++;
}
- /* Call destructors */
- current = to_free.next;
- while (current != &to_free) {
- p = current->ref;
- GC_G(next_to_free) = current->next;
- if (GC_TYPE(p) == IS_OBJECT) {
- zend_object *obj = (zend_object*)p;
+ /* Call destructors
+ *
+ * The root buffer might be reallocated during destructors calls,
+ * make sure to reload pointers as necessary. */
+ idx = GC_FIRST_ROOT;
+ while (idx != end) {
+ current = GC_IDX2PTR(idx);
+ if (GC_IS_GARBAGE(current->ref)) {
+ p = GC_GET_PTR(current->ref);
+ if (GC_TYPE(p) == IS_OBJECT
+ && !(OBJ_FLAGS(p) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ zend_object *obj = (zend_object*)p;
- if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
GC_TRACE_REF(obj, "calling destructor");
- GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
if (obj->handlers->dtor_obj
&& (obj->handlers->dtor_obj != zend_objects_destroy_object
|| obj->ce->destructor)) {
- GC_REFCOUNT(obj)++;
+ GC_ADDREF(obj);
obj->handlers->dtor_obj(obj);
- GC_REFCOUNT(obj)--;
+ GC_DELREF(obj);
}
}
}
- current = GC_G(next_to_free);
+ idx++;
}
/* Remove values captured in destructors */
- current = to_free.next;
- while (current != &to_free) {
- GC_G(next_to_free) = current->next;
- if (GC_REFCOUNT(current->ref) > current->refcount) {
- gc_remove_nested_data_from_buffer(current->ref, current);
+ idx = GC_FIRST_ROOT;
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
+ while (idx != end) {
+ if (GC_IS_GARBAGE(current->ref)) {
+ p = GC_GET_PTR(current->ref);
+ if (GC_REFCOUNT(p) > refcounts[idx]) {
+ gc_remove_nested_data_from_buffer(p, current);
+ }
}
- current = GC_G(next_to_free);
+ current++;
+ idx++;
+ }
+
+ pefree(refcounts, 1);
+
+ if (GC_G(gc_protected)) {
+ /* something went wrong */
+ return 0;
}
}
/* Destroy zvals */
GC_TRACE("Destroying zvals");
- GC_G(gc_active) = 1;
- current = to_free.next;
- while (current != &to_free) {
- p = current->ref;
- GC_G(next_to_free) = current->next;
- GC_TRACE_REF(p, "destroying");
- if (GC_TYPE(p) == IS_OBJECT) {
- zend_object *obj = (zend_object*)p;
-
- EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
- GC_TYPE(obj) = IS_NULL;
- if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
- GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
- if (obj->handlers->free_obj) {
- GC_REFCOUNT(obj)++;
- obj->handlers->free_obj(obj);
- GC_REFCOUNT(obj)--;
+ GC_G(gc_protected) = 1;
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
+ last = GC_IDX2PTR(GC_G(first_unused));
+ while (current != last) {
+ if (GC_IS_GARBAGE(current->ref)) {
+ p = GC_GET_PTR(current->ref);
+ GC_TRACE_REF(p, "destroying");
+ if (GC_TYPE(p) == IS_OBJECT) {
+ zend_object *obj = (zend_object*)p;
+
+ EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
+ GC_TYPE_INFO(obj) = IS_NULL |
+ (GC_TYPE_INFO(obj) & ~GC_TYPE_MASK);
+ if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
+ GC_ADD_FLAGS(obj, IS_OBJ_FREE_CALLED);
+ if (obj->handlers->free_obj) {
+ GC_ADDREF(obj);
+ obj->handlers->free_obj(obj);
+ GC_DELREF(obj);
+ }
}
- }
- SET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[obj->handle], EG(objects_store).free_list_head);
- EG(objects_store).free_list_head = obj->handle;
- p = current->ref = (zend_refcounted*)(((char*)obj) - obj->handlers->offset);
- } else if (GC_TYPE(p) == IS_ARRAY) {
- zend_array *arr = (zend_array*)p;
- GC_TYPE(arr) = IS_NULL;
+ ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(obj->handle);
+ current->ref = GC_MAKE_GARBAGE(((char*)obj) - obj->handlers->offset);
+ } else if (GC_TYPE(p) == IS_ARRAY) {
+ zend_array *arr = (zend_array*)p;
+
+ GC_TYPE_INFO(arr) = IS_NULL |
+ (GC_TYPE_INFO(arr) & ~GC_TYPE_MASK);
- /* GC may destroy arrays with rc>1. This is valid and safe. */
- HT_ALLOW_COW_VIOLATION(arr);
+ /* GC may destroy arrays with rc>1. This is valid and safe. */
+ HT_ALLOW_COW_VIOLATION(arr);
- zend_hash_destroy(arr);
+ zend_hash_destroy(arr);
+ }
}
- current = GC_G(next_to_free);
+ current++;
}
/* Free objects */
- current = to_free.next;
- while (current != &to_free) {
- next = current->next;
- p = current->ref;
- if (EXPECTED(current >= GC_G(buf) && current < GC_G(buf) + GC_ROOT_BUFFER_MAX_ENTRIES)) {
- current->prev = GC_G(unused);
- GC_G(unused) = current;
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
+ while (current != last) {
+ if (GC_IS_GARBAGE(current->ref)) {
+ p = GC_GET_PTR(current->ref);
+ GC_LINK_UNUSED(current);
+ GC_G(num_roots)--;
+ efree(p);
}
- efree(p);
- current = next;
- }
-
- while (GC_G(additional_buffer) != additional_buffer_snapshot) {
- gc_additional_buffer *next = GC_G(additional_buffer)->next;
- efree(GC_G(additional_buffer));
- GC_G(additional_buffer) = next;
+ current++;
}
GC_TRACE("Collection finished");
GC_G(collected) += count;
- GC_G(next_to_free) = orig_next_to_free;
-#if ZEND_GC_DEBUG
- GC_G(gc_full) = orig_gc_full;
-#endif
+ GC_G(gc_protected) = 0;
GC_G(gc_active) = 0;
}
+ gc_compact();
+
return count;
}
+ZEND_API void zend_gc_get_status(zend_gc_status *status)
+{
+ status->runs = GC_G(gc_runs);
+ status->collected = GC_G(collected);
+ status->threshold = GC_G(gc_threshold);
+ status->num_roots = GC_G(num_roots);
+}
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h
index f0bc5610cd..b6df063200 100644
--- a/Zend/zend_gc.h
+++ b/Zend/zend_gc.h
@@ -13,128 +13,49 @@
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: David Wang <planetbeing@gmail.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_GC_H
#define ZEND_GC_H
-#ifndef GC_BENCH
-# define GC_BENCH 0
-#endif
-
-#if GC_BENCH
-# define GC_BENCH_INC(counter) GC_G(counter)++
-# define GC_BENCH_DEC(counter) GC_G(counter)--
-# define GC_BENCH_PEAK(peak, counter) do { \
- if (GC_G(counter) > GC_G(peak)) { \
- GC_G(peak) = GC_G(counter); \
- } \
- } while (0)
-#else
-# define GC_BENCH_INC(counter)
-# define GC_BENCH_DEC(counter)
-# define GC_BENCH_PEAK(peak, counter)
-#endif
-
-#define GC_COLOR 0xc000
-
-#define GC_BLACK 0x0000
-#define GC_WHITE 0x8000
-#define GC_GREY 0x4000
-#define GC_PURPLE 0xc000
-
-#define GC_ADDRESS(v) \
- ((v) & ~GC_COLOR)
-#define GC_INFO_GET_COLOR(v) \
- (((zend_uintptr_t)(v)) & GC_COLOR)
-#define GC_INFO_SET_ADDRESS(v, a) \
- do {(v) = ((v) & GC_COLOR) | (a);} while (0)
-#define GC_INFO_SET_COLOR(v, c) \
- do {(v) = ((v) & ~GC_COLOR) | (c);} while (0)
-#define GC_INFO_SET_BLACK(v) \
- do {(v) = (v) & ~GC_COLOR;} while (0)
-#define GC_INFO_SET_PURPLE(v) \
- do {(v) = (v) | GC_COLOR;} while (0)
-
-typedef struct _gc_root_buffer {
- zend_refcounted *ref;
- struct _gc_root_buffer *next; /* double-linked list */
- struct _gc_root_buffer *prev;
- uint32_t refcount;
-} gc_root_buffer;
-
-#define GC_NUM_ADDITIONAL_ENTRIES \
- ((4096 - ZEND_MM_OVERHEAD - sizeof(void*) * 2) / sizeof(gc_root_buffer))
-
-typedef struct _gc_additional_bufer gc_additional_buffer;
-
-struct _gc_additional_bufer {
- uint32_t used;
- gc_additional_buffer *next;
- gc_root_buffer buf[GC_NUM_ADDITIONAL_ENTRIES];
-};
-
-typedef struct _zend_gc_globals {
- zend_bool gc_enabled;
- zend_bool gc_active;
- zend_bool gc_full;
-
- gc_root_buffer *buf; /* preallocated arrays of buffers */
- gc_root_buffer roots; /* list of possible roots of cycles */
- gc_root_buffer *unused; /* list of unused buffers */
- gc_root_buffer *first_unused; /* pointer to first unused buffer */
- gc_root_buffer *last_unused; /* pointer to last unused buffer */
-
- gc_root_buffer to_free; /* list to free */
- gc_root_buffer *next_to_free;
-
- uint32_t gc_runs;
- uint32_t collected;
-
-#if GC_BENCH
- uint32_t root_buf_length;
- uint32_t root_buf_peak;
- uint32_t zval_possible_root;
- uint32_t zval_buffered;
- uint32_t zval_remove_from_buffer;
- uint32_t zval_marked_grey;
-#endif
-
- gc_additional_buffer *additional_buffer;
-
-} zend_gc_globals;
-
-#ifdef ZTS
BEGIN_EXTERN_C()
-ZEND_API extern int gc_globals_id;
-END_EXTERN_C()
-#define GC_G(v) ZEND_TSRMG(gc_globals_id, zend_gc_globals *, v)
-#else
-#define GC_G(v) (gc_globals.v)
-extern ZEND_API zend_gc_globals gc_globals;
-#endif
-BEGIN_EXTERN_C()
+typedef struct _zend_gc_status {
+ uint32_t runs;
+ uint32_t collected;
+ uint32_t threshold;
+ uint32_t num_roots;
+} zend_gc_status;
+
ZEND_API extern int (*gc_collect_cycles)(void);
ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref);
ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref);
-ZEND_API void gc_globals_ctor(void);
-ZEND_API void gc_globals_dtor(void);
-ZEND_API void gc_init(void);
-ZEND_API void gc_reset(void);
+
+/* enable/disable automatic start of GC collection */
+ZEND_API zend_bool gc_enable(zend_bool enable);
+ZEND_API zend_bool gc_enabled(void);
+
+/* enable/disable possible root additions */
+ZEND_API zend_bool gc_protect(zend_bool protect);
+ZEND_API zend_bool gc_protected(void);
/* The default implementation of the gc_collect_cycles callback. */
ZEND_API int zend_gc_collect_cycles(void);
+
+ZEND_API void zend_gc_get_status(zend_gc_status *status);
+
+void gc_globals_ctor(void);
+void gc_globals_dtor(void);
+void gc_reset(void);
+
END_EXTERN_C()
#define GC_REMOVE_FROM_BUFFER(p) do { \
zend_refcounted *_p = (zend_refcounted*)(p); \
- if (GC_ADDRESS(GC_INFO(_p))) { \
+ if (GC_TYPE_INFO(_p) & GC_INFO_MASK) { \
gc_remove_from_buffer(_p); \
} \
} while (0)
@@ -146,7 +67,7 @@ END_EXTERN_C()
static zend_always_inline void gc_check_possible_root(zend_refcounted *ref)
{
- if (GC_TYPE(ref) == IS_REFERENCE) {
+ if (GC_TYPE_INFO(ref) == IS_REFERENCE) {
zval *zv = &((zend_reference*)ref)->val;
if (!Z_REFCOUNTED_P(zv)) {
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 042ddbc178..a18a1e8849 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -17,13 +17,12 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_interfaces.h"
#include "zend_exceptions.h"
#include "zend_generators.h"
+#include "zend_closures.h"
ZEND_API zend_class_entry *zend_ce_generator;
ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException;
@@ -145,7 +144,7 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
/* Free closure object */
if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {
- OBJ_RELEASE((zend_object *) EX(func)->common.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
/* Free GC buffer. GC for closed generators doesn't need an allocated buffer */
@@ -221,7 +220,7 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
fast_call = ZEND_CALL_VAR(ex, ex->func->op_array.opcodes[finally_op_end].op1.var);
Z_OBJ_P(fast_call) = EG(exception);
EG(exception) = NULL;
- fast_call->u2.lineno = (uint32_t)-1;
+ Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
ex->opline = &ex->func->op_array.opcodes[finally_op_num];
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
@@ -244,8 +243,9 @@ static void zend_generator_free_storage(zend_object *object) /* {{{ */
zval_ptr_dtor(&generator->retval);
}
- if (UNEXPECTED(generator->node.children > 4)) {
- zend_hash_destroy(&generator->node.child.ht);
+ if (UNEXPECTED(generator->node.children > 1)) {
+ zend_hash_destroy(generator->node.child.ht);
+ efree(generator->node.child.ht);
}
zend_object_std_dtor(&generator->std);
@@ -356,7 +356,7 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {
ZVAL_OBJ(gc_buffer++, Z_OBJ(execute_data->This));
}
if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {
- ZVAL_OBJ(gc_buffer++, (zend_object *) EX(func)->common.prototype);
+ ZVAL_OBJ(gc_buffer++, ZEND_CLOSURE_OBJECT(EX(func)));
}
if (execute_data->opline != op_array->opcodes) {
@@ -471,57 +471,38 @@ static void zend_generator_throw_exception(zend_generator *generator, zval *exce
static zend_generator *zend_generator_get_child(zend_generator_node *node, zend_generator *leaf)
{
- switch (node->children) {
- case 0:
- return NULL;
- case 1:
- return node->child.array[0].child;
-
-#define ZEND_GEN_GET_CHILD(x) \
- if (node->child.array[x].leaf == leaf) { \
- return node->child.array[x].child; \
- }
- case 4:
- ZEND_GEN_GET_CHILD(3)
- case 3:
- ZEND_GEN_GET_CHILD(2)
- case 2:
- ZEND_GEN_GET_CHILD(1)
- ZEND_GEN_GET_CHILD(0)
- ZEND_ASSERT(0); // we never should have no matching child
+ if (node->children == 0) {
+ return NULL;
+ } else if (node->children == 1) {
+ return node->child.single.child;
+ } else {
+ return zend_hash_index_find_ptr(node->child.ht, (zend_ulong) leaf);
}
-
- return zend_hash_index_find_ptr(&node->child.ht, (zend_ulong) leaf);
}
static zend_generator_node *zend_generator_search_multi_children_node(zend_generator_node *node)
{
while (node->children == 1) {
- node = &node->child.array[0].child->node;
+ node = &node->child.single.child->node;
}
return node->children > 1 ? node : NULL;
}
static void zend_generator_add_single_child(zend_generator_node *node, zend_generator *child, zend_generator *leaf)
{
- if (node->children < 4) {
- node->child.array[node->children].leaf = leaf;
- node->child.array[node->children].child = child;
- } else if (node->children > 4) {
- zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) leaf, child);
+ if (node->children == 0) {
+ node->child.single.leaf = leaf;
+ node->child.single.child = child;
} else {
- struct {
- zend_generator *leaf;
- zend_generator *child;
- } array[4];
- int i;
-
- memcpy(&array, &node->child.array, sizeof(array));
- zend_hash_init(&node->child.ht, 5, sigh, NULL, 0);
- for (i = 0; i < 4; i++) {
- zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) array[i].leaf, array[i].child);
+ if (node->children == 1) {
+ HashTable *ht = emalloc(sizeof(HashTable));
+ zend_hash_init(ht, 0, NULL, NULL, 0);
+ zend_hash_index_add_ptr(ht,
+ (zend_ulong) node->child.single.leaf, node->child.single.child);
+ node->child.ht = ht;
}
- zend_hash_index_add_ptr(&node->child.ht, (zend_ulong) leaf, child);
+
+ zend_hash_index_add_ptr(node->child.ht, (zend_ulong) leaf, child);
}
node->children++;
@@ -529,20 +510,15 @@ static void zend_generator_add_single_child(zend_generator_node *node, zend_gene
static void zend_generator_merge_child_nodes(zend_generator_node *dest, zend_generator_node *src, zend_generator *child)
{
- if (src->children <= 4) {
- int i = src->children;
- while (i--) {
- zend_generator_add_single_child(dest, child, src->child.array[i].leaf);
- }
- } else {
- zend_ulong leaf;
- ZEND_HASH_FOREACH_NUM_KEY(&src->child.ht, leaf) {
- zend_generator_add_single_child(dest, child, (zend_generator *) leaf);
- } ZEND_HASH_FOREACH_END();
- }
+ zend_ulong leaf;
+ ZEND_ASSERT(src->children > 1);
+ ZEND_HASH_FOREACH_NUM_KEY(src->child.ht, leaf) {
+ zend_generator_add_single_child(dest, child, (zend_generator *) leaf);
+ } ZEND_HASH_FOREACH_END();
}
-/* Make attention so that the root of each subtree of the Generators tree is referenced once per leaf */
+/* Pay attention so that the root of each subtree of the Generators tree is referenced
+ * once per leaf */
static void zend_generator_add_child(zend_generator *generator, zend_generator *child)
{
zend_generator *leaf = child->node.children ? child->node.ptr.leaf : child;
@@ -552,44 +528,24 @@ static void zend_generator_add_child(zend_generator *generator, zend_generator *
if (was_leaf) {
zend_generator *next = generator->node.parent;
leaf->node.ptr.root = generator->node.ptr.root;
- ++GC_REFCOUNT(&generator->std); /* we need to increment the generator refcount here as it became integrated into the tree (no leaf), but we must not increment the refcount of the *whole* path in tree */
+ GC_ADDREF(&generator->std); /* we need to increment the generator refcount here as it became integrated into the tree (no leaf), but we must not increment the refcount of the *whole* path in tree */
generator->node.ptr.leaf = leaf;
while (next) {
if (next->node.children > 1) {
- if (next->node.children > 4) {
- zend_generator *child = zend_hash_index_find_ptr(&next->node.child.ht, (zend_ulong) generator);
- zend_hash_index_del(&next->node.child.ht, (zend_ulong) generator);
- zend_hash_index_add_ptr(&next->node.child.ht, (zend_ulong) leaf, child);
- } else {
- switch (next->node.children) {
-#define ZEND_GEN_UPDATE_CHILD(x) \
- if (next->node.child.array[x].leaf == generator) { \
- next->node.child.array[x].leaf = leaf; \
- break; \
- }
- case 4:
- ZEND_GEN_UPDATE_CHILD(3)
- case 3:
- ZEND_GEN_UPDATE_CHILD(2)
- case 2:
- ZEND_GEN_UPDATE_CHILD(1)
- ZEND_GEN_UPDATE_CHILD(0)
- ZEND_ASSERT(0); // we never should have no matching child
- }
- }
+ zend_generator *child = zend_hash_index_find_ptr(next->node.child.ht, (zend_ulong) generator);
+ zend_hash_index_del(next->node.child.ht, (zend_ulong) generator);
+ zend_hash_index_add_ptr(next->node.child.ht, (zend_ulong) leaf, child);
}
next->node.ptr.leaf = leaf;
next = next->node.parent;
}
-
- zend_generator_add_single_child(&generator->node, child, leaf);
} else if (generator->node.children == 1) {
multi_children_node = zend_generator_search_multi_children_node(&generator->node);
if (multi_children_node) {
generator->node.children = 0;
- zend_generator_merge_child_nodes(&generator->node, multi_children_node, generator->node.child.array[0].child);
+ zend_generator_merge_child_nodes(&generator->node, multi_children_node, generator->node.child.single.child);
}
}
@@ -630,7 +586,7 @@ void zend_generator_yield_from(zend_generator *generator, zend_generator *from)
generator->node.parent = from;
zend_generator_get_current(generator);
- --GC_REFCOUNT(&from->std);
+ GC_DELREF(&from->std);
}
ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator, zend_generator *leaf)
@@ -696,7 +652,7 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator
} else {
do {
root = root->node.parent;
- ++GC_REFCOUNT(&root->std);
+ GC_ADDREF(&root->std);
} while (root->node.parent);
}
}
@@ -963,8 +919,7 @@ ZEND_METHOD(Generator, current)
if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->value) != IS_UNDEF)) {
zval *value = &root->value;
- ZVAL_DEREF(value);
- ZVAL_COPY(return_value, value);
+ ZVAL_COPY_DEREF(return_value, value);
}
}
/* }}} */
@@ -987,8 +942,7 @@ ZEND_METHOD(Generator, key)
if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->key) != IS_UNDEF)) {
zval *key = &root->key;
- ZVAL_DEREF(key);
- ZVAL_COPY(return_value, key);
+ ZVAL_COPY_DEREF(return_value, key);
}
}
/* }}} */
@@ -1043,8 +997,7 @@ ZEND_METHOD(Generator, send)
if (EXPECTED(generator->execute_data)) {
zval *value = &root->value;
- ZVAL_DEREF(value);
- ZVAL_COPY(return_value, value);
+ ZVAL_COPY_DEREF(return_value, value);
}
}
/* }}} */
@@ -1053,14 +1006,14 @@ ZEND_METHOD(Generator, send)
* Throws an exception into the generator */
ZEND_METHOD(Generator, throw)
{
- zval *exception, exception_copy;
+ zval *exception;
zend_generator *generator;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ZVAL(exception)
ZEND_PARSE_PARAMETERS_END();
- ZVAL_DUP(&exception_copy, exception);
+ Z_TRY_ADDREF_P(exception);
generator = (zend_generator *) Z_OBJ_P(getThis());
@@ -1069,7 +1022,7 @@ ZEND_METHOD(Generator, throw)
if (generator->execute_data) {
zend_generator *root = zend_generator_get_current(generator);
- zend_generator_throw_exception(root, &exception_copy);
+ zend_generator_throw_exception(root, exception);
zend_generator_resume(generator);
@@ -1077,13 +1030,12 @@ ZEND_METHOD(Generator, throw)
if (generator->execute_data) {
zval *value = &root->value;
- ZVAL_DEREF(value);
- ZVAL_COPY(return_value, value);
+ ZVAL_COPY_DEREF(return_value, value);
}
} else {
/* If the generator is already closed throw the exception in the
* current context */
- zend_throw_exception_object(&exception_copy);
+ zend_throw_exception_object(exception);
}
}
/* }}} */
@@ -1116,7 +1068,7 @@ ZEND_METHOD(Generator, getReturn)
}
/* }}} */
-/* {{{ proto void Generator::__wakeup()
+/* {{{ proto Generator::__wakeup()
* Throws an Exception as generators can't be serialized */
ZEND_METHOD(Generator, __wakeup)
{
@@ -1139,7 +1091,6 @@ static void zend_generator_iterator_dtor(zend_object_iterator *iterator) /* {{{
zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
generator->iterator = NULL;
zval_ptr_dtor(&iterator->data);
- zend_iterator_dtor(iterator);
}
/* }}} */
@@ -1178,8 +1129,7 @@ static void zend_generator_iterator_get_key(zend_object_iterator *iterator, zval
if (EXPECTED(Z_TYPE(root->key) != IS_UNDEF)) {
zval *zv = &root->key;
- ZVAL_DEREF(zv);
- ZVAL_COPY(key, zv);
+ ZVAL_COPY_DEREF(key, zv);
} else {
ZVAL_NULL(key);
}
@@ -1204,7 +1154,7 @@ static void zend_generator_iterator_rewind(zend_object_iterator *iterator) /* {{
}
/* }}} */
-static zend_object_iterator_funcs zend_generator_iterator_functions = {
+static const zend_object_iterator_funcs zend_generator_iterator_functions = {
zend_generator_iterator_dtor,
zend_generator_iterator_valid,
zend_generator_iterator_get_data,
@@ -1278,9 +1228,8 @@ void zend_register_generator_ce(void) /* {{{ */
/* get_iterator has to be assigned *after* implementing the inferface */
zend_class_implements(zend_ce_generator, 1, zend_ce_iterator);
zend_ce_generator->get_iterator = zend_generator_get_iterator;
- zend_ce_generator->iterator_funcs.funcs = &zend_generator_iterator_functions;
- memcpy(&zend_generator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers));
zend_generator_handlers.free_obj = zend_generator_free_storage;
zend_generator_handlers.dtor_obj = zend_generator_dtor_storage;
zend_generator_handlers.get_gc = zend_generator_get_gc;
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 98513c3a3d..108ccf31ed 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_GENERATORS_H
#define ZEND_GENERATORS_H
@@ -41,12 +39,12 @@ typedef struct _zend_generator zend_generator;
struct _zend_generator_node {
zend_generator *parent; /* NULL for root */
uint32_t children;
- union { /* HashTable / hard coded array for faster access */
- HashTable ht; /* if > 4 children */
- struct {
+ union {
+ HashTable *ht; /* if multiple children */
+ struct { /* if one child */
zend_generator *leaf;
zend_generator *child;
- } array[4]; /* if <= 4 children */
+ } single;
} child;
union {
zend_generator *leaf; /* if > 0 children */
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index dae93d90b9..486336414f 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_GLOBALS_H
#define ZEND_GLOBALS_H
@@ -155,6 +153,7 @@ struct _zend_executor_globals {
zval *vm_stack_top;
zval *vm_stack_end;
zend_vm_stack vm_stack;
+ size_t vm_stack_page_size;
struct _zend_execute_data *current_execute_data;
zend_class_entry *fake_scope; /* used to avoid checks accessing properties */
@@ -163,6 +162,10 @@ struct _zend_executor_globals {
int ticks_count;
+ uint32_t persistent_constants_count;
+ uint32_t persistent_functions_count;
+ uint32_t persistent_classes_count;
+
HashTable *in_autoload;
zend_function *autoload_func;
zend_bool full_tables_cleanup;
@@ -273,6 +276,9 @@ struct _zend_php_scanner_globals {
int yy_state;
zend_stack state_stack;
zend_ptr_stack heredoc_label_stack;
+ zend_bool heredoc_scan_ahead;
+ int heredoc_indentation;
+ zend_bool heredoc_indentation_uses_spaces;
/* original (unfiltered) script */
unsigned char *script_org;
diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h
index c9840c3514..131161e499 100644
--- a/Zend/zend_globals_macros.h
+++ b/Zend/zend_globals_macros.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_GLOBALS_MACROS_H
#define ZEND_GLOBALS_MACROS_H
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index f5fba67982..8c0bce5b41 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -12,21 +12,24 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_globals.h"
#include "zend_variables.h"
+#ifdef __SSE2__
+# include <mmintrin.h>
+# include <emmintrin.h>
+#endif
+
#if ZEND_DEBUG
# define HT_ASSERT(ht, expr) \
- ZEND_ASSERT((expr) || ((ht)->u.flags & HASH_FLAG_ALLOW_COW_VIOLATION))
+ ZEND_ASSERT((expr) || (HT_FLAGS(ht) & HASH_FLAG_ALLOW_COW_VIOLATION))
#else
# define HT_ASSERT(ht, expr)
#endif
@@ -38,16 +41,16 @@
#if ZEND_DEBUG
#define HT_OK 0x00
-#define HT_IS_DESTROYING 0x40
-#define HT_DESTROYED 0x80
-#define HT_CLEANING 0xc0
+#define HT_IS_DESTROYING 0x01
+#define HT_DESTROYED 0x02
+#define HT_CLEANING 0x03
static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line)
{
- if (ht->u.v.consistency == HT_OK) {
+ if ((HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) == HT_OK) {
return;
}
- switch (ht->u.v.consistency) {
+ switch (HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) {
case HT_IS_DESTROYING:
zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht);
break;
@@ -65,26 +68,13 @@ static void _zend_is_inconsistent(const HashTable *ht, const char *file, int lin
}
#define IS_CONSISTENT(a) _zend_is_inconsistent(a, __FILE__, __LINE__);
#define SET_INCONSISTENT(n) do { \
- (ht)->u.v.consistency = n; \
+ HT_FLAGS(ht) = (HT_FLAGS(ht) & ~HASH_FLAG_CONSISTENCY) | (n); \
} while (0)
#else
#define IS_CONSISTENT(a)
#define SET_INCONSISTENT(n)
#endif
-#define HASH_PROTECT_RECURSION(ht) \
- if ((ht)->u.flags & HASH_FLAG_APPLY_PROTECTION) { \
- if (((ht)->u.flags & ZEND_HASH_APPLY_COUNT_MASK) >= (3 << 8)) { \
- zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?");\
- } \
- ZEND_HASH_INC_APPLY_COUNT(ht); \
- }
-
-#define HASH_UNPROTECT_RECURSION(ht) \
- if ((ht)->u.flags & HASH_FLAG_APPLY_PROTECTION) { \
- ZEND_HASH_DEC_APPLY_COUNT(ht); \
- }
-
#define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \
if ((ht)->nNumUsed >= (ht)->nTableSize) { \
zend_hash_do_resize(ht); \
@@ -100,8 +90,8 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
/* Use big enough power of 2 */
/* size should be between HT_MIN_SIZE and HT_MAX_SIZE */
- if (nSize < HT_MIN_SIZE) {
- nSize = HT_MIN_SIZE;
+ if (nSize <= HT_MIN_SIZE) {
+ return HT_MIN_SIZE;
} else if (UNEXPECTED(nSize >= HT_MAX_SIZE)) {
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", nSize, sizeof(Bucket), sizeof(Bucket));
}
@@ -127,64 +117,115 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
#endif
}
-static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, int packed)
+static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht)
{
- HT_ASSERT_RC1(ht);
- ZEND_ASSERT(!((ht)->u.flags & HASH_FLAG_INITIALIZED));
- if (packed) {
- HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT));
- (ht)->u.flags |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED;
- HT_HASH_RESET_PACKED(ht);
+ HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
+ HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED;
+ HT_HASH_RESET_PACKED(ht);
+}
+
+static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht)
+{
+ uint32_t nSize = ht->nTableSize;
+
+ ht->nTableMask = HT_SIZE_TO_MASK(nSize);
+ HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
+ HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED;
+ if (EXPECTED(ht->nTableMask == HT_SIZE_TO_MASK(HT_MIN_SIZE))) {
+ Bucket *arData = ht->arData;
+
+#ifdef __SSE2__
+ __m128i xmm0 = _mm_setzero_si128();
+ xmm0 = _mm_cmpeq_epi8(xmm0, xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -16), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -12), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -8), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(arData, -4), xmm0);
+#else
+ HT_HASH_EX(arData, -16) = -1;
+ HT_HASH_EX(arData, -15) = -1;
+ HT_HASH_EX(arData, -14) = -1;
+ HT_HASH_EX(arData, -13) = -1;
+ HT_HASH_EX(arData, -12) = -1;
+ HT_HASH_EX(arData, -11) = -1;
+ HT_HASH_EX(arData, -10) = -1;
+ HT_HASH_EX(arData, -9) = -1;
+ HT_HASH_EX(arData, -8) = -1;
+ HT_HASH_EX(arData, -7) = -1;
+ HT_HASH_EX(arData, -6) = -1;
+ HT_HASH_EX(arData, -5) = -1;
+ HT_HASH_EX(arData, -4) = -1;
+ HT_HASH_EX(arData, -3) = -1;
+ HT_HASH_EX(arData, -2) = -1;
+ HT_HASH_EX(arData, -1) = -1;
+#endif
} else {
- (ht)->nTableMask = -(ht)->nTableSize;
- HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT));
- (ht)->u.flags |= HASH_FLAG_INITIALIZED;
- if (EXPECTED(ht->nTableMask == (uint32_t)-8)) {
- Bucket *arData = ht->arData;
-
- HT_HASH_EX(arData, -8) = -1;
- HT_HASH_EX(arData, -7) = -1;
- HT_HASH_EX(arData, -6) = -1;
- HT_HASH_EX(arData, -5) = -1;
- HT_HASH_EX(arData, -4) = -1;
- HT_HASH_EX(arData, -3) = -1;
- HT_HASH_EX(arData, -2) = -1;
- HT_HASH_EX(arData, -1) = -1;
- } else {
- HT_HASH_RESET(ht);
- }
+ HT_HASH_RESET(ht);
}
}
-static zend_always_inline void zend_hash_check_init(HashTable *ht, int packed)
+static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, int packed)
{
HT_ASSERT_RC1(ht);
- if (UNEXPECTED(!((ht)->u.flags & HASH_FLAG_INITIALIZED))) {
- zend_hash_real_init_ex(ht, packed);
+ ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED));
+ if (packed) {
+ zend_hash_real_init_packed_ex(ht);
+ } else {
+ zend_hash_real_init_mixed_ex(ht);
}
}
-#define CHECK_INIT(ht, packed) \
- zend_hash_check_init(ht, packed)
-
static const uint32_t uninitialized_bucket[-HT_MIN_MASK] =
{HT_INVALID_IDX, HT_INVALID_IDX};
-ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
-{
- GC_REFCOUNT(ht) = 1;
- GC_TYPE_INFO(ht) = IS_ARRAY | (persistent ? 0 : (GC_COLLECTABLE << GC_FLAGS_SHIFT));
- ht->u.flags = (persistent ? HASH_FLAG_PERSISTENT : 0) | HASH_FLAG_APPLY_PROTECTION | HASH_FLAG_STATIC_KEYS;
+ZEND_API const HashTable zend_empty_array = {
+ .gc.refcount = 2,
+ .gc.u.type_info = IS_ARRAY | (GC_IMMUTABLE << GC_FLAGS_SHIFT),
+ .u.flags = HASH_FLAG_STATIC_KEYS,
+ .nTableMask = HT_MIN_MASK,
+ .arData = (Bucket*)&uninitialized_bucket[2],
+ .nNumUsed = 0,
+ .nNumOfElements = 0,
+ .nTableSize = HT_MIN_SIZE,
+ .nInternalPointer = 0,
+ .nNextFreeElement = 0,
+ .pDestructor = ZVAL_PTR_DTOR
+};
+
+static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
+{
+ GC_SET_REFCOUNT(ht, 1);
+ GC_TYPE_INFO(ht) = IS_ARRAY | (persistent ? (GC_PERSISTENT << GC_FLAGS_SHIFT) : (GC_COLLECTABLE << GC_FLAGS_SHIFT));
+ HT_FLAGS(ht) = HASH_FLAG_STATIC_KEYS;
ht->nTableMask = HT_MIN_MASK;
HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
- ht->nInternalPointer = HT_INVALID_IDX;
+ ht->nInternalPointer = 0;
ht->nNextFreeElement = 0;
ht->pDestructor = pDestructor;
ht->nTableSize = zend_hash_check_size(nSize);
}
+ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
+{
+ _zend_hash_init_int(ht, nSize, pDestructor, persistent);
+}
+
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(void)
+{
+ HashTable *ht = emalloc(sizeof(HashTable));
+ _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0);
+ return ht;
+}
+
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t nSize)
+{
+ HashTable *ht = emalloc(sizeof(HashTable));
+ _zend_hash_init_int(ht, nSize, ZVAL_PTR_DTOR, 0);
+ return ht;
+}
+
static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht)
{
HT_ASSERT_RC1(ht);
@@ -192,7 +233,7 @@ static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht)
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, sizeof(Bucket), sizeof(Bucket));
}
ht->nTableSize += ht->nTableSize;
- HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE(ht), HT_USED_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT));
+ HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
}
ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed)
@@ -203,18 +244,35 @@ ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed)
zend_hash_real_init_ex(ht, packed);
}
+ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht)
+{
+ IS_CONSISTENT(ht);
+
+ HT_ASSERT_RC1(ht);
+ zend_hash_real_init_packed_ex(ht);
+}
+
+ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht)
+{
+ IS_CONSISTENT(ht);
+
+ HT_ASSERT_RC1(ht);
+ zend_hash_real_init_mixed_ex(ht);
+}
+
ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
{
void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
Bucket *old_buckets = ht->arData;
+ uint32_t nSize = ht->nTableSize;
HT_ASSERT_RC1(ht);
- ht->u.flags &= ~HASH_FLAG_PACKED;
- new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, -ht->nTableSize), (ht)->u.flags & HASH_FLAG_PERSISTENT);
- ht->nTableMask = -ht->nTableSize;
+ HT_FLAGS(ht) &= ~HASH_FLAG_PACKED;
+ new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize);
HT_SET_DATA_ADDR(ht, new_data);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
- pefree(old_data, (ht)->u.flags & HASH_FLAG_PERSISTENT);
+ pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
zend_hash_rehash(ht);
}
@@ -224,57 +282,68 @@ ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht)
Bucket *old_buckets = ht->arData;
HT_ASSERT_RC1(ht);
- new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (ht)->u.flags & HASH_FLAG_PERSISTENT);
- ht->u.flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
+ new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
ht->nTableMask = HT_MIN_MASK;
HT_SET_DATA_ADDR(ht, new_data);
HT_HASH_RESET_PACKED(ht);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
- pefree(old_data, (ht)->u.flags & HASH_FLAG_PERSISTENT);
-}
-
-ZEND_API void ZEND_FASTCALL _zend_hash_init_ex(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC)
-{
- _zend_hash_init(ht, nSize, pDestructor, persistent ZEND_FILE_LINE_RELAY_CC);
- if (!bApplyProtection) {
- ht->u.flags &= ~HASH_FLAG_APPLY_PROTECTION;
- }
+ pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed)
{
HT_ASSERT_RC1(ht);
if (nSize == 0) return;
- if (UNEXPECTED(!((ht)->u.flags & HASH_FLAG_INITIALIZED))) {
+ if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
if (nSize > ht->nTableSize) {
ht->nTableSize = zend_hash_check_size(nSize);
}
- zend_hash_check_init(ht, packed);
+ zend_hash_real_init(ht, packed);
} else {
if (packed) {
- ZEND_ASSERT(ht->u.flags & HASH_FLAG_PACKED);
+ ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_PACKED);
if (nSize > ht->nTableSize) {
ht->nTableSize = zend_hash_check_size(nSize);
- HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE(ht), HT_USED_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT));
+ HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
}
} else {
- ZEND_ASSERT(!(ht->u.flags & HASH_FLAG_PACKED));
+ ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED));
if (nSize > ht->nTableSize) {
void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
Bucket *old_buckets = ht->arData;
nSize = zend_hash_check_size(nSize);
- new_data = pemalloc(HT_SIZE_EX(nSize, -nSize), ht->u.flags & HASH_FLAG_PERSISTENT);
ht->nTableSize = nSize;
- ht->nTableMask = -ht->nTableSize;
+ new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize);
HT_SET_DATA_ADDR(ht, new_data);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
- pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT);
+ pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
zend_hash_rehash(ht);
}
}
}
}
+ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed)
+{
+ Bucket *p, *end, *arData;
+ uint32_t nIndex;
+
+ arData = ht->arData;
+ p = arData + ht->nNumUsed;
+ end = arData + nNumUsed;
+ ht->nNumUsed = nNumUsed;
+ while (p != end) {
+ p--;
+ if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+ ht->nNumOfElements--;
+ /* Collision pointers always directed from higher to lower buckets */
+ nIndex = p->h | ht->nTableMask;
+ HT_HASH_EX(arData, nIndex) = Z_NEXT(p->val);
+ }
+}
+
static uint32_t zend_array_recalc_elements(HashTable *ht)
{
zval *val;
@@ -294,10 +363,10 @@ static uint32_t zend_array_recalc_elements(HashTable *ht)
ZEND_API uint32_t zend_array_count(HashTable *ht)
{
uint32_t num;
- if (UNEXPECTED(ht->u.v.flags & HASH_FLAG_HAS_EMPTY_IND)) {
+ if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_HAS_EMPTY_IND)) {
num = zend_array_recalc_elements(ht);
if (UNEXPECTED(ht->nNumOfElements == num)) {
- ht->u.v.flags &= ~HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(ht) &= ~HASH_FLAG_HAS_EMPTY_IND;
}
} else if (UNEXPECTED(ht == &EG(symbol_table))) {
num = zend_array_recalc_elements(ht);
@@ -308,13 +377,22 @@ ZEND_API uint32_t zend_array_count(HashTable *ht)
}
/* }}} */
-ZEND_API void ZEND_FASTCALL zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)
+static zend_always_inline HashPosition _zend_hash_get_valid_pos(const HashTable *ht, HashPosition pos)
{
- if (bApplyProtection) {
- ht->u.flags |= HASH_FLAG_APPLY_PROTECTION;
- } else {
- ht->u.flags &= ~HASH_FLAG_APPLY_PROTECTION;
+ while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) {
+ pos++;
}
+ return pos;
+}
+
+static zend_always_inline HashPosition _zend_hash_get_current_pos(const HashTable *ht)
+{
+ return _zend_hash_get_valid_pos(ht, ht->nInternalPointer);
+}
+
+ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht)
+{
+ return _zend_hash_get_current_pos(ht);
}
ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPosition pos)
@@ -323,8 +401,8 @@ ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPositi
HashTableIterator *end = iter + EG(ht_iterators_count);
uint32_t idx;
- if (EXPECTED(ht->u.v.nIteratorsCount != 255)) {
- ht->u.v.nIteratorsCount++;
+ if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) {
+ HT_INC_ITERATORS_COUNT(ht);
}
while (iter != end) {
if (iter->ht == NULL) {
@@ -359,18 +437,16 @@ ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTab
HashTableIterator *iter = EG(ht_iterators) + idx;
ZEND_ASSERT(idx != (uint32_t)-1);
- if (iter->pos == HT_INVALID_IDX) {
- return HT_INVALID_IDX;
- } else if (UNEXPECTED(iter->ht != ht)) {
+ if (UNEXPECTED(iter->ht != ht)) {
if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR)
- && EXPECTED(iter->ht->u.v.nIteratorsCount != 255)) {
- iter->ht->u.v.nIteratorsCount--;
+ && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) {
+ HT_DEC_ITERATORS_COUNT(iter->ht);
}
- if (EXPECTED(ht->u.v.nIteratorsCount != 255)) {
- ht->u.v.nIteratorsCount++;
+ if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) {
+ HT_INC_ITERATORS_COUNT(ht);
}
iter->ht = ht;
- iter->pos = ht->nInternalPointer;
+ iter->pos = _zend_hash_get_current_pos(ht);
}
return iter->pos;
}
@@ -381,20 +457,18 @@ ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos_ex(uint32_t idx, zval
HashTableIterator *iter = EG(ht_iterators) + idx;
ZEND_ASSERT(idx != (uint32_t)-1);
- if (iter->pos == HT_INVALID_IDX) {
- return HT_INVALID_IDX;
- } else if (UNEXPECTED(iter->ht != ht)) {
+ if (UNEXPECTED(iter->ht != ht)) {
if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR)
- && EXPECTED(iter->ht->u.v.nIteratorsCount != 255)) {
- iter->ht->u.v.nIteratorsCount--;
+ && EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) {
+ HT_DEC_ITERATORS_COUNT(iter->ht);
}
SEPARATE_ARRAY(array);
ht = Z_ARRVAL_P(array);
- if (EXPECTED(ht->u.v.nIteratorsCount != 255)) {
- ht->u.v.nIteratorsCount++;
+ if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) {
+ HT_INC_ITERATORS_COUNT(ht);
}
iter->ht = ht;
- iter->pos = ht->nInternalPointer;
+ iter->pos = _zend_hash_get_current_pos(ht);
}
return iter->pos;
}
@@ -406,8 +480,9 @@ ZEND_API void ZEND_FASTCALL zend_hash_iterator_del(uint32_t idx)
ZEND_ASSERT(idx != (uint32_t)-1);
if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR)
- && EXPECTED(iter->ht->u.v.nIteratorsCount != 255)) {
- iter->ht->u.v.nIteratorsCount--;
+ && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) {
+ ZEND_ASSERT(HT_ITERATORS_COUNT(iter->ht) != 0);
+ HT_DEC_ITERATORS_COUNT(iter->ht);
}
iter->ht = NULL;
@@ -434,7 +509,7 @@ static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTabl
static zend_always_inline void zend_hash_iterators_remove(HashTable *ht)
{
- if (UNEXPECTED(ht->u.v.nIteratorsCount)) {
+ if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
_zend_hash_iterators_remove(ht);
}
}
@@ -443,7 +518,7 @@ ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht,
{
HashTableIterator *iter = EG(ht_iterators);
HashTableIterator *end = iter + EG(ht_iterators_used);
- HashPosition res = HT_INVALID_IDX;
+ HashPosition res = ht->nNumUsed;
while (iter != end) {
if (iter->ht == ht) {
@@ -469,30 +544,58 @@ ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosit
}
}
-static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key)
+ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step)
+{
+ HashTableIterator *iter = EG(ht_iterators);
+ HashTableIterator *end = iter + EG(ht_iterators_used);
+
+ while (iter != end) {
+ if (iter->ht == ht) {
+ iter->pos += step;
+ }
+ iter++;
+ }
+}
+
+static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, zend_bool known_hash)
{
zend_ulong h;
uint32_t nIndex;
uint32_t idx;
Bucket *p, *arData;
- h = zend_string_hash_val(key);
+ if (known_hash) {
+ h = ZSTR_H(key);
+ } else {
+ h = zend_string_hash_val(key);
+ }
arData = ht->arData;
nIndex = h | ht->nTableMask;
idx = HT_HASH_EX(arData, nIndex);
- while (EXPECTED(idx != HT_INVALID_IDX)) {
- p = HT_HASH_TO_BUCKET_EX(arData, idx);
- if (EXPECTED(p->key == key)) { /* check for the same interned string */
- return p;
- } else if (EXPECTED(p->h == h) &&
- EXPECTED(p->key) &&
- EXPECTED(ZSTR_LEN(p->key) == ZSTR_LEN(key)) &&
- EXPECTED(memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) {
+
+ if (UNEXPECTED(idx == HT_INVALID_IDX)) {
+ return NULL;
+ }
+ p = HT_HASH_TO_BUCKET_EX(arData, idx);
+ if (EXPECTED(p->key == key)) { /* check for the same interned string */
+ return p;
+ }
+
+ while (1) {
+ if (p->h == ZSTR_H(key) &&
+ EXPECTED(p->key) &&
+ zend_string_equal_content(p->key, key)) {
return p;
}
idx = Z_NEXT(p->val);
+ if (idx == HT_INVALID_IDX) {
+ return NULL;
+ }
+ p = HT_HASH_TO_BUCKET_EX(arData, idx);
+ if (p->key == key) { /* check for the same interned string */
+ return p;
+ }
}
- return NULL;
}
static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, const char *str, size_t len, zend_ulong h)
@@ -538,23 +641,33 @@ static zend_always_inline Bucket *zend_hash_index_find_bucket(const HashTable *h
return NULL;
}
-static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_string *key, zval *pData, uint32_t flag ZEND_FILE_LINE_DC)
+static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_string *key, zval *pData, uint32_t flag)
{
zend_ulong h;
uint32_t nIndex;
uint32_t idx;
- Bucket *p;
+ Bucket *p, *arData;
IS_CONSISTENT(ht);
HT_ASSERT_RC1(ht);
- if (UNEXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
- CHECK_INIT(ht, 0);
+ if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
+ zend_hash_real_init_mixed(ht);
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ zend_string_hash_val(key);
+ }
goto add_to_hash;
- } else if (ht->u.flags & HASH_FLAG_PACKED) {
+ } else if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
zend_hash_packed_to_hash(ht);
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ zend_string_hash_val(key);
+ }
} else if ((flag & HASH_ADD_NEW) == 0) {
- p = zend_hash_find_bucket(ht, key);
+ p = zend_hash_find_bucket(ht, key, 0);
if (p) {
zval *data;
@@ -586,6 +699,14 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
ZVAL_COPY_VALUE(data, pData);
return data;
}
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ }
+ } else if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ zend_string_hash_val(key);
}
ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
@@ -593,18 +714,77 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
add_to_hash:
idx = ht->nNumUsed++;
ht->nNumOfElements++;
- if (ht->nInternalPointer == HT_INVALID_IDX) {
- ht->nInternalPointer = idx;
- }
- zend_hash_iterators_update(ht, HT_INVALID_IDX, idx);
- p = ht->arData + idx;
+ arData = ht->arData;
+ p = arData + idx;
p->key = key;
- if (!ZSTR_IS_INTERNED(key)) {
- zend_string_addref(key);
- ht->u.flags &= ~HASH_FLAG_STATIC_KEYS;
- zend_string_hash_val(key);
- }
p->h = h = ZSTR_H(key);
+ nIndex = h | ht->nTableMask;
+ Z_NEXT(p->val) = HT_HASH_EX(arData, nIndex);
+ HT_HASH_EX(arData, nIndex) = HT_IDX_TO_HASH(idx);
+ ZVAL_COPY_VALUE(&p->val, pData);
+
+ return &p->val;
+}
+
+static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, const char *str, size_t len, zend_ulong h, zval *pData, uint32_t flag)
+{
+ zend_string *key;
+ uint32_t nIndex;
+ uint32_t idx;
+ Bucket *p;
+
+ IS_CONSISTENT(ht);
+ HT_ASSERT_RC1(ht);
+
+ if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
+ zend_hash_real_init_mixed(ht);
+ goto add_to_hash;
+ } else if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
+ zend_hash_packed_to_hash(ht);
+ } else if ((flag & HASH_ADD_NEW) == 0) {
+ p = zend_hash_str_find_bucket(ht, str, len, h);
+
+ if (p) {
+ zval *data;
+
+ if (flag & HASH_ADD) {
+ if (!(flag & HASH_UPDATE_INDIRECT)) {
+ return NULL;
+ }
+ ZEND_ASSERT(&p->val != pData);
+ data = &p->val;
+ if (Z_TYPE_P(data) == IS_INDIRECT) {
+ data = Z_INDIRECT_P(data);
+ if (Z_TYPE_P(data) != IS_UNDEF) {
+ return NULL;
+ }
+ } else {
+ return NULL;
+ }
+ } else {
+ ZEND_ASSERT(&p->val != pData);
+ data = &p->val;
+ if ((flag & HASH_UPDATE_INDIRECT) && Z_TYPE_P(data) == IS_INDIRECT) {
+ data = Z_INDIRECT_P(data);
+ }
+ }
+ if (ht->pDestructor) {
+ ht->pDestructor(data);
+ }
+ ZVAL_COPY_VALUE(data, pData);
+ return data;
+ }
+ }
+
+ ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
+
+add_to_hash:
+ idx = ht->nNumUsed++;
+ ht->nNumOfElements++;
+ p = ht->arData + idx;
+ p->key = key = zend_string_init(str, len, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ p->h = ZSTR_H(key) = h;
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
ZVAL_COPY_VALUE(&p->val, pData);
nIndex = h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
@@ -613,69 +793,80 @@ add_to_hash:
return &p->val;
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, uint32_t flag ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, uint32_t flag)
{
- return _zend_hash_add_or_update_i(ht, key, pData, flag ZEND_FILE_LINE_RELAY_CC);
+ if (flag == HASH_ADD) {
+ return zend_hash_add(ht, key, pData);
+ } else if (flag == HASH_ADD_NEW) {
+ return zend_hash_add_new(ht, key, pData);
+ } else if (flag == HASH_UPDATE) {
+ return zend_hash_update(ht, key, pData);
+ } else {
+ ZEND_ASSERT(flag == (HASH_UPDATE|HASH_UPDATE_INDIRECT));
+ return zend_hash_update_ind(ht, key, pData);
+ }
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add(HashTable *ht, zend_string *key, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData)
{
- return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_update(HashTable *ht, zend_string *key, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
{
- return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData)
{
- return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
{
- return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add_or_update(HashTable *ht, const char *str, size_t len, zval *pData, uint32_t flag ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_or_update(HashTable *ht, const char *str, size_t len, zval *pData, uint32_t flag)
{
- zend_string *key = zend_string_init(str, len, ht->u.flags & HASH_FLAG_PERSISTENT);
- zval *ret = _zend_hash_add_or_update_i(ht, key, pData, flag ZEND_FILE_LINE_RELAY_CC);
- zend_string_release(key);
- return ret;
+ if (flag == HASH_ADD) {
+ return zend_hash_str_add(ht, str, len, pData);
+ } else if (flag == HASH_ADD_NEW) {
+ return zend_hash_str_add_new(ht, str, len, pData);
+ } else if (flag == HASH_UPDATE) {
+ return zend_hash_str_update(ht, str, len, pData);
+ } else {
+ ZEND_ASSERT(flag == (HASH_UPDATE|HASH_UPDATE_INDIRECT));
+ return zend_hash_str_update_ind(ht, str, len, pData);
+ }
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
{
- zend_string *key = zend_string_init(str, len, ht->u.flags & HASH_FLAG_PERSISTENT);
- zval *ret = _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE ZEND_FILE_LINE_RELAY_CC);
- zend_string_release(key);
- return ret;
+ zend_ulong h = zend_hash_func(str, len);
+
+ return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_update_ind(HashTable *ht, const char *str, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_update_ind(HashTable *ht, const char *str, size_t len, zval *pData)
{
- zend_string *key = zend_string_init(str, len, ht->u.flags & HASH_FLAG_PERSISTENT);
- zval *ret = _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT ZEND_FILE_LINE_RELAY_CC);
- zend_string_release(key);
- return ret;
+ zend_ulong h = zend_hash_func(str, len);
+
+ return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add(HashTable *ht, const char *str, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add(HashTable *ht, const char *str, size_t len, zval *pData)
{
- zend_string *key = zend_string_init(str, len, ht->u.flags & HASH_FLAG_PERSISTENT);
- zval *ret = _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC);
- zend_string_release(key);
- return ret;
+ zend_ulong h = zend_hash_func(str, len);
+
+ return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add_new(HashTable *ht, const char *str, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_new(HashTable *ht, const char *str, size_t len, zval *pData)
{
- zend_string *key = zend_string_init(str, len, ht->u.flags & HASH_FLAG_PERSISTENT);
- zval *ret = _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC);
- zend_string_delref(key);
- return ret;
+ zend_ulong h = zend_hash_func(str, len);
+
+ return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD_NEW);
}
ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, zend_ulong h)
@@ -702,7 +893,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_empty_element(HashTable *ht, cons
return zend_hash_str_add(ht, str, len, &dummy);
}
-static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag ZEND_FILE_LINE_DC)
+static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag)
{
uint32_t nIndex;
uint32_t idx;
@@ -711,17 +902,11 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
IS_CONSISTENT(ht);
HT_ASSERT_RC1(ht);
- if (UNEXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
- CHECK_INIT(ht, h < ht->nTableSize);
- if (h < ht->nTableSize) {
- p = ht->arData + h;
- goto add_to_packed;
- }
- goto add_to_hash;
- } else if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
if (h < ht->nNumUsed) {
p = ht->arData + h;
if (Z_TYPE(p->val) != IS_UNDEF) {
+replace:
if (flag & HASH_ADD) {
return NULL;
}
@@ -734,114 +919,105 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
goto convert_to_hash;
}
} else if (EXPECTED(h < ht->nTableSize)) {
+add_to_packed:
p = ht->arData + h;
+ /* incremental initialization of empty Buckets */
+ if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) != (HASH_ADD_NEW|HASH_ADD_NEXT)) {
+ if (h > ht->nNumUsed) {
+ Bucket *q = ht->arData + ht->nNumUsed;
+ while (q != p) {
+ ZVAL_UNDEF(&q->val);
+ q++;
+ }
+ }
+ }
+ ht->nNextFreeElement = ht->nNumUsed = h + 1;
+ goto add;
} else if ((h >> 1) < ht->nTableSize &&
(ht->nTableSize >> 1) < ht->nNumOfElements) {
zend_hash_packed_grow(ht);
- p = ht->arData + h;
+ goto add_to_packed;
} else {
- goto convert_to_hash;
- }
-
-add_to_packed:
- /* incremental initialization of empty Buckets */
- if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) == (HASH_ADD_NEW|HASH_ADD_NEXT)) {
- ht->nNumUsed = h + 1;
- } else if (h >= ht->nNumUsed) {
- if (h > ht->nNumUsed) {
- Bucket *q = ht->arData + ht->nNumUsed;
- while (q != p) {
- ZVAL_UNDEF(&q->val);
- q++;
- }
+ if (ht->nNumUsed >= ht->nTableSize) {
+ ht->nTableSize += ht->nTableSize;
}
- ht->nNumUsed = h + 1;
- }
- ht->nNumOfElements++;
- if (ht->nInternalPointer == HT_INVALID_IDX) {
- ht->nInternalPointer = h;
+convert_to_hash:
+ zend_hash_packed_to_hash(ht);
}
- zend_hash_iterators_update(ht, HT_INVALID_IDX, h);
- if ((zend_long)h >= (zend_long)ht->nNextFreeElement) {
- ht->nNextFreeElement = h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX;
+ } else if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
+ if (h < ht->nTableSize) {
+ zend_hash_real_init_packed_ex(ht);
+ goto add_to_packed;
}
- p->h = h;
- p->key = NULL;
- ZVAL_COPY_VALUE(&p->val, pData);
-
- return &p->val;
-
-convert_to_hash:
- zend_hash_packed_to_hash(ht);
- } else if ((flag & HASH_ADD_NEW) == 0) {
- p = zend_hash_index_find_bucket(ht, h);
- if (p) {
- if (flag & HASH_ADD) {
- return NULL;
- }
- ZEND_ASSERT(&p->val != pData);
- if (ht->pDestructor) {
- ht->pDestructor(&p->val);
- }
- ZVAL_COPY_VALUE(&p->val, pData);
- if ((zend_long)h >= (zend_long)ht->nNextFreeElement) {
- ht->nNextFreeElement = h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX;
+ zend_hash_real_init_mixed(ht);
+ } else {
+ if ((flag & HASH_ADD_NEW) == 0) {
+ p = zend_hash_index_find_bucket(ht, h);
+ if (p) {
+ goto replace;
}
- return &p->val;
}
+ ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
}
- ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
-
-add_to_hash:
idx = ht->nNumUsed++;
- ht->nNumOfElements++;
- if (ht->nInternalPointer == HT_INVALID_IDX) {
- ht->nInternalPointer = idx;
- }
- zend_hash_iterators_update(ht, HT_INVALID_IDX, idx);
+ nIndex = h | ht->nTableMask;
+ p = ht->arData + idx;
+ Z_NEXT(p->val) = HT_HASH(ht, nIndex);
+ HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
if ((zend_long)h >= (zend_long)ht->nNextFreeElement) {
ht->nNextFreeElement = h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX;
}
- p = ht->arData + idx;
+add:
+ ht->nNumOfElements++;
p->h = h;
p->key = NULL;
- nIndex = h | ht->nTableMask;
ZVAL_COPY_VALUE(&p->val, pData);
- Z_NEXT(p->val) = HT_HASH(ht, nIndex);
- HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
return &p->val;
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add_or_update(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_or_update(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag)
{
- return _zend_hash_index_add_or_update_i(ht, h, pData, flag ZEND_FILE_LINE_RELAY_CC);
+ if (flag == HASH_ADD) {
+ return zend_hash_index_add(ht, h, pData);
+ } else if (flag == (HASH_ADD|HASH_ADD_NEW)) {
+ return zend_hash_index_add_new(ht, h, pData);
+ } else if (flag == (HASH_ADD|HASH_ADD_NEXT)) {
+ ZEND_ASSERT(h == ht->nNextFreeElement);
+ return zend_hash_next_index_insert(ht, pData);
+ } else if (flag == (HASH_ADD|HASH_ADD_NEW|HASH_ADD_NEXT)) {
+ ZEND_ASSERT(h == ht->nNextFreeElement);
+ return zend_hash_next_index_insert_new(ht, pData);
+ } else {
+ ZEND_ASSERT(flag == HASH_UPDATE);
+ return zend_hash_index_update(ht, h, pData);
+ }
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData)
{
- return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData)
{
- return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD | HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD | HASH_ADD_NEW);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData)
{
- return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_UPDATE ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_UPDATE);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_next_index_insert(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData)
{
- return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT);
}
-ZEND_API zval* ZEND_FASTCALL _zend_hash_next_index_insert_new(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData)
{
- return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT);
}
static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht)
@@ -857,12 +1033,12 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht)
uint32_t nSize = ht->nTableSize + ht->nTableSize;
Bucket *old_buckets = ht->arData;
- new_data = pemalloc(HT_SIZE_EX(nSize, -nSize), ht->u.flags & HASH_FLAG_PERSISTENT);
ht->nTableSize = nSize;
- ht->nTableMask = -ht->nTableSize;
+ new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize);
HT_SET_DATA_ADDR(ht, new_data);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
- pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT);
+ pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
zend_hash_rehash(ht);
} else {
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, sizeof(Bucket) + sizeof(uint32_t), sizeof(Bucket));
@@ -877,7 +1053,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
IS_CONSISTENT(ht);
if (UNEXPECTED(ht->nNumOfElements == 0)) {
- if (ht->u.flags & HASH_FLAG_INITIALIZED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
ht->nNumUsed = 0;
HT_HASH_RESET(ht);
}
@@ -895,12 +1071,13 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
p++;
} while (++i < ht->nNumUsed);
} else {
+ uint32_t old_num_used = ht->nNumUsed;
do {
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) {
uint32_t j = i;
Bucket *q = p;
- if (EXPECTED(ht->u.v.nIteratorsCount == 0)) {
+ if (EXPECTED(!HT_HAS_ITERATORS(ht))) {
while (++i < ht->nNumUsed) {
p++;
if (EXPECTED(Z_TYPE_INFO(p->val) != IS_UNDEF)) {
@@ -951,33 +1128,34 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i);
p++;
} while (++i < ht->nNumUsed);
+
+ /* Migrate pointer to one past the end of the array to the new one past the end, so that
+ * newly inserted elements are picked up correctly. */
+ if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
+ _zend_hash_iterators_update(ht, old_num_used, ht->nNumUsed);
+ }
}
return SUCCESS;
}
static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, Bucket *p, Bucket *prev)
{
- if (!(ht->u.flags & HASH_FLAG_PACKED)) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) {
if (prev) {
Z_NEXT(prev->val) = Z_NEXT(p->val);
} else {
HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val);
}
}
- if (HT_IDX_TO_HASH(ht->nNumUsed - 1) == idx) {
- do {
- ht->nNumUsed--;
- } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF)));
- }
+ idx = HT_HASH_TO_IDX(idx);
ht->nNumOfElements--;
- if (HT_IDX_TO_HASH(ht->nInternalPointer) == idx || UNEXPECTED(ht->u.v.nIteratorsCount)) {
+ if (ht->nInternalPointer == idx || UNEXPECTED(HT_HAS_ITERATORS(ht))) {
uint32_t new_idx;
- new_idx = idx = HT_HASH_TO_IDX(idx);
+ new_idx = idx;
while (1) {
new_idx++;
if (new_idx >= ht->nNumUsed) {
- new_idx = HT_INVALID_IDX;
break;
} else if (Z_TYPE(ht->arData[new_idx].val) != IS_UNDEF) {
break;
@@ -988,6 +1166,12 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx,
}
zend_hash_iterators_update(ht, idx, new_idx);
}
+ if (ht->nNumUsed - 1 == idx) {
+ do {
+ ht->nNumUsed--;
+ } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF)));
+ ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed);
+ }
if (p->key) {
zend_string_release(p->key);
}
@@ -1005,7 +1189,7 @@ static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bu
{
Bucket *prev = NULL;
- if (!(ht->u.flags & HASH_FLAG_PACKED)) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) {
uint32_t nIndex = p->h | ht->nTableMask;
uint32_t i = HT_HASH(ht, nIndex);
@@ -1048,8 +1232,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
if ((p->key == key) ||
(p->h == h &&
p->key &&
- ZSTR_LEN(p->key) == ZSTR_LEN(key) &&
- memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) {
+ zend_string_equal_content(p->key, key))) {
_zend_hash_del_el_ex(ht, idx, p, prev);
return SUCCESS;
}
@@ -1079,8 +1262,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key)
if ((p->key == key) ||
(p->h == h &&
p->key &&
- ZSTR_LEN(p->key) == ZSTR_LEN(key) &&
- memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) {
+ zend_string_equal_content(p->key, key))) {
if (Z_TYPE(p->val) == IS_INDIRECT) {
zval *data = Z_INDIRECT(p->val);
@@ -1095,7 +1277,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key)
} else {
ZVAL_UNDEF(data);
}
- ht->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND;
}
} else {
_zend_hash_del_el_ex(ht, idx, p, prev);
@@ -1139,7 +1321,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *str,
ht->pDestructor(data);
}
ZVAL_UNDEF(data);
- ht->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND;
}
} else {
_zend_hash_del_el_ex(ht, idx, p, prev);
@@ -1192,7 +1374,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h)
IS_CONSISTENT(ht);
HT_ASSERT_RC1(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
if (h < ht->nNumUsed) {
p = ht->arData + h;
if (Z_TYPE(p->val) != IS_UNDEF) {
@@ -1273,10 +1455,10 @@ ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
}
}
zend_hash_iterators_remove(ht);
- } else if (EXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
+ } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
return;
}
- pefree(HT_GET_DATA_ADDR(ht), ht->u.flags & HASH_FLAG_PERSISTENT);
+ pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
@@ -1288,7 +1470,7 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
/* break possible cycles */
GC_REMOVE_FROM_BUFFER(ht);
- GC_TYPE_INFO(ht) = IS_NULL | (GC_WHITE << 16);
+ GC_TYPE_INFO(ht) = IS_NULL /*???| (GC_WHITE << 16)*/;
if (ht->nNumUsed) {
/* In some rare cases destructors of regular arrays may be changed */
@@ -1309,7 +1491,7 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
do {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
if (EXPECTED(p->key)) {
- zend_string_release(p->key);
+ zend_string_release_ex(p->key, 0);
}
} while (++p != end);
} else {
@@ -1317,14 +1499,14 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
if (EXPECTED(p->key)) {
- zend_string_release(p->key);
+ zend_string_release_ex(p->key, 0);
}
}
} while (++p != end);
}
zend_hash_iterators_remove(ht);
SET_INCONSISTENT(HT_DESTROYED);
- } else if (EXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
+ } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
goto free_ht;
}
efree(HT_GET_DATA_ADDR(ht));
@@ -1391,14 +1573,14 @@ ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht)
}
}
}
- if (!(ht->u.flags & HASH_FLAG_PACKED)) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) {
HT_HASH_RESET(ht);
}
}
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
- ht->nInternalPointer = HT_INVALID_IDX;
+ ht->nInternalPointer = 0;
}
ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht)
@@ -1437,7 +1619,7 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht)
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
- ht->nInternalPointer = HT_INVALID_IDX;
+ ht->nInternalPointer = 0;
}
ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht)
@@ -1453,8 +1635,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht)
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
_zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p);
}
- if (ht->u.flags & HASH_FLAG_INITIALIZED) {
- pefree(HT_GET_DATA_ADDR(ht), ht->u.flags & HASH_FLAG_PERSISTENT);
+ if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
+ pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
SET_INCONSISTENT(HT_DESTROYED);
@@ -1477,8 +1659,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht)
_zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p);
}
- if (ht->u.flags & HASH_FLAG_INITIALIZED) {
- pefree(HT_GET_DATA_ADDR(ht), ht->u.flags & HASH_FLAG_PERSISTENT);
+ if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
+ pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
SET_INCONSISTENT(HT_DESTROYED);
@@ -1501,7 +1683,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_fu
IS_CONSISTENT(ht);
- HASH_PROTECT_RECURSION(ht);
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
@@ -1515,7 +1696,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_fu
break;
}
}
- HASH_UNPROTECT_RECURSION(ht);
}
@@ -1527,7 +1707,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_f
IS_CONSISTENT(ht);
- HASH_PROTECT_RECURSION(ht);
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
@@ -1541,11 +1720,10 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_f
break;
}
}
- HASH_UNPROTECT_RECURSION(ht);
}
-ZEND_API void ZEND_FASTCALL zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int num_args, ...)
+ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int num_args, ...)
{
uint32_t idx;
Bucket *p;
@@ -1555,8 +1733,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_arguments(HashTable *ht, apply_
IS_CONSISTENT(ht);
- HASH_PROTECT_RECURSION(ht);
-
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
@@ -1576,8 +1752,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_arguments(HashTable *ht, apply_
}
va_end(args);
}
-
- HASH_UNPROTECT_RECURSION(ht);
}
@@ -1589,7 +1763,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t
IS_CONSISTENT(ht);
- HASH_PROTECT_RECURSION(ht);
idx = ht->nNumUsed;
while (idx > 0) {
idx--;
@@ -1606,7 +1779,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t
break;
}
}
- HASH_UNPROTECT_RECURSION(ht);
}
@@ -1615,20 +1787,15 @@ ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source,
uint32_t idx;
Bucket *p;
zval *new_entry, *data;
- zend_bool setTargetPointer;
IS_CONSISTENT(source);
IS_CONSISTENT(target);
HT_ASSERT_RC1(target);
- setTargetPointer = (target->nInternalPointer == HT_INVALID_IDX);
for (idx = 0; idx < source->nNumUsed; idx++) {
p = source->arData + idx;
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
- if (setTargetPointer && source->nInternalPointer == idx) {
- target->nInternalPointer = HT_INVALID_IDX;
- }
/* INDIRECT element may point to UNDEF-ined slots */
data = &p->val;
if (Z_TYPE_P(data) == IS_INDIRECT) {
@@ -1646,13 +1813,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source,
pCopyConstructor(new_entry);
}
}
- if (target->nInternalPointer == HT_INVALID_IDX && target->nNumOfElements > 0) {
- idx = 0;
- while (Z_TYPE(target->arData[idx].val) == IS_UNDEF) {
- idx++;
- }
- target->nInternalPointer = idx;
- }
}
@@ -1762,22 +1922,23 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
IS_CONSISTENT(source);
ALLOC_HASHTABLE(target);
- GC_REFCOUNT(target) = 1;
+ GC_SET_REFCOUNT(target, 1);
GC_TYPE_INFO(target) = IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
target->nTableSize = source->nTableSize;
target->pDestructor = ZVAL_PTR_DTOR;
- if (source->nNumUsed == 0) {
- target->u.flags = (source->u.flags & ~(HASH_FLAG_INITIALIZED|HASH_FLAG_PACKED|HASH_FLAG_PERSISTENT|ZEND_HASH_APPLY_COUNT_MASK)) | HASH_FLAG_APPLY_PROTECTION | HASH_FLAG_STATIC_KEYS;
+ if (source->nNumOfElements == 0) {
+ uint32_t mask = HASH_FLAG_MASK & ~(HASH_FLAG_INITIALIZED|HASH_FLAG_PACKED);
+ HT_FLAGS(target) = (HT_FLAGS(source) & mask) | HASH_FLAG_STATIC_KEYS;
target->nTableMask = HT_MIN_MASK;
target->nNumUsed = 0;
target->nNumOfElements = 0;
target->nNextFreeElement = 0;
- target->nInternalPointer = HT_INVALID_IDX;
+ target->nInternalPointer = 0;
HT_SET_DATA_ADDR(target, &uninitialized_bucket);
} else if (GC_FLAGS(source) & IS_ARRAY_IMMUTABLE) {
- target->u.flags = (source->u.flags & ~HASH_FLAG_PERSISTENT) | HASH_FLAG_APPLY_PROTECTION;
+ HT_FLAGS(target) = HT_FLAGS(source) & HASH_FLAG_MASK;
target->nTableMask = source->nTableMask;
target->nNumUsed = source->nNumUsed;
target->nNumOfElements = source->nNumOfElements;
@@ -1785,22 +1946,17 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
target->nInternalPointer = source->nInternalPointer;
memcpy(HT_GET_DATA_ADDR(target), HT_GET_DATA_ADDR(source), HT_USED_SIZE(source));
- if (target->nNumOfElements > 0 &&
- target->nInternalPointer == HT_INVALID_IDX) {
- idx = 0;
- while (Z_TYPE(target->arData[idx].val) == IS_UNDEF) {
- idx++;
- }
- target->nInternalPointer = idx;
- }
- } else if (source->u.flags & HASH_FLAG_PACKED) {
- target->u.flags = (source->u.flags & ~(HASH_FLAG_PERSISTENT|ZEND_HASH_APPLY_COUNT_MASK)) | HASH_FLAG_APPLY_PROTECTION;
- target->nTableMask = source->nTableMask;
+ } else if (HT_FLAGS(source) & HASH_FLAG_PACKED) {
+ HT_FLAGS(target) = HT_FLAGS(source) & HASH_FLAG_MASK;
+ target->nTableMask = HT_MIN_MASK;
target->nNumUsed = source->nNumUsed;
target->nNumOfElements = source->nNumOfElements;
target->nNextFreeElement = source->nNextFreeElement;
- HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
- target->nInternalPointer = source->nInternalPointer;
+ HT_SET_DATA_ADDR(target, emalloc(HT_SIZE_EX(target->nTableSize, HT_MIN_MASK)));
+ target->nInternalPointer =
+ (source->nInternalPointer < source->nNumUsed) ?
+ source->nInternalPointer : 0;
+
HT_HASH_RESET_PACKED(target);
if (HT_IS_WITHOUT_HOLES(target)) {
@@ -1808,19 +1964,13 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
} else {
zend_array_dup_packed_elements(source, target, 1);
}
- if (target->nNumOfElements > 0 &&
- target->nInternalPointer == HT_INVALID_IDX) {
- idx = 0;
- while (Z_TYPE(target->arData[idx].val) == IS_UNDEF) {
- idx++;
- }
- target->nInternalPointer = idx;
- }
} else {
- target->u.flags = (source->u.flags & ~(HASH_FLAG_PERSISTENT|ZEND_HASH_APPLY_COUNT_MASK)) | HASH_FLAG_APPLY_PROTECTION;
+ HT_FLAGS(target) = HT_FLAGS(source) & HASH_FLAG_MASK;
target->nTableMask = source->nTableMask;
target->nNextFreeElement = source->nNextFreeElement;
- target->nInternalPointer = source->nInternalPointer;
+ target->nInternalPointer =
+ (source->nInternalPointer < source->nNumUsed) ?
+ source->nInternalPointer : 0;
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
HT_HASH_RESET(target);
@@ -1840,15 +1990,12 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
}
target->nNumUsed = idx;
target->nNumOfElements = idx;
- if (idx > 0 && target->nInternalPointer == HT_INVALID_IDX) {
- target->nInternalPointer = 0;
- }
}
return target;
}
-ZEND_API void ZEND_FASTCALL _zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite ZEND_FILE_LINE_DC)
+ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite)
{
uint32_t idx;
Bucket *p;
@@ -1867,13 +2014,13 @@ ZEND_API void ZEND_FASTCALL _zend_hash_merge(HashTable *target, HashTable *sourc
continue;
}
if (p->key) {
- t = _zend_hash_add_or_update_i(target, p->key, &p->val, HASH_UPDATE | HASH_UPDATE_INDIRECT ZEND_FILE_LINE_RELAY_CC);
- if (t && pCopyConstructor) {
+ t = _zend_hash_add_or_update_i(target, p->key, &p->val, HASH_UPDATE | HASH_UPDATE_INDIRECT);
+ if (pCopyConstructor) {
pCopyConstructor(t);
}
} else {
t = zend_hash_index_update(target, p->h, &p->val);
- if (t && pCopyConstructor) {
+ if (pCopyConstructor) {
pCopyConstructor(t);
}
}
@@ -1887,7 +2034,7 @@ ZEND_API void ZEND_FASTCALL _zend_hash_merge(HashTable *target, HashTable *sourc
continue;
}
if (p->key) {
- t = _zend_hash_add_or_update_i(target, p->key, &p->val, HASH_ADD | HASH_UPDATE_INDIRECT ZEND_FILE_LINE_RELAY_CC);
+ t = _zend_hash_add_or_update_i(target, p->key, &p->val, HASH_ADD | HASH_UPDATE_INDIRECT);
if (t && pCopyConstructor) {
pCopyConstructor(t);
}
@@ -1899,13 +2046,6 @@ ZEND_API void ZEND_FASTCALL _zend_hash_merge(HashTable *target, HashTable *sourc
}
}
}
- if (target->nNumOfElements > 0) {
- idx = 0;
- while (Z_TYPE(target->arData[idx].val) == IS_UNDEF) {
- idx++;
- }
- target->nInternalPointer = idx;
- }
}
@@ -1934,18 +2074,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *sou
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
if (zend_hash_replace_checker_wrapper(target, &p->val, p, pParam, pMergeSource)) {
t = zend_hash_update(target, p->key, &p->val);
- if (t && pCopyConstructor) {
+ if (pCopyConstructor) {
pCopyConstructor(t);
}
}
}
- if (target->nNumOfElements > 0) {
- idx = 0;
- while (Z_TYPE(target->arData[idx].val) == IS_UNDEF) {
- idx++;
- }
- target->nInternalPointer = idx;
- }
}
@@ -1956,7 +2089,17 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *ke
IS_CONSISTENT(ht);
- p = zend_hash_find_bucket(ht, key);
+ p = zend_hash_find_bucket(ht, key, 0);
+ return p ? &p->val : NULL;
+}
+
+ZEND_API zval* ZEND_FASTCALL _zend_hash_find_known_hash(const HashTable *ht, zend_string *key)
+{
+ Bucket *p;
+
+ IS_CONSISTENT(ht);
+
+ p = zend_hash_find_bucket(ht, key, 1);
return p ? &p->val : NULL;
}
@@ -1978,7 +2121,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_stri
IS_CONSISTENT(ht);
- p = zend_hash_find_bucket(ht, key);
+ p = zend_hash_find_bucket(ht, key, 0);
return p ? 1 : 0;
}
@@ -2000,7 +2143,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulon
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
if (h < ht->nNumUsed) {
p = ht->arData + h;
if (Z_TYPE(p->val) != IS_UNDEF) {
@@ -2030,7 +2173,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zen
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
if (h < ht->nNumUsed) {
if (Z_TYPE(ht->arData[h].val) != IS_UNDEF) {
return 1;
@@ -2046,18 +2189,9 @@ ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zen
ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
{
- uint32_t idx;
-
IS_CONSISTENT(ht);
HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1);
-
- for (idx = 0; idx < ht->nNumUsed; idx++) {
- if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) {
- *pos = idx;
- return;
- }
- }
- *pos = HT_INVALID_IDX;
+ *pos = _zend_hash_get_valid_pos(ht, 0);
}
@@ -2079,22 +2213,23 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, Has
return;
}
}
- *pos = HT_INVALID_IDX;
+ *pos = ht->nNumUsed;
}
ZEND_API int ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
{
- uint32_t idx = *pos;
+ uint32_t idx;
IS_CONSISTENT(ht);
HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1);
- if (idx != HT_INVALID_IDX) {
+ idx = _zend_hash_get_valid_pos(ht, *pos);
+ if (idx < ht->nNumUsed) {
while (1) {
idx++;
if (idx >= ht->nNumUsed) {
- *pos = HT_INVALID_IDX;
+ *pos = ht->nNumUsed;
return SUCCESS;
}
if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) {
@@ -2103,7 +2238,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition
}
}
} else {
- return FAILURE;
+ return FAILURE;
}
}
@@ -2114,7 +2249,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPositi
IS_CONSISTENT(ht);
HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1);
- if (idx != HT_INVALID_IDX) {
+ if (idx < ht->nNumUsed) {
while (idx > 0) {
idx--;
if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) {
@@ -2122,7 +2257,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPositi
return SUCCESS;
}
}
- *pos = HT_INVALID_IDX;
+ *pos = ht->nNumUsed;
return SUCCESS;
} else {
return FAILURE;
@@ -2133,11 +2268,12 @@ ZEND_API int ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPositi
/* This function should be made binary safe */
ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, HashPosition *pos)
{
- uint32_t idx = *pos;
+ uint32_t idx;
Bucket *p;
IS_CONSISTENT(ht);
- if (idx != HT_INVALID_IDX) {
+ idx = _zend_hash_get_valid_pos(ht, *pos);
+ if (idx < ht->nNumUsed) {
p = ht->arData + idx;
if (p->key) {
*str_index = p->key;
@@ -2152,11 +2288,12 @@ ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zen
ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos)
{
- uint32_t idx = *pos;
+ uint32_t idx;
Bucket *p;
IS_CONSISTENT(ht);
- if (idx == HT_INVALID_IDX) {
+ idx = _zend_hash_get_valid_pos(ht, *pos);
+ if (idx >= ht->nNumUsed) {
ZVAL_NULL(key);
} else {
p = ht->arData + idx;
@@ -2170,11 +2307,12 @@ ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *h
ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
{
- uint32_t idx = *pos;
+ uint32_t idx;
Bucket *p;
IS_CONSISTENT(ht);
- if (idx != HT_INVALID_IDX) {
+ idx = _zend_hash_get_valid_pos(ht, *pos);
+ if (idx < ht->nNumUsed) {
p = ht->arData + idx;
if (p->key) {
return HASH_KEY_IS_STRING;
@@ -2188,11 +2326,12 @@ ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, Hash
ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos)
{
- uint32_t idx = *pos;
+ uint32_t idx;
Bucket *p;
IS_CONSISTENT(ht);
- if (idx != HT_INVALID_IDX) {
+ idx = _zend_hash_get_valid_pos(ht, *pos);
+ if (idx < ht->nNumUsed) {
p = ht->arData + idx;
return &p->val;
} else {
@@ -2270,7 +2409,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
sort((void *)ht->arData, i, sizeof(Bucket), compar,
(swap_func_t)(renumber? zend_hash_bucket_renum_swap :
- ((ht->u.flags & HASH_FLAG_PACKED) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap)));
+ ((HT_FLAGS(ht) & HASH_FLAG_PACKED) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap)));
ht->nNumUsed = i;
ht->nInternalPointer = 0;
@@ -2287,7 +2426,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
ht->nNextFreeElement = i;
}
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
if (!renumber) {
zend_hash_packed_to_hash(ht);
}
@@ -2296,12 +2435,12 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
Bucket *old_buckets = ht->arData;
- new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (ht->u.flags & HASH_FLAG_PERSISTENT));
- ht->u.flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
+ new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
+ HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
ht->nTableMask = HT_MIN_MASK;
HT_SET_DATA_ADDR(ht, new_data);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
- pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT);
+ pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
HT_HASH_RESET_PACKED(ht);
} else {
zend_hash_rehash(ht);
@@ -2395,11 +2534,25 @@ ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t co
IS_CONSISTENT(ht1);
IS_CONSISTENT(ht2);
- HASH_PROTECT_RECURSION(ht1);
- HASH_PROTECT_RECURSION(ht2);
+ if (ht1 == ht2) {
+ return 0;
+ }
+
+ /* It's enough to protect only one of the arrays.
+ * The second one may be referenced from the first and this may cause
+ * false recursion detection.
+ */
+ if (UNEXPECTED(GC_IS_RECURSIVE(ht1))) {
+ zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?");
+ }
+
+ if (!(GC_FLAGS(ht1) & GC_IMMUTABLE)) {
+ GC_PROTECT_RECURSION(ht1);
+ }
result = zend_hash_compare_impl(ht1, ht2, compar, ordered);
- HASH_UNPROTECT_RECURSION(ht1);
- HASH_UNPROTECT_RECURSION(ht2);
+ if (!(GC_FLAGS(ht1) & GC_IMMUTABLE)) {
+ GC_UNPROTECT_RECURSION(ht1);
+ }
return result;
}
@@ -2495,23 +2648,21 @@ ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht)
goto convert;
}
- ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) {
+ ZEND_HASH_FOREACH_STR_KEY(ht, str_key) {
if (!str_key) {
goto convert;
}
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(ht)++;
+ GC_ADDREF(ht);
}
return ht;
convert:
{
- HashTable *new_ht = emalloc(sizeof(HashTable));
-
- zend_hash_init(new_ht, zend_hash_num_elements(ht), NULL, ZVAL_PTR_DTOR, 0);
+ HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht));
ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) {
if (!str_key) {
@@ -2546,7 +2697,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend
zend_string *str_key;
zval *zv;
- ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) {
+ ZEND_HASH_FOREACH_STR_KEY(ht, str_key) {
/* The `str_key &&` here might seem redundant: property tables should
* only have string keys. Unfortunately, this isn't true, at the very
* least because of ArrayObject, which stores a symtable where the
@@ -2562,16 +2713,14 @@ ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend
}
if (EXPECTED(!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(ht)++;
+ GC_ADDREF(ht);
}
return ht;
convert:
{
- HashTable *new_ht = emalloc(sizeof(HashTable));
-
- zend_hash_init(new_ht, zend_hash_num_elements(ht), NULL, ZVAL_PTR_DTOR, 0);
+ HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht));
ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) {
do {
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 386248d171..2c295adca6 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_HASH_H
#define ZEND_HASH_H
@@ -35,29 +33,53 @@
#define HASH_ADD_NEW (1<<3)
#define HASH_ADD_NEXT (1<<4)
-#define HASH_FLAG_PERSISTENT (1<<0)
-#define HASH_FLAG_APPLY_PROTECTION (1<<1)
+#define HASH_FLAG_CONSISTENCY ((1<<0) | (1<<1))
#define HASH_FLAG_PACKED (1<<2)
#define HASH_FLAG_INITIALIZED (1<<3)
#define HASH_FLAG_STATIC_KEYS (1<<4) /* long and interned strings */
#define HASH_FLAG_HAS_EMPTY_IND (1<<5)
#define HASH_FLAG_ALLOW_COW_VIOLATION (1<<6)
+/* Only the low byte are real flags */
+#define HASH_FLAG_MASK 0xff
+
+#define HT_FLAGS(ht) (ht)->u.flags
+
#define HT_IS_PACKED(ht) \
- (((ht)->u.flags & HASH_FLAG_PACKED) != 0)
+ ((HT_FLAGS(ht) & HASH_FLAG_PACKED) != 0)
#define HT_IS_WITHOUT_HOLES(ht) \
((ht)->nNumUsed == (ht)->nNumOfElements)
#define HT_HAS_STATIC_KEYS_ONLY(ht) \
- (((ht)->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS)) != 0)
+ ((HT_FLAGS(ht) & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS)) != 0)
#if ZEND_DEBUG
-# define HT_ALLOW_COW_VIOLATION(ht) (ht)->u.flags |= HASH_FLAG_ALLOW_COW_VIOLATION
+# define HT_ALLOW_COW_VIOLATION(ht) HT_FLAGS(ht) |= HASH_FLAG_ALLOW_COW_VIOLATION
#else
# define HT_ALLOW_COW_VIOLATION(ht)
#endif
+#define HT_ITERATORS_COUNT(ht) (ht)->u.v.nIteratorsCount
+#define HT_ITERATORS_OVERFLOW(ht) (HT_ITERATORS_COUNT(ht) == 0xff)
+#define HT_HAS_ITERATORS(ht) (HT_ITERATORS_COUNT(ht) != 0)
+
+#define HT_SET_ITERATORS_COUNT(ht, iters) \
+ do { HT_ITERATORS_COUNT(ht) = (iters); } while (0)
+#define HT_INC_ITERATORS_COUNT(ht) \
+ HT_SET_ITERATORS_COUNT(ht, HT_ITERATORS_COUNT(ht) + 1)
+#define HT_DEC_ITERATORS_COUNT(ht) \
+ HT_SET_ITERATORS_COUNT(ht, HT_ITERATORS_COUNT(ht) - 1)
+
+extern ZEND_API const HashTable zend_empty_array;
+
+#define ZVAL_EMPTY_ARRAY(z) do { \
+ zval *__z = (z); \
+ Z_ARR_P(__z) = (zend_array*)&zend_empty_array; \
+ Z_TYPE_INFO_P(__z) = IS_ARRAY; \
+ } while (0)
+
+
typedef struct _zend_hash_key {
zend_ulong h;
zend_string *key;
@@ -68,66 +90,42 @@ typedef zend_bool (*merge_checker_func_t)(HashTable *target_ht, zval *source_dat
BEGIN_EXTERN_C()
/* startup/shutdown */
-ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC);
-ZEND_API void ZEND_FASTCALL _zend_hash_init_ex(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC);
+ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent);
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht);
-#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) _zend_hash_init((ht), (nSize), (pDestructor), (persistent) ZEND_FILE_LINE_CC)
-#define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) _zend_hash_init_ex((ht), (nSize), (pDestructor), (persistent), (bApplyProtection) ZEND_FILE_LINE_CC)
+
+#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \
+ _zend_hash_init((ht), (nSize), (pDestructor), (persistent))
+#define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) \
+ _zend_hash_init((ht), (nSize), (pDestructor), (persistent))
ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed);
+ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht);
+ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed);
+ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed);
/* additions/updates/changes */
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, uint32_t flag ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_update(HashTable *ht, zend_string *key,zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_update_ind(HashTable *ht, zend_string *key,zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add(HashTable *ht, zend_string *key,zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_add_new(HashTable *ht, zend_string *key,zval *pData ZEND_FILE_LINE_DC);
-
-#define zend_hash_update(ht, key, pData) \
- _zend_hash_update(ht, key, pData ZEND_FILE_LINE_CC)
-#define zend_hash_update_ind(ht, key, pData) \
- _zend_hash_update_ind(ht, key, pData ZEND_FILE_LINE_CC)
-#define zend_hash_add(ht, key, pData) \
- _zend_hash_add(ht, key, pData ZEND_FILE_LINE_CC)
-#define zend_hash_add_new(ht, key, pData) \
- _zend_hash_add_new(ht, key, pData ZEND_FILE_LINE_CC)
-
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add_or_update(HashTable *ht, const char *key, size_t len, zval *pData, uint32_t flag ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_update(HashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_update_ind(HashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add(HashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_str_add_new(HashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-
-#define zend_hash_str_update(ht, key, len, pData) \
- _zend_hash_str_update(ht, key, len, pData ZEND_FILE_LINE_CC)
-#define zend_hash_str_update_ind(ht, key, len, pData) \
- _zend_hash_str_update_ind(ht, key, len, pData ZEND_FILE_LINE_CC)
-#define zend_hash_str_add(ht, key, len, pData) \
- _zend_hash_str_add(ht, key, len, pData ZEND_FILE_LINE_CC)
-#define zend_hash_str_add_new(ht, key, len, pData) \
- _zend_hash_str_add_new(ht, key, len, pData ZEND_FILE_LINE_CC)
-
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add_or_update(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_next_index_insert(HashTable *ht, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval* ZEND_FASTCALL _zend_hash_next_index_insert_new(HashTable *ht, zval *pData ZEND_FILE_LINE_DC);
-
-#define zend_hash_index_add(ht, h, pData) \
- _zend_hash_index_add(ht, h, pData ZEND_FILE_LINE_CC)
-#define zend_hash_index_add_new(ht, h, pData) \
- _zend_hash_index_add_new(ht, h, pData ZEND_FILE_LINE_CC)
-#define zend_hash_index_update(ht, h, pData) \
- _zend_hash_index_update(ht, h, pData ZEND_FILE_LINE_CC)
-#define zend_hash_next_index_insert(ht, pData) \
- _zend_hash_next_index_insert(ht, pData ZEND_FILE_LINE_CC)
-#define zend_hash_next_index_insert_new(ht, pData) \
- _zend_hash_next_index_insert_new(ht, pData ZEND_FILE_LINE_CC)
+ZEND_API zval* ZEND_FASTCALL zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, uint32_t flag);
+ZEND_API zval* ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key,zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key,zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key,zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key,zval *pData);
+
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_or_update(HashTable *ht, const char *key, size_t len, zval *pData, uint32_t flag);
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *key, size_t len, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_update_ind(HashTable *ht, const char *key, size_t len, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add(HashTable *ht, const char *key, size_t len, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_new(HashTable *ht, const char *key, size_t len, zval *pData);
+
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_or_update(HashTable *ht, zend_ulong h, zval *pData, uint32_t flag);
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData);
+ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData);
ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, zend_ulong h);
ZEND_API zval* ZEND_FASTCALL zend_hash_add_empty_element(HashTable *ht, zend_string *key);
@@ -145,7 +143,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func);
ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *);
-ZEND_API void ZEND_FASTCALL zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int, ...);
+ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int, ...);
/* This function should be used with special care (in other words,
* it should usually not be used). When used with the ZEND_HASH_APPLY_STOP
@@ -170,8 +168,20 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char
ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h);
ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h);
+/* The same as zend_hash_find(), but hash value of the key must be already calculated */
+ZEND_API zval* ZEND_FASTCALL _zend_hash_find_known_hash(const HashTable *ht, zend_string *key);
+
+static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_string *key, zend_bool known_hash)
+{
+ if (known_hash) {
+ return _zend_hash_find_known_hash(ht, key);
+ } else {
+ return zend_hash_find(ht, key);
+ }
+}
+
#define ZEND_HASH_INDEX_FIND(_ht, _h, _ret, _not_found) do { \
- if (EXPECTED((_ht)->u.flags & HASH_FLAG_PACKED)) { \
+ if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \
if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \
_ret = &_ht->arData[_h].val; \
if (UNEXPECTED(Z_TYPE_P(_ret) == IS_UNDEF)) { \
@@ -195,6 +205,8 @@ ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const
ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h);
/* traversing */
+ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht);
+
#define zend_hash_has_more_elements_ex(ht, pos) \
(zend_hash_get_current_key_type_ex(ht, pos) == HASH_KEY_NON_EXISTENT ? FAILURE : SUCCESS)
ZEND_API int ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos);
@@ -227,7 +239,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, Ha
/* Copying, merging and sorting */
ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor);
-ZEND_API void ZEND_FASTCALL _zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite ZEND_FILE_LINE_DC);
+ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite);
ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
ZEND_API void zend_hash_bucket_swap(Bucket *p, Bucket *q);
ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q);
@@ -236,9 +248,6 @@ ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t
ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, compare_func_t compare_func, zend_bool renumber);
ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag);
-#define zend_hash_merge(target, source, pCopyConstructor, overwrite) \
- _zend_hash_merge(target, source, pCopyConstructor, overwrite ZEND_FILE_LINE_CC)
-
#define zend_hash_sort(ht, compare_func, renumber) \
zend_hash_sort_ex(ht, zend_sort, compare_func, renumber)
@@ -250,6 +259,24 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_
ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht);
+#if !ZEND_DEBUG && defined(HAVE_BUILTIN_CONSTANT_P)
+# define zend_new_array(size) \
+ (__builtin_constant_p(size) ? \
+ ((((uint32_t)(size)) <= HT_MIN_SIZE) ? \
+ _zend_new_array_0() \
+ : \
+ _zend_new_array((size)) \
+ ) \
+ : \
+ _zend_new_array((size)) \
+ )
+#else
+# define zend_new_array(size) \
+ _zend_new_array(size)
+#endif
+
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(void);
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t size);
ZEND_API uint32_t zend_array_count(HashTable *ht);
ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source);
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht);
@@ -265,10 +292,11 @@ ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos_ex(uint32_t idx, zval
ZEND_API void ZEND_FASTCALL zend_hash_iterator_del(uint32_t idx);
ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start);
ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosition to);
+ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step);
static zend_always_inline void zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosition to)
{
- if (UNEXPECTED(ht->u.v.nIteratorsCount)) {
+ if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
_zend_hash_iterators_update(ht, from, to);
}
}
@@ -286,7 +314,7 @@ static zend_always_inline int _zend_handle_numeric_str(const char *key, size_t l
{
const char *tmp = key;
- if (*tmp > '9') {
+ if (EXPECTED(*tmp > '9')) {
return 0;
} else if (*tmp < '0') {
if (*tmp != '-') {
@@ -317,6 +345,16 @@ static zend_always_inline zval *zend_hash_find_ind(const HashTable *ht, zend_str
}
+static zend_always_inline zval *zend_hash_find_ex_ind(const HashTable *ht, zend_string *key, zend_bool known_hash)
+{
+ zval *zv;
+
+ zv = zend_hash_find_ex(ht, key, known_hash);
+ return (zv && Z_TYPE_P(zv) == IS_INDIRECT) ?
+ ((Z_TYPE_P(Z_INDIRECT_P(zv)) != IS_UNDEF) ? Z_INDIRECT_P(zv) : NULL) : zv;
+}
+
+
static zend_always_inline int zend_hash_exists_ind(const HashTable *ht, zend_string *key)
{
zval *zv;
@@ -586,12 +624,8 @@ static zend_always_inline void *zend_hash_update_ptr(HashTable *ht, zend_string
ZVAL_PTR(&tmp, pData);
zv = zend_hash_update(ht, key, &tmp);
- if (zv) {
- ZEND_ASSUME(Z_PTR_P(zv));
- return Z_PTR_P(zv);
- } else {
- return NULL;
- }
+ ZEND_ASSUME(Z_PTR_P(zv));
+ return Z_PTR_P(zv);
}
static zend_always_inline void *zend_hash_str_update_ptr(HashTable *ht, const char *str, size_t len, void *pData)
@@ -600,12 +634,8 @@ static zend_always_inline void *zend_hash_str_update_ptr(HashTable *ht, const ch
ZVAL_PTR(&tmp, pData);
zv = zend_hash_str_update(ht, str, len, &tmp);
- if (zv) {
- ZEND_ASSUME(Z_PTR_P(zv));
- return Z_PTR_P(zv);
- } else {
- return NULL;
- }
+ ZEND_ASSUME(Z_PTR_P(zv));
+ return Z_PTR_P(zv);
}
static zend_always_inline void *zend_hash_add_mem(HashTable *ht, zend_string *key, void *pData, size_t size)
@@ -614,7 +644,20 @@ static zend_always_inline void *zend_hash_add_mem(HashTable *ht, zend_string *ke
ZVAL_PTR(&tmp, NULL);
if ((zv = zend_hash_add(ht, key, &tmp))) {
- Z_PTR_P(zv) = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ memcpy(Z_PTR_P(zv), pData, size);
+ return Z_PTR_P(zv);
+ }
+ return NULL;
+}
+
+static zend_always_inline void *zend_hash_add_new_mem(HashTable *ht, zend_string *key, void *pData, size_t size)
+{
+ zval tmp, *zv;
+
+ ZVAL_PTR(&tmp, NULL);
+ if ((zv = zend_hash_add_new(ht, key, &tmp))) {
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(Z_PTR_P(zv), pData, size);
return Z_PTR_P(zv);
}
@@ -627,7 +670,20 @@ static zend_always_inline void *zend_hash_str_add_mem(HashTable *ht, const char
ZVAL_PTR(&tmp, NULL);
if ((zv = zend_hash_str_add(ht, str, len, &tmp))) {
- Z_PTR_P(zv) = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+ memcpy(Z_PTR_P(zv), pData, size);
+ return Z_PTR_P(zv);
+ }
+ return NULL;
+}
+
+static zend_always_inline void *zend_hash_str_add_new_mem(HashTable *ht, const char *str, size_t len, void *pData, size_t size)
+{
+ zval tmp, *zv;
+
+ ZVAL_PTR(&tmp, NULL);
+ if ((zv = zend_hash_str_add_new(ht, str, len, &tmp))) {
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(Z_PTR_P(zv), pData, size);
return Z_PTR_P(zv);
}
@@ -638,7 +694,7 @@ static zend_always_inline void *zend_hash_update_mem(HashTable *ht, zend_string
{
void *p;
- p = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ p = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(p, pData, size);
return zend_hash_update_ptr(ht, key, p);
}
@@ -647,7 +703,7 @@ static zend_always_inline void *zend_hash_str_update_mem(HashTable *ht, const ch
{
void *p;
- p = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ p = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(p, pData, size);
return zend_hash_str_update_ptr(ht, str, len, p);
}
@@ -676,12 +732,8 @@ static zend_always_inline void *zend_hash_index_update_ptr(HashTable *ht, zend_u
ZVAL_PTR(&tmp, pData);
zv = zend_hash_index_update(ht, h, &tmp);
- if (zv) {
- ZEND_ASSUME(Z_PTR_P(zv));
- return Z_PTR_P(zv);
- } else {
- return NULL;
- }
+ ZEND_ASSUME(Z_PTR_P(zv));
+ return Z_PTR_P(zv);
}
static zend_always_inline void *zend_hash_index_add_mem(HashTable *ht, zend_ulong h, void *pData, size_t size)
@@ -690,7 +742,7 @@ static zend_always_inline void *zend_hash_index_add_mem(HashTable *ht, zend_ulon
ZVAL_PTR(&tmp, NULL);
if ((zv = zend_hash_index_add(ht, h, &tmp))) {
- Z_PTR_P(zv) = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(Z_PTR_P(zv), pData, size);
return Z_PTR_P(zv);
}
@@ -715,7 +767,7 @@ static zend_always_inline void *zend_hash_index_update_mem(HashTable *ht, zend_u
{
void *p;
- p = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ p = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(p, pData, size);
return zend_hash_index_update_ptr(ht, h, p);
}
@@ -726,7 +778,7 @@ static zend_always_inline void *zend_hash_next_index_insert_mem(HashTable *ht, v
ZVAL_PTR(&tmp, NULL);
if ((zv = zend_hash_next_index_insert(ht, &tmp))) {
- Z_PTR_P(zv) = pemalloc(size, ht->u.flags & HASH_FLAG_PERSISTENT);
+ Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
memcpy(Z_PTR_P(zv), pData, size);
return Z_PTR_P(zv);
}
@@ -746,6 +798,19 @@ static zend_always_inline void *zend_hash_find_ptr(const HashTable *ht, zend_str
}
}
+static zend_always_inline void *zend_hash_find_ex_ptr(const HashTable *ht, zend_string *key, zend_bool known_hash)
+{
+ zval *zv;
+
+ zv = zend_hash_find_ex(ht, key, known_hash);
+ if (zv) {
+ ZEND_ASSUME(Z_PTR_P(zv));
+ return Z_PTR_P(zv);
+ } else {
+ return NULL;
+ }
+}
+
static zend_always_inline void *zend_hash_str_find_ptr(const HashTable *ht, const char *str, size_t len)
{
zval *zv;
@@ -839,10 +904,12 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
#define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \
HashTable *__ht = (_ht); \
- uint32_t _idx; \
+ uint32_t _idx = __ht->nNumUsed; \
+ Bucket *_p = __ht->arData + _idx; \
+ zval *_z; \
for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \
- Bucket *_p = __ht->arData + (_idx - 1); \
- zval *_z = &_p->val; \
+ _p--; \
+ _z = &_p->val; \
if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
_z = Z_INDIRECT_P(_z); \
} \
@@ -858,7 +925,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
uint32_t j = HT_IDX_TO_HASH(_idx - 1); \
uint32_t nIndex = _p->h | __ht->nTableMask; \
uint32_t i = HT_HASH(__ht, nIndex); \
- if (j != i) { \
+ if (UNEXPECTED(j != i)) { \
Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \
while (Z_NEXT(prev->val) != j) { \
i = Z_NEXT(prev->val); \
@@ -978,16 +1045,6 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
_key = _p->key; \
_val = _z;
-#define ZEND_HASH_APPLY_PROTECTION(ht) \
- ((ht)->u.flags & HASH_FLAG_APPLY_PROTECTION)
-
-#define ZEND_HASH_APPLY_SHIFT 8
-#define ZEND_HASH_APPLY_COUNT_MASK 0xff00
-#define ZEND_HASH_GET_APPLY_COUNT(ht) (((ht)->u.flags & ZEND_HASH_APPLY_COUNT_MASK) >> ZEND_HASH_APPLY_SHIFT)
-#define ZEND_HASH_INC_APPLY_COUNT(ht) ((ht)->u.flags += (1 << ZEND_HASH_APPLY_SHIFT))
-#define ZEND_HASH_DEC_APPLY_COUNT(ht) ((ht)->u.flags -= (1 << ZEND_HASH_APPLY_SHIFT))
-
-
/* The following macros are useful to insert a sequence of new elements
* of packed array. They may be use insted of series of
* zend_hash_next_index_insert_new()
@@ -997,7 +1054,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
HashTable *__fill_ht = (ht); \
Bucket *__fill_bkt = __fill_ht->arData + __fill_ht->nNumUsed; \
uint32_t __fill_idx = __fill_ht->nNumUsed; \
- ZEND_ASSERT(__fill_ht->u.flags & HASH_FLAG_PACKED);
+ ZEND_ASSERT(HT_FLAGS(__fill_ht) & HASH_FLAG_PACKED);
#define ZEND_HASH_FILL_ADD(_val) do { \
ZVAL_COPY_VALUE(&__fill_bkt->val, _val); \
@@ -1011,18 +1068,18 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
__fill_ht->nNumUsed = __fill_idx; \
__fill_ht->nNumOfElements = __fill_idx; \
__fill_ht->nNextFreeElement = __fill_idx; \
- __fill_ht->nInternalPointer = __fill_idx ? 0 : HT_INVALID_IDX; \
+ __fill_ht->nInternalPointer = 0; \
} while (0)
-static zend_always_inline zval *_zend_hash_append(HashTable *ht, zend_string *key, zval *zv)
+static zend_always_inline zval *_zend_hash_append_ex(HashTable *ht, zend_string *key, zval *zv, int interned)
{
uint32_t idx = ht->nNumUsed++;
uint32_t nIndex;
Bucket *p = ht->arData + idx;
ZVAL_COPY_VALUE(&p->val, zv);
- if (!ZSTR_IS_INTERNED(key)) {
- ht->u.flags &= ~HASH_FLAG_STATIC_KEYS;
+ if (!interned && !ZSTR_IS_INTERNED(key)) {
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
zend_string_addref(key);
zend_string_hash_val(key);
}
@@ -1031,20 +1088,24 @@ static zend_always_inline zval *_zend_hash_append(HashTable *ht, zend_string *ke
nIndex = (uint32_t)p->h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
- ht->nNumUsed = idx + 1;
ht->nNumOfElements++;
return &p->val;
}
-static zend_always_inline zval *_zend_hash_append_ptr(HashTable *ht, zend_string *key, void *ptr)
+static zend_always_inline zval *_zend_hash_append(HashTable *ht, zend_string *key, zval *zv)
+{
+ return _zend_hash_append_ex(ht, key, zv, 0);
+}
+
+static zend_always_inline zval *_zend_hash_append_ptr_ex(HashTable *ht, zend_string *key, void *ptr, int interned)
{
uint32_t idx = ht->nNumUsed++;
uint32_t nIndex;
Bucket *p = ht->arData + idx;
ZVAL_PTR(&p->val, ptr);
- if (!ZSTR_IS_INTERNED(key)) {
- ht->u.flags &= ~HASH_FLAG_STATIC_KEYS;
+ if (!interned && !ZSTR_IS_INTERNED(key)) {
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
zend_string_addref(key);
zend_string_hash_val(key);
}
@@ -1053,11 +1114,15 @@ static zend_always_inline zval *_zend_hash_append_ptr(HashTable *ht, zend_string
nIndex = (uint32_t)p->h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
- ht->nNumUsed = idx + 1;
ht->nNumOfElements++;
return &p->val;
}
+static zend_always_inline zval *_zend_hash_append_ptr(HashTable *ht, zend_string *key, void *ptr)
+{
+ return _zend_hash_append_ptr_ex(ht, key, ptr, 0);
+}
+
static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string *key, zval *ptr)
{
uint32_t idx = ht->nNumUsed++;
@@ -1066,7 +1131,7 @@ static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string
ZVAL_INDIRECT(&p->val, ptr);
if (!ZSTR_IS_INTERNED(key)) {
- ht->u.flags &= ~HASH_FLAG_STATIC_KEYS;
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
zend_string_addref(key);
zend_string_hash_val(key);
}
@@ -1075,7 +1140,6 @@ static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string
nIndex = (uint32_t)p->h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
- ht->nNumUsed = idx + 1;
ht->nNumOfElements++;
}
diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c
index e1eed23a4c..b3bc631654 100644
--- a/Zend/zend_highlight.c
+++ b/Zend/zend_highlight.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include <zend_language_parser.h>
#include "zend_compile.h"
@@ -93,8 +91,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
zend_printf("<code>");
zend_printf("<span style=\"color: %s\">\n", last_color);
/* highlight stuff coming back from zendlex() */
- ZVAL_UNDEF(&token);
- while ((token_type=lex_scan(&token))) {
+ while ((token_type=lex_scan(&token, NULL))) {
switch (token_type) {
case T_INLINE_HTML:
next_color = syntax_highlighter_ini->highlight_html;
@@ -157,7 +154,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
case T_DOC_COMMENT:
break;
default:
- zend_string_release(Z_STR(token));
+ zval_ptr_dtor_str(&token);
break;
}
}
@@ -180,8 +177,7 @@ ZEND_API void zend_strip(void)
int token_type;
int prev_space = 0;
- ZVAL_UNDEF(&token);
- while ((token_type=lex_scan(&token))) {
+ while ((token_type=lex_scan(&token, NULL))) {
switch (token_type) {
case T_WHITESPACE:
if (!prev_space) {
@@ -197,7 +193,7 @@ ZEND_API void zend_strip(void)
case T_END_HEREDOC:
zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
/* read the following character, either newline or ; */
- if (lex_scan(&token) != T_WHITESPACE) {
+ if (lex_scan(&token, NULL) != T_WHITESPACE) {
zend_write((char*)LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
}
zend_write("\n", sizeof("\n") - 1);
@@ -221,7 +217,7 @@ ZEND_API void zend_strip(void)
break;
default:
- zend_string_release(Z_STR(token));
+ zval_ptr_dtor_str(&token);
break;
}
}
diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h
index c1ef4be780..067d2ddbd2 100644
--- a/Zend/zend_highlight.h
+++ b/Zend/zend_highlight.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_HIGHLIGHT_H
#define ZEND_HIGHLIGHT_H
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index fac74a28f0..0b0cb314b6 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -12,8 +12,8 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
@@ -79,7 +79,7 @@ static zend_function *zend_duplicate_function(zend_function *func, zend_class_en
return func;
}
if (!(GC_FLAGS(func->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(func->op_array.static_variables)++;
+ GC_ADDREF(func->op_array.static_variables);
}
new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
memcpy(new_function, func, sizeof(zend_op_array));
@@ -99,8 +99,23 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
if (EXPECTED(!ce->get_iterator)) {
ce->get_iterator = ce->parent->get_iterator;
}
- if (EXPECTED(!ce->iterator_funcs.funcs)) {
- ce->iterator_funcs.funcs = ce->parent->iterator_funcs.funcs;
+ if (EXPECTED(!ce->iterator_funcs_ptr) && UNEXPECTED(ce->parent->iterator_funcs_ptr)) {
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ ce->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
+ if (ce->parent->iterator_funcs_ptr->zf_new_iterator) {
+ ce->iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&ce->function_table, "getiterator", sizeof("getiterator") - 1);
+ }
+ if (ce->parent->iterator_funcs_ptr->zf_current) {
+ ce->iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&ce->function_table, "rewind", sizeof("rewind") - 1);
+ ce->iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&ce->function_table, "valid", sizeof("valid") - 1);
+ ce->iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&ce->function_table, "key", sizeof("key") - 1);
+ ce->iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&ce->function_table, "current", sizeof("current") - 1);
+ ce->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&ce->function_table, "next", sizeof("next") - 1);
+ }
+ } else {
+ ce->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
+ memset(ce->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
+ }
}
if (EXPECTED(!ce->__get)) {
ce->__get = ce->parent->__get;
@@ -410,14 +425,8 @@ static ZEND_COLD void zend_append_type_hint(smart_str *str, const zend_function
smart_str_appendc(str, ' ');
}
} else if (ZEND_TYPE_IS_CODE(arg_info->type)) {
- if (ZEND_TYPE_CODE(arg_info->type) == IS_LONG) {
- smart_str_appendl(str, "int", 3);
- } else if (ZEND_TYPE_CODE(arg_info->type) == _IS_BOOL) {
- smart_str_appendl(str, "bool", 4);
- } else {
- const char *type_name = zend_get_type_by_const(ZEND_TYPE_CODE(arg_info->type));
- smart_str_appends(str, type_name);
- }
+ const char *type_name = zend_get_type_by_const(ZEND_TYPE_CODE(arg_info->type));
+ smart_str_appends(str, type_name);
if (!return_hint) {
smart_str_appendc(str, ' ');
}
@@ -495,11 +504,9 @@ static ZEND_COLD zend_string *zend_get_function_declaration(const zend_function
}
}
if (precv && precv->opcode == ZEND_RECV_INIT && precv->op2_type != IS_UNUSED) {
- zval *zv = RT_CONSTANT(&fptr->op_array, precv->op2);
+ zval *zv = RT_CONSTANT(precv, precv->op2);
- if (Z_TYPE_P(zv) == IS_CONSTANT) {
- smart_str_append(&str, Z_STR_P(zv));
- } else if (Z_TYPE_P(zv) == IS_FALSE) {
+ if (Z_TYPE_P(zv) == IS_FALSE) {
smart_str_appends(&str, "false");
} else if (Z_TYPE_P(zv) == IS_TRUE) {
smart_str_appends(&str, "true");
@@ -515,11 +522,17 @@ static ZEND_COLD zend_string *zend_get_function_declaration(const zend_function
} else if (Z_TYPE_P(zv) == IS_ARRAY) {
smart_str_appends(&str, "Array");
} else if (Z_TYPE_P(zv) == IS_CONSTANT_AST) {
- smart_str_appends(&str, "<expression>");
+ zend_ast *ast = Z_ASTVAL_P(zv);
+ if (ast->kind == ZEND_AST_CONSTANT) {
+ smart_str_append(&str, zend_ast_get_constant_name(ast));
+ } else {
+ smart_str_appends(&str, "<expression>");
+ }
} else {
- zend_string *zv_str = zval_get_string(zv);
+ zend_string *tmp_zv_str;
+ zend_string *zv_str = zval_get_tmp_string(zv, &tmp_zv_str);
smart_str_append(&str, zv_str);
- zend_string_release(zv_str);
+ zend_tmp_string_release(tmp_zv_str);
}
}
} else {
@@ -559,7 +572,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
/* You cannot change from static to non static and vice versa.
*/
if (UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) {
- if (child->common.fn_flags & ZEND_ACC_STATIC) {
+ if (child_flags & ZEND_ACC_STATIC) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
} else {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
@@ -577,11 +590,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), ZSTR_VAL(child->common.function_name), zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker");
}
- if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK))
- && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) {
- child->common.fn_flags |= ZEND_ACC_CHANGED;
- }
- if (parent_flags & ZEND_ACC_CHANGED) {
+ if ((child_flags & ZEND_ACC_PRIVATE) < (parent_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_CHANGED))) {
child->common.fn_flags |= ZEND_ACC_CHANGED;
}
@@ -590,13 +599,13 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
} else if (parent_flags & ZEND_ACC_ABSTRACT) {
child->common.fn_flags |= ZEND_ACC_IMPLEMENTED_ABSTRACT;
child->common.prototype = parent;
- } else if (!(parent->common.fn_flags & ZEND_ACC_CTOR) || (parent->common.prototype && (parent->common.prototype->common.scope->ce_flags & ZEND_ACC_INTERFACE))) {
+ } else if (!(parent->common.fn_flags & ZEND_ACC_CTOR)) {
+ child->common.prototype = parent->common.prototype ? parent->common.prototype : parent;
+ } else if (parent->common.prototype && (parent->common.prototype->common.scope->ce_flags & ZEND_ACC_INTERFACE)) {
/* ctors only have a prototype if it comes from an interface */
child->common.prototype = parent->common.prototype ? parent->common.prototype : parent;
/* and if that is the case, we want to check inheritance against it */
- if (parent->common.fn_flags & ZEND_ACC_CTOR) {
- parent = child->common.prototype;
- }
+ parent = child->common.prototype;
}
if (UNEXPECTED(!zend_do_perform_implementation_check(child, parent))) {
@@ -621,15 +630,15 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
error_verb = "should";
}
zend_error(error_level, "Declaration of %s %s be compatible with %s", ZSTR_VAL(child_prototype), error_verb, ZSTR_VAL(method_prototype));
- zend_string_free(child_prototype);
- zend_string_free(method_prototype);
+ zend_string_efree(child_prototype);
+ zend_string_efree(method_prototype);
}
}
/* }}} */
static zend_function *do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce) /* {{{ */
{
- zval *child = zend_hash_find(&ce->function_table, key);
+ zval *child = zend_hash_find_ex(&ce->function_table, key, 1);
if (child) {
zend_function *func = (zend_function*)Z_PTR_P(child);
@@ -659,7 +668,7 @@ static zend_function *do_inherit_method(zend_string *key, zend_function *parent,
static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */
{
- zval *child = zend_hash_find(&ce->properties_info, key);
+ zval *child = zend_hash_find_ex(&ce->properties_info, key, 1);
zend_property_info *child_info;
if (UNEXPECTED(child)) {
@@ -691,7 +700,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
}
}
} else {
- if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) {
+ if (UNEXPECTED(parent_info->flags & ZEND_ACC_PRIVATE)) {
if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
child_info = zend_duplicate_property_info_internal(parent_info);
} else {
@@ -761,27 +770,25 @@ ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_
static void do_inherit_class_constant(zend_string *name, zend_class_constant *parent_const, zend_class_entry *ce) /* {{{ */
{
- zend_class_constant *c = zend_hash_find_ptr(&ce->constants_table, name);
+ zval *zv = zend_hash_find_ex(&ce->constants_table, name, 1);
+ zend_class_constant *c;
- if (c != NULL) {
+ if (zv != NULL) {
+ c = (zend_class_constant*)Z_PTR_P(zv);
if (UNEXPECTED((Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PPP_MASK) > (Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PPP_MASK))) {
zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s must be %s (as in class %s)%s",
ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(Z_ACCESS_FLAGS(parent_const->value)), ZSTR_VAL(ce->parent->name), (Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PUBLIC) ? "" : " or weaker");
}
} else if (!(Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PRIVATE)) {
- if (Z_CONSTANT(parent_const->value)) {
+ if (Z_TYPE(parent_const->value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
if (ce->type & ZEND_INTERNAL_CLASS) {
- if (Z_REFCOUNTED(parent_const->value)) {
- Z_ADDREF(parent_const->value);
- }
c = pemalloc(sizeof(zend_class_constant), 1);
memcpy(c, parent_const, sizeof(zend_class_constant));
- } else {
- c = parent_const;
+ parent_const = c;
}
- _zend_hash_append_ptr(&ce->constants_table, name, c);
+ _zend_hash_append_ptr(&ce->constants_table, name, parent_const);
}
}
/* }}} */
@@ -839,24 +846,28 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
ce->default_properties_table = end;
}
src = parent_ce->default_properties_table + parent_ce->default_properties_count;
- do {
- dst--;
- src--;
-#ifdef ZTS
- if (parent_ce->type != ce->type) {
- ZVAL_DUP(dst, src);
- if (Z_OPT_CONSTANT_P(dst)) {
+ if (UNEXPECTED(parent_ce->type != ce->type)) {
+ /* User class extends internal */
+ do {
+ dst--;
+ src--;
+ ZVAL_COPY_OR_DUP(dst, src);
+ if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
continue;
- }
-#endif
-
- ZVAL_COPY(dst, src);
- if (Z_OPT_CONSTANT_P(dst)) {
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
- }
- } while (dst != end);
+ } while (dst != end);
+ } else {
+ do {
+ dst--;
+ src--;
+ ZVAL_COPY(dst, src);
+ if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
+ ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ }
+ continue;
+ } while (dst != end);
+ }
ce->default_properties_count += parent_ce->default_properties_count;
}
@@ -881,28 +892,53 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
dst = end + parent_ce->default_static_members_count;
ce->default_static_members_table = end;
}
- src = parent_ce->default_static_members_table + parent_ce->default_static_members_count;
- do {
- dst--;
- src--;
- if (parent_ce->type == ZEND_INTERNAL_CLASS) {
- if (!Z_ISREF_P(src)) {
- ZVAL_NEW_PERSISTENT_REF(src, src);
- }
- } else {
- ZVAL_MAKE_REF(src);
+ if (UNEXPECTED(parent_ce->type != ce->type)) {
+ /* User class extends internal */
+ if (CE_STATIC_MEMBERS(parent_ce) == NULL) {
+ zend_class_init_statics(parent_ce);
}
- ZVAL_COPY_VALUE(dst, src);
- Z_ADDREF_P(dst);
- if (Z_CONSTANT_P(Z_REFVAL_P(dst))) {
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ if (UNEXPECTED(zend_update_class_constants(parent_ce) != SUCCESS)) {
+ ZEND_ASSERT(0);
}
- } while (dst != end);
+ src = CE_STATIC_MEMBERS(parent_ce) + parent_ce->default_static_members_count;
+ do {
+ dst--;
+ src--;
+ if (Z_TYPE_P(src) == IS_INDIRECT) {
+ ZVAL_INDIRECT(dst, Z_INDIRECT_P(src));
+ } else {
+ ZVAL_INDIRECT(dst, src);
+ }
+ } while (dst != end);
+ } else if (ce->type == ZEND_USER_CLASS) {
+ src = parent_ce->default_static_members_table + parent_ce->default_static_members_count;
+ do {
+ dst--;
+ src--;
+ if (Z_TYPE_P(src) == IS_INDIRECT) {
+ ZVAL_INDIRECT(dst, Z_INDIRECT_P(src));
+ } else {
+ ZVAL_INDIRECT(dst, src);
+ }
+ if (Z_TYPE_P(Z_INDIRECT_P(dst)) == IS_CONSTANT_AST) {
+ ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ }
+ } while (dst != end);
+ } else {
+ src = parent_ce->default_static_members_table + parent_ce->default_static_members_count;
+ do {
+ dst--;
+ src--;
+ if (Z_TYPE_P(src) == IS_INDIRECT) {
+ ZVAL_INDIRECT(dst, Z_INDIRECT_P(src));
+ } else {
+ ZVAL_INDIRECT(dst, src);
+ }
+ } while (dst != end);
+ }
ce->default_static_members_count += parent_ce->default_static_members_count;
if (ce->type == ZEND_USER_CLASS) {
ce->static_members_table = ce->default_static_members_table;
- } else {
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
}
@@ -966,9 +1002,11 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zend_class_constant *parent_constant, zend_string *name, const zend_class_entry *iface) /* {{{ */
{
+ zval *zv = zend_hash_find_ex(child_constants_table, name, 1);
zend_class_constant *old_constant;
- if ((old_constant = zend_hash_find_ptr(child_constants_table, name)) != NULL) {
+ if (zv != NULL) {
+ old_constant = (zend_class_constant*)Z_PTR_P(zv);
if (old_constant->ce != parent_constant->ce) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", ZSTR_VAL(name), ZSTR_VAL(iface->name));
}
@@ -982,19 +1020,15 @@ static void do_inherit_iface_constant(zend_string *name, zend_class_constant *c,
{
if (do_inherit_constant_check(&ce->constants_table, c, name, iface)) {
zend_class_constant *ct;
- if (Z_CONSTANT(c->value)) {
+ if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
if (ce->type & ZEND_INTERNAL_CLASS) {
- if (Z_REFCOUNTED(c->value)) {
- Z_ADDREF(c->value);
- }
ct = pemalloc(sizeof(zend_class_constant), 1);
memcpy(ct, c, sizeof(zend_class_constant));
- } else {
- ct = c;
+ c = ct;
}
- zend_hash_update_ptr(&ce->constants_table, name, ct);
+ zend_hash_update_ptr(&ce->constants_table, name, c);
}
}
/* }}} */
@@ -1095,7 +1129,9 @@ static zend_bool zend_traits_method_compatibility_check(zend_function *fn, zend_
static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */
{
- if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) {
+ if (ZSTR_LEN(ce->name) != ZSTR_LEN(mname) && (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_')) {
+ /* pass */
+ } else if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) {
ce->clone = fe;
} else if (zend_string_equals_literal(mname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
@@ -1134,7 +1170,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zen
ce->constructor = fe;
fe->common.fn_flags |= ZEND_ACC_CTOR;
}
- zend_string_release(lowercase_name);
+ zend_string_release_ex(lowercase_name, 0);
}
}
/* }}} */
@@ -1145,6 +1181,14 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
zend_function *new_fn;
if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) {
+ /* if it is the same function with the same visibility and has not been assigned a class scope yet, regardless
+ * of where it is coming from there is no conflict and we do not need to add it again */
+ if (existing_fn->op_array.opcodes == fn->op_array.opcodes &&
+ (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK) &&
+ (existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+ return;
+ }
+
if (existing_fn->common.scope == ce) {
/* members from the current class override trait methods */
/* use temporary *overriden HashTable to detect hidden conflict */
@@ -1239,22 +1283,24 @@ static void zend_fixup_trait_method(zend_function *fn, zend_class_entry *ce) /*
}
/* }}} */
-static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce, HashTable **overriden, HashTable *exclude_table) /* {{{ */
+static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce, HashTable **overriden, HashTable *exclude_table, zend_class_entry **aliases) /* {{{ */
{
zend_trait_alias *alias, **alias_ptr;
zend_string *lcname;
zend_function fn_copy;
+ int i;
/* apply aliases which are qualified with a class name, there should not be any ambiguity */
if (ce->trait_aliases) {
alias_ptr = ce->trait_aliases;
alias = *alias_ptr;
+ i = 0;
while (alias) {
/* Scope unset or equal to the function we compare to, and the alias applies to fn */
if (alias->alias != NULL
- && (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce)
- && ZSTR_LEN(alias->trait_method->method_name) == ZSTR_LEN(fnname)
- && (zend_binary_strcasecmp(ZSTR_VAL(alias->trait_method->method_name), ZSTR_LEN(alias->trait_method->method_name), ZSTR_VAL(fnname), ZSTR_LEN(fnname)) == 0)) {
+ && (!aliases[i] || fn->common.scope == aliases[i])
+ && ZSTR_LEN(alias->trait_method.method_name) == ZSTR_LEN(fnname)
+ && (zend_binary_strcasecmp(ZSTR_VAL(alias->trait_method.method_name), ZSTR_LEN(alias->trait_method.method_name), ZSTR_VAL(fnname), ZSTR_LEN(fnname)) == 0)) {
fn_copy = *fn;
/* if it is 0, no modifieres has been changed */
@@ -1264,15 +1310,20 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
lcname = zend_string_tolower(alias->alias);
zend_add_trait_method(ce, ZSTR_VAL(alias->alias), lcname, &fn_copy, overriden);
- zend_string_release(lcname);
+ zend_string_release_ex(lcname, 0);
/* Record the trait from which this alias was resolved. */
- if (!alias->trait_method->ce) {
- alias->trait_method->ce = fn->common.scope;
+ if (!aliases[i]) {
+ aliases[i] = fn->common.scope;
+ }
+ if (!alias->trait_method.class_name) {
+ /* TODO: try to avoid this assignment (it's necessary only for reflection) */
+ alias->trait_method.class_name = zend_string_copy(fn->common.scope->name);
}
}
alias_ptr++;
alias = *alias_ptr;
+ i++;
}
}
@@ -1285,22 +1336,28 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
if (ce->trait_aliases) {
alias_ptr = ce->trait_aliases;
alias = *alias_ptr;
+ i = 0;
while (alias) {
/* Scope unset or equal to the function we compare to, and the alias applies to fn */
if (alias->alias == NULL && alias->modifiers != 0
- && (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce)
- && (ZSTR_LEN(alias->trait_method->method_name) == ZSTR_LEN(fnname))
- && (zend_binary_strcasecmp(ZSTR_VAL(alias->trait_method->method_name), ZSTR_LEN(alias->trait_method->method_name), ZSTR_VAL(fnname), ZSTR_LEN(fnname)) == 0)) {
+ && (!aliases[i] || fn->common.scope == aliases[i])
+ && (ZSTR_LEN(alias->trait_method.method_name) == ZSTR_LEN(fnname))
+ && (zend_binary_strcasecmp(ZSTR_VAL(alias->trait_method.method_name), ZSTR_LEN(alias->trait_method.method_name), ZSTR_VAL(fnname), ZSTR_LEN(fnname)) == 0)) {
fn_copy.common.fn_flags = alias->modifiers | (fn->common.fn_flags ^ (fn->common.fn_flags & ZEND_ACC_PPP_MASK));
/** Record the trait from which this alias was resolved. */
- if (!alias->trait_method->ce) {
- alias->trait_method->ce = fn->common.scope;
+ if (!aliases[i]) {
+ aliases[i] = fn->common.scope;
+ }
+ if (!alias->trait_method.class_name) {
+ /* TODO: try to avoid this assignment (it's necessary only for reflection) */
+ alias->trait_method.class_name = zend_string_copy(fn->common.scope->name);
}
}
alias_ptr++;
alias = *alias_ptr;
+ i++;
}
}
@@ -1311,24 +1368,26 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
}
/* }}} */
-static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait) /* {{{ */
+static uint32_t zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait) /* {{{ */
{
uint32_t i;
if (UNEXPECTED((trait->ce_flags & ZEND_ACC_TRAIT) != ZEND_ACC_TRAIT)) {
zend_error_noreturn(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", ZSTR_VAL(trait->name));
+ return 0;
}
for (i = 0; i < ce->num_traits; i++) {
if (ce->traits[i] == trait) {
- return;
+ return i;
}
}
zend_error_noreturn(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", ZSTR_VAL(trait->name), ZSTR_VAL(ce->name));
+ return 0;
}
/* }}} */
-static void zend_traits_init_trait_structures(zend_class_entry *ce) /* {{{ */
+static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable ***exclude_tables_ptr, zend_class_entry ***aliases_ptr) /* {{{ */
{
size_t i, j = 0;
zend_trait_precedence **precedences;
@@ -1336,64 +1395,72 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce) /* {{{ */
zend_trait_method_reference *cur_method_ref;
zend_string *lcname;
zend_bool method_exists;
+ HashTable **exclude_tables = NULL;
+ zend_class_entry **aliases = NULL;
+ zend_class_entry *trait;
/* resolve class references */
if (ce->trait_precedences) {
+ exclude_tables = ecalloc(ce->num_traits, sizeof(HashTable*));
i = 0;
precedences = ce->trait_precedences;
ce->trait_precedences = NULL;
while ((cur_precedence = precedences[i])) {
/** Resolve classes for all precedence operations. */
- if (cur_precedence->exclude_from_classes) {
- cur_method_ref = cur_precedence->trait_method;
- if (!(cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name,
- ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name));
- }
- zend_check_trait_usage(ce, cur_precedence->trait_method->ce);
+ cur_method_ref = &cur_precedence->trait_method;
+ trait = zend_fetch_class(cur_method_ref->class_name,
+ ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (!trait) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name));
+ }
+ zend_check_trait_usage(ce, trait);
+
+ /** Ensure that the preferred method is actually available. */
+ lcname = zend_string_tolower(cur_method_ref->method_name);
+ method_exists = zend_hash_exists(&trait->function_table, lcname);
+ if (!method_exists) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "A precedence rule was defined for %s::%s but this method does not exist",
+ ZSTR_VAL(trait->name),
+ ZSTR_VAL(cur_method_ref->method_name));
+ }
- /** Ensure that the preferred method is actually available. */
- lcname = zend_string_tolower(cur_method_ref->method_name);
- method_exists = zend_hash_exists(&cur_method_ref->ce->function_table,
- lcname);
- zend_string_release(lcname);
- if (!method_exists) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "A precedence rule was defined for %s::%s but this method does not exist",
- ZSTR_VAL(cur_method_ref->ce->name),
- ZSTR_VAL(cur_method_ref->method_name));
- }
+ /** With the other traits, we are more permissive.
+ We do not give errors for those. This allows to be more
+ defensive in such definitions.
+ However, we want to make sure that the insteadof declaration
+ is consistent in itself.
+ */
- /** With the other traits, we are more permissive.
- We do not give errors for those. This allows to be more
- defensive in such definitions.
- However, we want to make sure that the insteadof declaration
- is consistent in itself.
- */
- j = 0;
- while (cur_precedence->exclude_from_classes[j].class_name) {
- zend_string* class_name = cur_precedence->exclude_from_classes[j].class_name;
-
- if (!(cur_precedence->exclude_from_classes[j].ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(class_name));
- }
- zend_check_trait_usage(ce, cur_precedence->exclude_from_classes[j].ce);
+ for (j = 0; j < cur_precedence->num_excludes; j++) {
+ zend_string* class_name = cur_precedence->exclude_class_names[j];
+ zend_class_entry *exclude_ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ uint32_t trait_num;
- /* make sure that the trait method is not from a class mentioned in
- exclude_from_classes, for consistency */
- if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[j].ce) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "Inconsistent insteadof definition. "
- "The method %s is to be used from %s, but %s is also on the exclude list",
- ZSTR_VAL(cur_method_ref->method_name),
- ZSTR_VAL(cur_precedence->trait_method->ce->name),
- ZSTR_VAL(cur_precedence->trait_method->ce->name));
- }
+ if (!exclude_ce) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(class_name));
+ }
+ trait_num = zend_check_trait_usage(ce, exclude_ce);
+ if (!exclude_tables[trait_num]) {
+ ALLOC_HASHTABLE(exclude_tables[trait_num]);
+ zend_hash_init(exclude_tables[trait_num], 0, NULL, NULL, 0);
+ }
+ if (zend_hash_add_empty_element(exclude_tables[trait_num], lcname) == NULL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", ZSTR_VAL(precedences[i]->trait_method.method_name), ZSTR_VAL(exclude_ce->name));
+ }
- zend_string_release(class_name);
- j++;
+ /* make sure that the trait method is not from a class mentioned in
+ exclude_from_classes, for consistency */
+ if (trait == exclude_ce) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Inconsistent insteadof definition. "
+ "The method %s is to be used from %s, but %s is also on the exclude list",
+ ZSTR_VAL(cur_method_ref->method_name),
+ ZSTR_VAL(trait->name),
+ ZSTR_VAL(trait->name));
}
}
+ zend_string_release_ex(lcname, 0);
i++;
}
ce->trait_precedences = precedences;
@@ -1402,87 +1469,63 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce) /* {{{ */
if (ce->trait_aliases) {
i = 0;
while (ce->trait_aliases[i]) {
+ i++;
+ }
+ aliases = ecalloc(i, sizeof(zend_class_entry*));
+ i = 0;
+ while (ce->trait_aliases[i]) {
/** For all aliases with an explicit class name, resolve the class now. */
- if (ce->trait_aliases[i]->trait_method->class_name) {
- cur_method_ref = ce->trait_aliases[i]->trait_method;
- if (!(cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD))) {
+ if (ce->trait_aliases[i]->trait_method.class_name) {
+ cur_method_ref = &ce->trait_aliases[i]->trait_method;
+ trait = zend_fetch_class(cur_method_ref->class_name, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (!trait) {
zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name));
}
- zend_check_trait_usage(ce, cur_method_ref->ce);
+ zend_check_trait_usage(ce, trait);
+ aliases[i] = trait;
/** And, ensure that the referenced method is resolvable, too. */
lcname = zend_string_tolower(cur_method_ref->method_name);
- method_exists = zend_hash_exists(&cur_method_ref->ce->function_table,
- lcname);
- zend_string_release(lcname);
+ method_exists = zend_hash_exists(&trait->function_table, lcname);
+ zend_string_release_ex(lcname, 0);
if (!method_exists) {
- zend_error_noreturn(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", ZSTR_VAL(cur_method_ref->ce->name), ZSTR_VAL(cur_method_ref->method_name));
+ zend_error_noreturn(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", ZSTR_VAL(trait->name), ZSTR_VAL(cur_method_ref->method_name));
}
}
i++;
}
}
-}
-/* }}} */
-
-static void zend_traits_compile_exclude_table(HashTable* exclude_table, zend_trait_precedence **precedences, zend_class_entry *trait) /* {{{ */
-{
- size_t i = 0, j;
- if (!precedences) {
- return;
- }
- while (precedences[i]) {
- if (precedences[i]->exclude_from_classes) {
- j = 0;
- while (precedences[i]->exclude_from_classes[j].ce) {
- if (precedences[i]->exclude_from_classes[j].ce == trait) {
- zend_string *lcname =
- zend_string_tolower(precedences[i]->trait_method->method_name);
- if (zend_hash_add_empty_element(exclude_table, lcname) == NULL) {
- zend_string_release(lcname);
- zend_error_noreturn(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", ZSTR_VAL(precedences[i]->trait_method->method_name), ZSTR_VAL(trait->name));
- }
- zend_string_release(lcname);
- }
- ++j;
- }
- }
- ++i;
- }
+ *exclude_tables_ptr = exclude_tables;
+ *aliases_ptr = aliases;
}
/* }}} */
-static void zend_do_traits_method_binding(zend_class_entry *ce) /* {{{ */
+static void zend_do_traits_method_binding(zend_class_entry *ce, HashTable **exclude_tables, zend_class_entry **aliases) /* {{{ */
{
uint32_t i;
HashTable *overriden = NULL;
zend_string *key;
zend_function *fn;
- for (i = 0; i < ce->num_traits; i++) {
- if (ce->trait_precedences) {
- HashTable exclude_table;
- zend_trait_precedence **precedences;
-
- /* TODO: revisit this start size, may be its not optimal */
- zend_hash_init_ex(&exclude_table, 8, NULL, NULL, 0, 0);
-
- precedences = ce->trait_precedences;
- ce->trait_precedences = NULL;
- zend_traits_compile_exclude_table(&exclude_table, precedences, ce->traits[i]);
-
+ if (exclude_tables) {
+ for (i = 0; i < ce->num_traits; i++) {
/* copies functions, applies defined aliasing, and excludes unused trait methods */
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->traits[i]->function_table, key, fn) {
- zend_traits_copy_functions(key, fn, ce, &overriden, &exclude_table);
+ zend_traits_copy_functions(key, fn, ce, &overriden, exclude_tables[i], aliases);
} ZEND_HASH_FOREACH_END();
- zend_hash_destroy(&exclude_table);
- ce->trait_precedences = precedences;
- } else {
+ if (exclude_tables[i]) {
+ zend_hash_destroy(exclude_tables[i]);
+ FREE_HASHTABLE(exclude_tables[i]);
+ exclude_tables[i] = NULL;
+ }
+ }
+ } else {
+ for (i = 0; i < ce->num_traits; i++) {
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->traits[i]->function_table, key, fn) {
- zend_traits_copy_functions(key, fn, ce, &overriden, NULL);
+ zend_traits_copy_functions(key, fn, ce, &overriden, NULL, aliases);
} ZEND_HASH_FOREACH_END();
}
}
@@ -1491,17 +1534,6 @@ static void zend_do_traits_method_binding(zend_class_entry *ce) /* {{{ */
zend_fixup_trait_method(fn, ce);
} ZEND_HASH_FOREACH_END();
- if (ce->trait_precedences) {
- i = 0;
- while (ce->trait_precedences[i]) {
- if (ce->trait_precedences[i]->exclude_from_classes) {
- efree(ce->trait_precedences[i]->exclude_from_classes);
- ce->trait_precedences[i]->exclude_from_classes = NULL;
- }
- i++;
- }
- }
-
if (overriden) {
zend_hash_destroy(overriden);
FREE_HASHTABLE(overriden);
@@ -1563,30 +1595,51 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
/* next: check for conflicts with current class */
if ((coliding_prop = zend_hash_find_ptr(&ce->properties_info, prop_name)) != NULL) {
if (coliding_prop->flags & ZEND_ACC_SHADOW) {
- zend_string_release(coliding_prop->name);
+ zend_string_release_ex(coliding_prop->name, 0);
if (coliding_prop->doc_comment) {
- zend_string_release(coliding_prop->doc_comment);
+ zend_string_release_ex(coliding_prop->doc_comment, 0);
}
zend_hash_del(&ce->properties_info, prop_name);
flags |= ZEND_ACC_CHANGED;
} else {
+ not_compatible = 1;
+
if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))
== (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) {
- /* flags are identical, now the value needs to be checked */
+ /* the flags are identical, thus, the properties may be compatible */
zval *op1, *op2;
+ zval op1_tmp, op2_tmp;
+
if (flags & ZEND_ACC_STATIC) {
op1 = &ce->default_static_members_table[coliding_prop->offset];
op2 = &ce->traits[i]->default_static_members_table[property_info->offset];
- ZVAL_DEREF(op1);
- ZVAL_DEREF(op2);
+ ZVAL_DEINDIRECT(op1);
+ ZVAL_DEINDIRECT(op2);
} else {
op1 = &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)];
op2 = &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
}
+
+ /* if any of the values is a constant, we try to resolve it */
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_CONSTANT_AST)) {
+ ZVAL_COPY_OR_DUP(&op1_tmp, op1);
+ zval_update_constant_ex(&op1_tmp, ce);
+ op1 = &op1_tmp;
+ }
+ if (UNEXPECTED(Z_TYPE_P(op2) == IS_CONSTANT_AST)) {
+ ZVAL_COPY_OR_DUP(&op2_tmp, op2);
+ zval_update_constant_ex(&op2_tmp, ce);
+ op2 = &op2_tmp;
+ }
+
not_compatible = fast_is_not_identical_function(op1, op2);
- } else {
- /* the flags are not identical, thus, we assume properties are not compatible */
- not_compatible = 1;
+
+ if (op1 == &op1_tmp) {
+ zval_ptr_dtor_nogc(&op1_tmp);
+ }
+ if (op2 == &op2_tmp) {
+ zval_ptr_dtor_nogc(&op2_tmp);
+ }
}
if (not_compatible) {
@@ -1598,7 +1651,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
ZSTR_VAL(ce->name));
}
- zend_string_release(prop_name);
+ zend_string_release_ex(prop_name, 0);
continue;
}
}
@@ -1606,22 +1659,23 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
/* property not found, so lets add it */
if (flags & ZEND_ACC_STATIC) {
prop_value = &ce->traits[i]->default_static_members_table[property_info->offset];
+ ZEND_ASSERT(Z_TYPE_P(prop_value) != IS_INDIRECT);
} else {
prop_value = &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
}
- if (Z_REFCOUNTED_P(prop_value)) Z_ADDREF_P(prop_value);
+ 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_string_release(prop_name);
+ zend_string_release_ex(prop_name, 0);
} ZEND_HASH_FOREACH_END();
}
}
/* }}} */
-static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce) /* {{{ */
+static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce, zend_class_entry **aliases) /* {{{ */
{
int i = 0;
zend_trait_alias* cur_alias;
@@ -1632,13 +1686,13 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce)
cur_alias = ce->trait_aliases[i];
/** The trait for this alias has not been resolved, this means, this
alias was not applied. Abort with an error. */
- if (!cur_alias->trait_method->ce) {
+ if (!aliases[i]) {
if (cur_alias->alias) {
/** Plain old inconsistency/typo/bug */
zend_error_noreturn(E_COMPILE_ERROR,
"An alias (%s) was defined for method %s(), but this method does not exist",
ZSTR_VAL(cur_alias->alias),
- ZSTR_VAL(cur_alias->trait_method->method_name));
+ ZSTR_VAL(cur_alias->trait_method.method_name));
} else {
/** Here are two possible cases:
1) this is an attempt to modifiy the visibility
@@ -1649,18 +1703,18 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce)
as in the case where alias is set. */
lc_method_name = zend_string_tolower(
- cur_alias->trait_method->method_name);
+ cur_alias->trait_method.method_name);
if (zend_hash_exists(&ce->function_table,
lc_method_name)) {
- zend_string_release(lc_method_name);
+ zend_string_release_ex(lc_method_name, 0);
zend_error_noreturn(E_COMPILE_ERROR,
"The modifiers for the trait alias %s() need to be changed in the same statement in which the alias is defined. Error",
- ZSTR_VAL(cur_alias->trait_method->method_name));
+ ZSTR_VAL(cur_alias->trait_method.method_name));
} else {
- zend_string_release(lc_method_name);
+ zend_string_release_ex(lc_method_name, 0);
zend_error_noreturn(E_COMPILE_ERROR,
"The modifiers of the trait method %s() are changed, but this method does not exist. Error",
- ZSTR_VAL(cur_alias->trait_method->method_name));
+ ZSTR_VAL(cur_alias->trait_method.method_name));
}
}
@@ -1673,19 +1727,29 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce)
ZEND_API void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
{
+ HashTable **exclude_tables;
+ zend_class_entry **aliases;
- if (ce->num_traits <= 0) {
+ if (ce->num_traits == 0) {
return;
}
/* complete initialization of trait strutures in ce */
- zend_traits_init_trait_structures(ce);
+ zend_traits_init_trait_structures(ce, &exclude_tables, &aliases);
/* first care about all methods to be flattened into the class */
- zend_do_traits_method_binding(ce);
+ zend_do_traits_method_binding(ce, exclude_tables, aliases);
/* Aliases which have not been applied indicate typos/bugs. */
- zend_do_check_for_inconsistent_traits_aliasing(ce);
+ zend_do_check_for_inconsistent_traits_aliasing(ce, aliases);
+
+ if (aliases) {
+ efree(aliases);
+ }
+
+ if (exclude_tables) {
+ efree(exclude_tables);
+ }
/* then flatten the properties into it, to, mostly to notfiy developer about problems */
zend_do_traits_property_binding(ce);
diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h
index cf25516efc..ef2b0676df 100644
--- a/Zend/zend_inheritance.h
+++ b/Zend/zend_inheritance.h
@@ -12,8 +12,8 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
index 5e932840bc..b8185950ae 100644
--- a/Zend/zend_ini.c
+++ b/Zend/zend_ini.c
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Author: Zeev Suraski <zeev@zend.com> |
+ | Author: Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_sort.h"
#include "zend_API.h"
@@ -88,12 +86,12 @@ static void free_ini_entry(zval *zv) /* {{{ */
{
zend_ini_entry *entry = (zend_ini_entry*)Z_PTR_P(zv);
- zend_string_release(entry->name);
+ zend_string_release_ex(entry->name, 1);
if (entry->value) {
zend_string_release(entry->value);
}
if (entry->orig_value) {
- zend_string_release(entry->orig_value);
+ zend_string_release_ex(entry->orig_value, 1);
}
free(entry);
}
@@ -157,13 +155,13 @@ static void copy_ini_entry(zval *zv) /* {{{ */
Z_PTR_P(zv) = new_entry;
memcpy(new_entry, old_entry, sizeof(zend_ini_entry));
if (old_entry->name) {
- new_entry->name = zend_string_init(ZSTR_VAL(old_entry->name), ZSTR_LEN(old_entry->name), 1);
+ new_entry->name = zend_string_dup(old_entry->name, 1);
}
if (old_entry->value) {
- new_entry->value = zend_string_init(ZSTR_VAL(old_entry->value), ZSTR_LEN(old_entry->value), 1);
+ new_entry->value = zend_string_dup(old_entry->value, 1);
}
if (old_entry->orig_value) {
- new_entry->orig_value = zend_string_init(ZSTR_VAL(old_entry->orig_value), ZSTR_LEN(old_entry->orig_value), 1);
+ new_entry->orig_value = zend_string_dup(old_entry->orig_value, 1);
}
}
/* }}} */
@@ -189,7 +187,12 @@ static int ini_key_compare(const void *a, const void *b) /* {{{ */
s = (const Bucket *) b;
if (!f->key && !s->key) { /* both numeric */
- return ZEND_NORMALIZE_BOOL(f->h - s->h);
+ if (f->h > s->h) {
+ return -1;
+ } else if (f->h < s->h) {
+ return 1;
+ }
+ return 0;
} else if (!f->key) { /* f is numeric, s is not */
return -1;
} else if (!s->key) { /* s is numeric, f is not */
@@ -231,7 +234,7 @@ ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int
while (ini_entry->name) {
p = pemalloc(sizeof(zend_ini_entry), 1);
- p->name = zend_string_init(ini_entry->name, ini_entry->name_length, 1);
+ p->name = zend_string_init_interned(ini_entry->name, ini_entry->name_length, 1);
p->on_modify = ini_entry->on_modify;
p->mh_arg1 = ini_entry->mh_arg1;
p->mh_arg2 = ini_entry->mh_arg2;
@@ -247,7 +250,7 @@ ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int
if (zend_hash_add_ptr(directives, p->name, (void*)p) == NULL) {
if (p->name) {
- zend_string_release(p->name);
+ zend_string_release_ex(p->name, 1);
}
zend_unregister_ini_entries(module_number);
return FAILURE;
@@ -255,10 +258,10 @@ ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int
if (((default_value = zend_get_configuration_directive(p->name)) != NULL) &&
(!p->on_modify || p->on_modify(p, Z_STR_P(default_value), p->mh_arg1, p->mh_arg2, p->mh_arg3, ZEND_INI_STAGE_STARTUP) == SUCCESS)) {
- p->value = zend_string_copy(Z_STR_P(default_value));
+ p->value = zend_new_interned_string(zend_string_copy(Z_STR_P(default_value)));
} else {
p->value = ini_entry->value ?
- zend_string_init(ini_entry->value, ini_entry->value_length, 1) : NULL;
+ zend_string_init_interned(ini_entry->value, ini_entry->value_length, 1) : NULL;
if (p->on_modify) {
p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, ZEND_INI_STAGE_STARTUP);
@@ -308,7 +311,7 @@ ZEND_API int zend_alter_ini_entry_chars(zend_string *name, const char *value, si
int ret;
zend_string *new_value;
- new_value = zend_string_init(value, value_length, stage != ZEND_INI_STAGE_RUNTIME);
+ new_value = zend_string_init(value, value_length, !(stage & ZEND_INI_STAGE_IN_REQUEST));
ret = zend_alter_ini_entry_ex(name, new_value, modify_type, stage, 0);
zend_string_release(new_value);
return ret;
@@ -320,7 +323,7 @@ ZEND_API int zend_alter_ini_entry_chars_ex(zend_string *name, const char *value,
int ret;
zend_string *new_value;
- new_value = zend_string_init(value, value_length, stage != ZEND_INI_STAGE_RUNTIME);
+ new_value = zend_string_init(value, value_length, !(stage & ZEND_INI_STAGE_IN_REQUEST));
ret = zend_alter_ini_entry_ex(name, new_value, modify_type, stage, force_change);
zend_string_release(new_value);
return ret;
@@ -418,7 +421,7 @@ ZEND_API int zend_ini_register_displayer(char *name, uint32_t name_length, void
* Data retrieval
*/
-ZEND_API zend_long zend_ini_long(char *name, uint32_t name_length, int orig) /* {{{ */
+ZEND_API zend_long zend_ini_long(char *name, size_t name_length, int orig) /* {{{ */
{
zend_ini_entry *ini_entry;
@@ -435,7 +438,7 @@ ZEND_API zend_long zend_ini_long(char *name, uint32_t name_length, int orig) /*
}
/* }}} */
-ZEND_API double zend_ini_double(char *name, uint32_t name_length, int orig) /* {{{ */
+ZEND_API double zend_ini_double(char *name, size_t name_length, int orig) /* {{{ */
{
zend_ini_entry *ini_entry;
@@ -452,7 +455,7 @@ ZEND_API double zend_ini_double(char *name, uint32_t name_length, int orig) /* {
}
/* }}} */
-ZEND_API char *zend_ini_string_ex(char *name, uint32_t name_length, int orig, zend_bool *exists) /* {{{ */
+ZEND_API char *zend_ini_string_ex(char *name, size_t name_length, int orig, zend_bool *exists) /* {{{ */
{
zend_ini_entry *ini_entry;
@@ -476,7 +479,7 @@ ZEND_API char *zend_ini_string_ex(char *name, uint32_t name_length, int orig, ze
}
/* }}} */
-ZEND_API char *zend_ini_string(char *name, uint32_t name_length, int orig) /* {{{ */
+ZEND_API char *zend_ini_string(char *name, size_t name_length, int orig) /* {{{ */
{
zend_bool exists = 1;
char *return_value;
@@ -491,6 +494,30 @@ ZEND_API char *zend_ini_string(char *name, uint32_t name_length, int orig) /* {{
}
/* }}} */
+ZEND_API zend_string *zend_ini_get_value(zend_string *name) /* {{{ */
+{
+ zend_ini_entry *ini_entry;
+
+ ini_entry = zend_hash_find_ptr(EG(ini_directives), name);
+ if (ini_entry) {
+ return ini_entry->value ? ini_entry->value : ZSTR_EMPTY_ALLOC();
+ } else {
+ return NULL;
+ }
+}
+/* }}} */
+
+ZEND_API zend_bool zend_ini_parse_bool(zend_string *str)
+{
+ if ((ZSTR_LEN(str) == 4 && strcasecmp(ZSTR_VAL(str), "true") == 0)
+ || (ZSTR_LEN(str) == 3 && strcasecmp(ZSTR_VAL(str), "yes") == 0)
+ || (ZSTR_LEN(str) == 2 && strcasecmp(ZSTR_VAL(str), "on") == 0)) {
+ return 1;
+ } else {
+ return atoi(ZSTR_VAL(str)) != 0;
+ }
+}
+
#if TONY_20070307
static void zend_ini_displayer_cb(zend_ini_entry *ini_entry, int type) /* {{{ */
{
@@ -545,15 +572,7 @@ ZEND_INI_DISP(zend_ini_boolean_displayer_cb) /* {{{ */
}
if (tmp_value) {
- if (ZSTR_LEN(tmp_value) == 4 && strcasecmp(ZSTR_VAL(tmp_value), "true") == 0) {
- value = 1;
- } else if (ZSTR_LEN(tmp_value) == 3 && strcasecmp(ZSTR_VAL(tmp_value), "yes") == 0) {
- value = 1;
- } else if (ZSTR_LEN(tmp_value) == 2 && strcasecmp(ZSTR_VAL(tmp_value), "on") == 0) {
- value = 1;
- } else {
- value = atoi(ZSTR_VAL(tmp_value));
- }
+ value = zend_ini_parse_bool(tmp_value);
} else {
value = 0;
}
@@ -629,18 +648,7 @@ ZEND_API ZEND_INI_MH(OnUpdateBool) /* {{{ */
p = (zend_bool *) (base+(size_t) mh_arg1);
- if (ZSTR_LEN(new_value) == 2 && strcasecmp("on", ZSTR_VAL(new_value)) == 0) {
- *p = (zend_bool) 1;
- }
- else if (ZSTR_LEN(new_value) == 3 && strcasecmp("yes", ZSTR_VAL(new_value)) == 0) {
- *p = (zend_bool) 1;
- }
- else if (ZSTR_LEN(new_value) == 4 && strcasecmp("true", ZSTR_VAL(new_value)) == 0) {
- *p = (zend_bool) 1;
- }
- else {
- *p = (zend_bool) atoi(ZSTR_VAL(new_value));
- }
+ *p = zend_ini_parse_bool(new_value);
return SUCCESS;
}
/* }}} */
@@ -658,7 +666,7 @@ ZEND_API ZEND_INI_MH(OnUpdateLong) /* {{{ */
p = (zend_long *) (base+(size_t) mh_arg1);
- *p = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value));
+ *p = zend_atol(ZSTR_VAL(new_value), ZSTR_LEN(new_value));
return SUCCESS;
}
/* }}} */
@@ -674,7 +682,7 @@ ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) /* {{{ */
base = (char *) ts_resource(*((int *) mh_arg2));
#endif
- tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value));
+ tmp = zend_atol(ZSTR_VAL(new_value), ZSTR_LEN(new_value));
if (tmp < 0) {
return FAILURE;
}
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index 886997a97b..5299dcd532 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Author: Zeev Suraski <zeev@zend.com> |
+ | Author: Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_INI_H
#define ZEND_INI_H
@@ -38,10 +36,10 @@ typedef struct _zend_ini_entry_def {
void *mh_arg3;
const char *value;
void (*displayer)(zend_ini_entry *ini_entry, int type);
- int modifiable;
- uint32_t name_length;
uint32_t value_length;
+ uint16_t name_length;
+ uint8_t modifiable;
} zend_ini_entry_def;
struct _zend_ini_entry {
@@ -53,11 +51,13 @@ struct _zend_ini_entry {
zend_string *value;
zend_string *orig_value;
void (*displayer)(zend_ini_entry *ini_entry, int type);
- int modifiable;
- int orig_modifiable;
- int modified;
int module_number;
+
+ uint8_t modifiable;
+ uint8_t orig_modifiable;
+ uint8_t modified;
+
};
BEGIN_EXTERN_C()
@@ -81,10 +81,12 @@ ZEND_API int zend_alter_ini_entry_chars_ex(zend_string *name, const char *value,
ZEND_API int zend_restore_ini_entry(zend_string *name, int stage);
ZEND_API void display_ini_entries(zend_module_entry *module);
-ZEND_API zend_long zend_ini_long(char *name, uint32_t name_length, int orig);
-ZEND_API double zend_ini_double(char *name, uint32_t name_length, int orig);
-ZEND_API char *zend_ini_string(char *name, uint32_t name_length, int orig);
-ZEND_API char *zend_ini_string_ex(char *name, uint32_t name_length, int orig, zend_bool *exists);
+ZEND_API zend_long zend_ini_long(char *name, size_t name_length, int orig);
+ZEND_API double zend_ini_double(char *name, size_t name_length, int orig);
+ZEND_API char *zend_ini_string(char *name, size_t name_length, int orig);
+ZEND_API char *zend_ini_string_ex(char *name, size_t name_length, int orig, zend_bool *exists);
+ZEND_API zend_string *zend_ini_get_value(zend_string *name);
+ZEND_API zend_bool zend_ini_parse_bool(zend_string *str);
ZEND_API int zend_ini_register_displayer(char *name, uint32_t name_length, void (*displayer)(zend_ini_entry *ini_entry, int type));
@@ -97,7 +99,7 @@ END_EXTERN_C()
#define ZEND_INI_END() { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0} };
#define ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer) \
- { name, on_modify, arg1, arg2, arg3, default_value, displayer, modifiable, sizeof(name)-1, sizeof(default_value)-1 },
+ { name, on_modify, arg1, arg2, arg3, default_value, displayer, sizeof(default_value)-1, sizeof(name)-1, modifiable },
#define ZEND_INI_ENTRY3(name, default_value, modifiable, on_modify, arg1, arg2, arg3) \
ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, NULL)
@@ -173,6 +175,8 @@ END_EXTERN_C()
#define ZEND_INI_STAGE_RUNTIME (1<<4)
#define ZEND_INI_STAGE_HTACCESS (1<<5)
+#define ZEND_INI_STAGE_IN_REQUEST (ZEND_INI_STAGE_ACTIVATE|ZEND_INI_STAGE_DEACTIVATE|ZEND_INI_STAGE_RUNTIME|ZEND_INI_STAGE_HTACCESS)
+
/* INI parsing engine */
typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, zval *arg3, int callback_type, void *arg);
BEGIN_EXTERN_C()
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index a0ceb2c74e..a83976a2d6 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -13,13 +13,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Zeev Suraski <zeev@zend.com> |
+ | Authors: Zeev Suraski <zeev@php.net> |
| Jani Taskinen <jani@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#define DEBUG_CFG_PARSER 0
#include "zend.h"
@@ -121,13 +119,14 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
int length, op1_len;
if (Z_TYPE_P(op1) != IS_STRING) {
- zend_string *str = zval_get_string(op1);
/* ZEND_ASSERT(!Z_REFCOUNTED_P(op1)); */
if (ZEND_SYSTEM_INI) {
+ zend_string *tmp_str;
+ zend_string *str = zval_get_tmp_string(op1, &tmp_str);
ZVAL_PSTRINGL(op1, ZSTR_VAL(str), ZSTR_LEN(str));
- zend_string_release(str);
+ zend_tmp_string_release(tmp_str);
} else {
- ZVAL_STR(op1, str);
+ ZVAL_STR(op1, zval_get_string_func(op1));
}
}
op1_len = (int)Z_STRLEN_P(op1);
@@ -152,7 +151,7 @@ static void zend_ini_get_constant(zval *result, zval *name)
if (!memchr(Z_STRVAL_P(name), ':', Z_STRLEN_P(name))
&& (c = zend_get_constant(Z_STR_P(name))) != 0) {
if (Z_TYPE_P(c) != IS_STRING) {
- ZVAL_DUP(&tmp, c);
+ ZVAL_COPY_OR_DUP(&tmp, c);
if (Z_OPT_CONSTANT(tmp)) {
zval_update_constant_ex(&tmp, NULL);
}
@@ -277,6 +276,16 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
}
/* }}} */
+/* {{{ zval_ini_dtor()
+*/
+static void zval_ini_dtor(zval *zv)
+{
+ if (Z_TYPE_P(zv) == IS_STRING) {
+ zend_string_release(Z_STR_P(zv));
+ }
+}
+/* }}} */
+
%}
%expect 0
@@ -301,7 +310,7 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
%left '|' '&' '^'
%right '~' '!'
-%destructor { zval_ptr_dtor(&$$); } TC_RAW TC_CONSTANT TC_NUMBER TC_STRING TC_WHITESPACE TC_LABEL TC_OFFSET TC_VARNAME BOOL_TRUE BOOL_FALSE NULL_NULL
+%destructor { zval_ini_dtor(&$$); } TC_RAW TC_CONSTANT TC_NUMBER TC_STRING TC_WHITESPACE TC_LABEL TC_OFFSET TC_VARNAME BOOL_TRUE BOOL_FALSE NULL_NULL
%%
@@ -324,7 +333,7 @@ statement:
#endif
ZEND_INI_PARSER_CB(&$1, &$3, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG);
zend_string_release(Z_STR($1));
- zval_ptr_dtor(&$3);
+ zval_ini_dtor(&$3);
}
| TC_OFFSET option_offset ']' '=' string_or_value {
#if DEBUG_CFG_PARSER
@@ -332,12 +341,8 @@ statement:
#endif
ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG);
zend_string_release(Z_STR($1));
- if (Z_TYPE($2) == IS_STRING) {
- zend_string_release(Z_STR($2));
- } else {
- zval_dtor(&$2);
- }
- zval_ptr_dtor(&$5);
+ zval_ini_dtor(&$2);
+ zval_ini_dtor(&$5);
}
| TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); zend_string_release(Z_STR($1)); }
| END_OF_LINE
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c
index 3d2f4b0b28..e57a28570b 100644
--- a/Zend/zend_ini_scanner.c
+++ b/Zend/zend_ini_scanner.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 */
+/* Generated by re2c 1.0.3 */
#line 1 "Zend/zend_ini_scanner.l"
/*
+----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Zeev Suraski <zeev@zend.com> |
+ | Authors: Zeev Suraski <zeev@php.net> |
| Jani Taskinen <jani@php.net> |
| Marcus Boerger <helly@php.net> |
| Nuno Lopes <nlopess@php.net> |
@@ -22,8 +22,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <errno.h>
#include "zend.h"
#include "zend_API.h"
@@ -69,6 +67,7 @@
/* perform sanity check. If this message is triggered you should
increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */
#define YYMAXFILL 6
+
#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1)
# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL
#endif
@@ -384,7 +383,7 @@ restart:
}
}
-#line 388 "Zend/zend_ini_scanner.c"
+#line 387 "Zend/zend_ini_scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
@@ -506,7 +505,7 @@ yy4:
yy5:
YYDEBUG(5, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 484 "Zend/zend_ini_scanner.l"
+#line 482 "Zend/zend_ini_scanner.l"
{ /* Get option name */
/* Eat leading whitespace */
EAT_LEADING_WHITESPACE();
@@ -516,7 +515,7 @@ yy5:
RETURN_TOKEN(TC_LABEL, yytext, yyleng);
}
-#line 520 "Zend/zend_ini_scanner.c"
+#line 519 "Zend/zend_ini_scanner.c"
yy6:
YYDEBUG(6, *YYCURSOR);
++YYCURSOR;
@@ -532,7 +531,7 @@ yy6:
if (yych >= '\r') goto yy11;
} else {
if (yych <= ';') {
- if (yych >= ';') goto yy31;
+ if (yych >= ';') goto yy16;
} else {
if (yych == '=') goto yy18;
}
@@ -540,24 +539,24 @@ yy6:
yy8:
YYDEBUG(8, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 637 "Zend/zend_ini_scanner.l"
+#line 635 "Zend/zend_ini_scanner.l"
{
/* eat whitespace */
goto restart;
}
-#line 549 "Zend/zend_ini_scanner.c"
+#line 548 "Zend/zend_ini_scanner.c"
yy9:
YYDEBUG(9, *YYCURSOR);
++YYCURSOR;
yy10:
YYDEBUG(10, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 642 "Zend/zend_ini_scanner.l"
+#line 640 "Zend/zend_ini_scanner.l"
{
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 561 "Zend/zend_ini_scanner.c"
+#line 560 "Zend/zend_ini_scanner.c"
yy11:
YYDEBUG(11, *YYCURSOR);
yych = *++YYCURSOR;
@@ -596,7 +595,7 @@ yy12:
if (yych <= ';') {
if (yych <= ')') goto yy5;
if (yych <= ':') goto yy3;
- goto yy31;
+ goto yy16;
} else {
if (yych == '=') goto yy18;
goto yy3;
@@ -618,23 +617,22 @@ yy14:
++YYCURSOR;
YYDEBUG(15, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 565 "Zend/zend_ini_scanner.l"
+#line 563 "Zend/zend_ini_scanner.l"
{ /* Disallow these chars outside option values */
return yytext[0];
}
-#line 626 "Zend/zend_ini_scanner.c"
+#line 625 "Zend/zend_ini_scanner.c"
yy16:
YYDEBUG(16, *YYCURSOR);
++YYCURSOR;
+ YYFILL(2);
yych = *YYCURSOR;
- goto yy32;
YYDEBUG(17, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 658 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 638 "Zend/zend_ini_scanner.c"
+ if (yybm[0+yych] & 128) {
+ goto yy16;
+ }
+ if (yych <= '\n') goto yy31;
+ goto yy33;
yy18:
YYDEBUG(18, *YYCURSOR);
++YYCURSOR;
@@ -645,7 +643,7 @@ yy18:
if (yych == ' ') goto yy18;
YYDEBUG(20, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 494 "Zend/zend_ini_scanner.l"
+#line 492 "Zend/zend_ini_scanner.l"
{ /* Start option value */
if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
BEGIN(ST_RAW);
@@ -654,26 +652,26 @@ yy18:
}
return '=';
}
-#line 658 "Zend/zend_ini_scanner.c"
+#line 656 "Zend/zend_ini_scanner.c"
yy21:
YYDEBUG(21, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'A') goto yy36;
- if (yych == 'a') goto yy36;
+ if (yych == 'A') goto yy34;
+ if (yych == 'a') goto yy34;
goto yy4;
yy22:
YYDEBUG(22, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'U') {
- if (yych == 'O') goto yy37;
+ if (yych == 'O') goto yy35;
if (yych <= 'T') goto yy4;
- goto yy39;
+ goto yy37;
} else {
if (yych <= 'o') {
if (yych <= 'n') goto yy4;
- goto yy37;
+ goto yy35;
} else {
- if (yych == 'u') goto yy39;
+ if (yych == 'u') goto yy37;
goto yy4;
}
}
@@ -681,36 +679,36 @@ yy23:
YYDEBUG(23, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= 'N') {
- if (yych == 'F') goto yy40;
+ if (yych == 'F') goto yy38;
if (yych <= 'M') goto yy4;
- goto yy41;
+ goto yy39;
} else {
if (yych <= 'f') {
if (yych <= 'e') goto yy4;
- goto yy40;
+ goto yy38;
} else {
- if (yych == 'n') goto yy41;
+ if (yych == 'n') goto yy39;
goto yy4;
}
}
yy24:
YYDEBUG(24, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'R') goto yy44;
- if (yych == 'r') goto yy44;
+ if (yych == 'R') goto yy42;
+ if (yych == 'r') goto yy42;
goto yy4;
yy25:
YYDEBUG(25, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy45;
- if (yych == 'e') goto yy45;
+ if (yych == 'E') goto yy43;
+ if (yych == 'e') goto yy43;
goto yy4;
yy26:
YYDEBUG(26, *YYCURSOR);
++YYCURSOR;
YYDEBUG(27, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 409 "Zend/zend_ini_scanner.l"
+#line 407 "Zend/zend_ini_scanner.l"
{ /* Section start */
/* Enter section data lookup state */
if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
@@ -720,7 +718,7 @@ yy26:
}
return TC_SECTION;
}
-#line 724 "Zend/zend_ini_scanner.c"
+#line 722 "Zend/zend_ini_scanner.c"
yy28:
YYDEBUG(28, *YYCURSOR);
++YYCURSOR;
@@ -731,7 +729,7 @@ yy28:
if (yych == ' ') goto yy28;
YYDEBUG(30, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 434 "Zend/zend_ini_scanner.l"
+#line 432 "Zend/zend_ini_scanner.l"
{ /* Start of option with offset */
/* Eat leading whitespace */
EAT_LEADING_WHITESPACE();
@@ -744,56 +742,45 @@ yy28:
RETURN_TOKEN(TC_OFFSET, yytext, yyleng);
}
-#line 748 "Zend/zend_ini_scanner.c"
+#line 746 "Zend/zend_ini_scanner.c"
yy31:
YYDEBUG(31, *YYCURSOR);
++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
yy32:
YYDEBUG(32, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy31;
- }
- if (yych >= '\v') goto yy35;
-yy33:
- YYDEBUG(33, *YYCURSOR);
- ++YYCURSOR;
-yy34:
- YYDEBUG(34, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 647 "Zend/zend_ini_scanner.l"
+#line 645 "Zend/zend_ini_scanner.l"
{ /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 772 "Zend/zend_ini_scanner.c"
-yy35:
- YYDEBUG(35, *YYCURSOR);
+#line 759 "Zend/zend_ini_scanner.c"
+yy33:
+ YYDEBUG(33, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == '\n') goto yy33;
- goto yy34;
-yy36:
- YYDEBUG(36, *YYCURSOR);
+ if (yych == '\n') goto yy31;
+ goto yy32;
+yy34:
+ YYDEBUG(34, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy46;
- if (yych == 'l') goto yy46;
+ if (yych == 'L') goto yy44;
+ if (yych == 'l') goto yy44;
goto yy4;
-yy37:
- YYDEBUG(37, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) <= '\'') {
+yy35:
+ YYDEBUG(35, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych <= '\'') {
if (yych <= 0x1F) {
if (yych <= '\n') {
if (yych <= 0x08) goto yy4;
- if (yych <= '\t') goto yy47;
+ if (yych <= '\t') goto yy45;
} else {
if (yych != '\r') goto yy4;
}
} else {
if (yych <= '#') {
- if (yych <= ' ') goto yy49;
+ if (yych <= ' ') goto yy47;
if (yych >= '#') goto yy4;
} else {
if (yych == '%') goto yy4;
@@ -803,60 +790,60 @@ yy37:
} else {
if (yych <= 'N') {
if (yych <= ';') {
- if (yych <= ')') goto yy38;
+ if (yych <= ')') goto yy36;
if (yych <= ':') goto yy4;
} else {
- if (yych == '=') goto yy38;
+ if (yych == '=') goto yy36;
if (yych <= 'M') goto yy4;
- goto yy51;
+ goto yy49;
}
} else {
if (yych <= 'm') {
if (yych != '^') goto yy4;
} else {
- if (yych <= 'n') goto yy51;
+ if (yych <= 'n') goto yy49;
if (yych <= 'z') goto yy4;
if (yych >= 0x7F) goto yy4;
}
}
}
-yy38:
- YYDEBUG(38, *YYCURSOR);
+yy36:
+ YYDEBUG(36, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 476 "Zend/zend_ini_scanner.l"
+#line 474 "Zend/zend_ini_scanner.l"
{ /* FALSE value (when used outside option value/offset this causes parse error!)*/
RETURN_TOKEN(BOOL_FALSE, "", 0);
}
-#line 831 "Zend/zend_ini_scanner.c"
-yy39:
- YYDEBUG(39, *YYCURSOR);
+#line 818 "Zend/zend_ini_scanner.c"
+yy37:
+ YYDEBUG(37, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy52;
- if (yych == 'l') goto yy52;
+ if (yych == 'L') goto yy50;
+ if (yych == 'l') goto yy50;
goto yy4;
-yy40:
- YYDEBUG(40, *YYCURSOR);
+yy38:
+ YYDEBUG(38, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'F') goto yy49;
- if (yych == 'f') goto yy49;
+ if (yych == 'F') goto yy47;
+ if (yych == 'f') goto yy47;
goto yy4;
-yy41:
- YYDEBUG(41, *YYCURSOR);
+yy39:
+ YYDEBUG(39, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(42, *YYCURSOR);
+ YYDEBUG(40, *YYCURSOR);
if (yych <= '&') {
if (yych <= 0x1F) {
if (yych <= '\n') {
if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy53;
+ if (yych <= '\t') goto yy51;
} else {
if (yych != '\r') goto yy3;
}
} else {
if (yych <= '#') {
- if (yych <= ' ') goto yy41;
+ if (yych <= ' ') goto yy39;
if (yych >= '#') goto yy3;
} else {
if (yych == '%') goto yy3;
@@ -875,139 +862,139 @@ yy41:
if (yych == '[') goto yy28;
goto yy3;
} else {
- if (yych <= '^') goto yy43;
+ if (yych <= '^') goto yy41;
if (yych <= 'z') goto yy3;
if (yych >= 0x7F) goto yy3;
}
}
}
-yy43:
- YYDEBUG(43, *YYCURSOR);
+yy41:
+ YYDEBUG(41, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 472 "Zend/zend_ini_scanner.l"
+#line 470 "Zend/zend_ini_scanner.l"
{ /* TRUE value (when used outside option value/offset this causes parse error!) */
RETURN_TOKEN(BOOL_TRUE, "1", 1);
}
-#line 892 "Zend/zend_ini_scanner.c"
+#line 879 "Zend/zend_ini_scanner.c"
+yy42:
+ YYDEBUG(42, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == 'U') goto yy53;
+ if (yych == 'u') goto yy53;
+ goto yy4;
+yy43:
+ YYDEBUG(43, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == 'S') goto yy39;
+ if (yych == 's') goto yy39;
+ goto yy4;
yy44:
YYDEBUG(44, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'U') goto yy55;
- if (yych == 'u') goto yy55;
+ if (yych == 'S') goto yy49;
+ if (yych == 's') goto yy49;
goto yy4;
yy45:
YYDEBUG(45, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy41;
- if (yych == 's') goto yy41;
- goto yy4;
-yy46:
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
YYDEBUG(46, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy51;
- if (yych == 's') goto yy51;
- goto yy4;
+ if (yych == '\t') goto yy45;
+ if (yych == ' ') goto yy45;
+ goto yy36;
yy47:
YYDEBUG(47, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(48, *YYCURSOR);
- if (yych == '\t') goto yy47;
- if (yych == ' ') goto yy47;
- goto yy38;
-yy49:
- YYDEBUG(49, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(50, *YYCURSOR);
if (yych <= '&') {
if (yych <= 0x1F) {
if (yych <= '\n') {
if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy47;
- goto yy38;
+ if (yych <= '\t') goto yy45;
+ goto yy36;
} else {
- if (yych == '\r') goto yy38;
+ if (yych == '\r') goto yy36;
goto yy3;
}
} else {
if (yych <= '#') {
- if (yych <= ' ') goto yy49;
- if (yych <= '"') goto yy38;
+ if (yych <= ' ') goto yy47;
+ if (yych <= '"') goto yy36;
goto yy3;
} else {
if (yych == '%') goto yy3;
- goto yy38;
+ goto yy36;
}
}
} else {
if (yych <= '=') {
if (yych <= ':') {
if (yych <= '\'') goto yy3;
- if (yych <= ')') goto yy38;
+ if (yych <= ')') goto yy36;
goto yy3;
} else {
if (yych == '<') goto yy3;
- goto yy38;
+ goto yy36;
}
} else {
if (yych <= ']') {
if (yych == '[') goto yy28;
goto yy3;
} else {
- if (yych <= '^') goto yy38;
+ if (yych <= '^') goto yy36;
if (yych <= 'z') goto yy3;
- if (yych <= '~') goto yy38;
+ if (yych <= '~') goto yy36;
goto yy3;
}
}
}
-yy51:
- YYDEBUG(51, *YYCURSOR);
+yy49:
+ YYDEBUG(49, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy49;
- if (yych == 'e') goto yy49;
+ if (yych == 'E') goto yy47;
+ if (yych == 'e') goto yy47;
goto yy4;
-yy52:
- YYDEBUG(52, *YYCURSOR);
+yy50:
+ YYDEBUG(50, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'L') goto yy56;
- if (yych == 'l') goto yy56;
+ if (yych == 'L') goto yy54;
+ if (yych == 'l') goto yy54;
goto yy4;
-yy53:
- YYDEBUG(53, *YYCURSOR);
+yy51:
+ YYDEBUG(51, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(54, *YYCURSOR);
- if (yych == '\t') goto yy53;
- if (yych == ' ') goto yy53;
- goto yy43;
-yy55:
- YYDEBUG(55, *YYCURSOR);
+ YYDEBUG(52, *YYCURSOR);
+ if (yych == '\t') goto yy51;
+ if (yych == ' ') goto yy51;
+ goto yy41;
+yy53:
+ YYDEBUG(53, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == 'E') goto yy41;
- if (yych == 'e') goto yy41;
+ if (yych == 'E') goto yy39;
+ if (yych == 'e') goto yy39;
goto yy4;
-yy56:
- YYDEBUG(56, *YYCURSOR);
+yy54:
+ YYDEBUG(54, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(57, *YYCURSOR);
+ YYDEBUG(55, *YYCURSOR);
if (yych <= '&') {
if (yych <= 0x1F) {
if (yych <= '\n') {
if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy59;
+ if (yych <= '\t') goto yy57;
} else {
if (yych != '\r') goto yy3;
}
} else {
if (yych <= '#') {
- if (yych <= ' ') goto yy56;
+ if (yych <= ' ') goto yy54;
if (yych >= '#') goto yy3;
} else {
if (yych == '%') goto yy3;
@@ -1026,145 +1013,29 @@ yy56:
if (yych == '[') goto yy28;
goto yy3;
} else {
- if (yych <= '^') goto yy58;
+ if (yych <= '^') goto yy56;
if (yych <= 'z') goto yy3;
if (yych >= 0x7F) goto yy3;
}
}
}
-yy58:
- YYDEBUG(58, *YYCURSOR);
+yy56:
+ YYDEBUG(56, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 480 "Zend/zend_ini_scanner.l"
+#line 478 "Zend/zend_ini_scanner.l"
{
RETURN_TOKEN(NULL_NULL, "", 0);
}
-#line 1043 "Zend/zend_ini_scanner.c"
-yy59:
- YYDEBUG(59, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(60, *YYCURSOR);
- if (yych == '\t') goto yy59;
- if (yych == ' ') goto yy59;
- goto yy58;
- }
-/* *********************************** */
-yyc_ST_DOUBLE_QUOTES:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- };
- YYDEBUG(61, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych == '"') goto yy65;
- if (yych == '$') goto yy68;
- YYDEBUG(63, *YYCURSOR);
- ++YYCURSOR;
-yy64:
- YYDEBUG(64, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 597 "Zend/zend_ini_scanner.l"
- { /* Escape double quoted string contents */
- if (YYCURSOR > YYLIMIT) {
- return 0;
- }
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '"':
- if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') {
- continue;
- }
- break;
- case '$':
- if (*YYCURSOR == '{') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
-
- zend_ini_escape_string(ini_lval, yytext, yyleng, '"');
- return TC_QUOTED_STRING;
-}
-#line 1137 "Zend/zend_ini_scanner.c"
-yy65:
- YYDEBUG(65, *YYCURSOR);
+#line 1030 "Zend/zend_ini_scanner.c"
+yy57:
+ YYDEBUG(57, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(66, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy65;
- }
- YYDEBUG(67, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 592 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string ends */
- yy_pop_state();
- return '"';
-}
-#line 1154 "Zend/zend_ini_scanner.c"
-yy68:
- YYDEBUG(68, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych != '{') goto yy64;
- YYDEBUG(69, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(70, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 452 "Zend/zend_ini_scanner.l"
- { /* Variable start */
- yy_push_state(ST_VARNAME);
- return TC_DOLLAR_CURLY;
-}
-#line 1168 "Zend/zend_ini_scanner.c"
+ YYDEBUG(58, *YYCURSOR);
+ if (yych == '\t') goto yy57;
+ if (yych == ' ') goto yy57;
+ goto yy56;
}
/* *********************************** */
yyc_ST_OFFSET:
@@ -1203,358 +1074,349 @@ yyc_ST_OFFSET:
132, 132, 132, 132, 132, 132, 132, 132,
132, 132, 132, 132, 132, 132, 132, 132,
};
- YYDEBUG(71, *YYCURSOR);
+ YYDEBUG(59, *YYCURSOR);
YYFILL(2);
yych = *YYCURSOR;
if (yybm[0+yych] & 8) {
- goto yy76;
+ goto yy64;
}
if (yych <= '/') {
if (yych <= '"') {
if (yych <= '\f') {
- if (yych <= 0x08) goto yy73;
- if (yych <= '\n') goto yy78;
+ if (yych <= 0x08) goto yy61;
+ if (yych <= '\n') goto yy66;
} else {
- if (yych <= '\r') goto yy78;
- if (yych >= '"') goto yy80;
+ if (yych <= '\r') goto yy66;
+ if (yych >= '"') goto yy68;
}
} else {
if (yych <= '&') {
- if (yych == '$') goto yy82;
+ if (yych == '$') goto yy70;
} else {
- if (yych <= '\'') goto yy83;
- if (yych <= ',') goto yy73;
- if (yych <= '.') goto yy84;
+ if (yych <= '\'') goto yy71;
+ if (yych <= ',') goto yy61;
+ if (yych <= '.') goto yy72;
}
}
} else {
if (yych <= '[') {
if (yych <= ';') {
- if (yych <= '9') goto yy85;
- if (yych >= ';') goto yy78;
+ if (yych <= '9') goto yy73;
+ if (yych >= ';') goto yy66;
} else {
- if (yych <= '@') goto yy73;
- if (yych <= 'Z') goto yy88;
+ if (yych <= '@') goto yy61;
+ if (yych <= 'Z') goto yy76;
}
} else {
if (yych <= '^') {
- if (yych <= '\\') goto yy91;
- if (yych <= ']') goto yy92;
+ if (yych <= '\\') goto yy79;
+ if (yych <= ']') goto yy80;
} else {
- if (yych == '`') goto yy73;
- if (yych <= 'z') goto yy88;
+ if (yych == '`') goto yy61;
+ if (yych <= 'z') goto yy76;
}
}
}
-yy73:
- YYDEBUG(73, *YYCURSOR);
+yy61:
+ YYDEBUG(61, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy74:
- YYDEBUG(74, *YYCURSOR);
+yy62:
+ YYDEBUG(62, *YYCURSOR);
if (yybm[0+yych] & 4) {
- goto yy73;
+ goto yy61;
}
- if (yych <= '"') goto yy75;
- if (yych <= '$') goto yy94;
- if (yych <= ';') goto yy75;
- if (yych <= '\\') goto yy96;
-yy75:
- YYDEBUG(75, *YYCURSOR);
+ if (yych <= '"') goto yy63;
+ if (yych <= '$') goto yy82;
+ if (yych <= ';') goto yy63;
+ if (yych <= '\\') goto yy79;
+yy63:
+ YYDEBUG(63, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 583 "Zend/zend_ini_scanner.l"
+#line 581 "Zend/zend_ini_scanner.l"
{ /* Get rest as section/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
-#line 1272 "Zend/zend_ini_scanner.c"
-yy76:
- YYDEBUG(76, *YYCURSOR);
+#line 1143 "Zend/zend_ini_scanner.c"
+yy64:
+ YYDEBUG(64, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(77, *YYCURSOR);
+ YYDEBUG(65, *YYCURSOR);
if (yybm[0+yych] & 8) {
- goto yy76;
+ goto yy64;
}
if (yych <= '$') {
if (yych <= '\r') {
- if (yych <= 0x08) goto yy73;
- if (yych <= '\n') goto yy75;
- if (yych <= '\f') goto yy73;
- goto yy75;
+ if (yych <= 0x08) goto yy61;
+ if (yych <= '\n') goto yy63;
+ if (yych <= '\f') goto yy61;
+ goto yy63;
} else {
- if (yych == '"') goto yy80;
- if (yych <= '#') goto yy73;
- goto yy94;
+ if (yych == '"') goto yy68;
+ if (yych <= '#') goto yy61;
+ goto yy82;
}
} else {
if (yych <= ';') {
- if (yych == '\'') goto yy75;
- if (yych <= ':') goto yy73;
- goto yy75;
+ if (yych == '\'') goto yy63;
+ if (yych <= ':') goto yy61;
+ goto yy63;
} else {
- if (yych <= '[') goto yy73;
- if (yych <= '\\') goto yy96;
- if (yych <= ']') goto yy92;
- goto yy73;
+ if (yych <= '[') goto yy61;
+ if (yych <= '\\') goto yy79;
+ if (yych <= ']') goto yy80;
+ goto yy61;
}
}
-yy78:
- YYDEBUG(78, *YYCURSOR);
+yy66:
+ YYDEBUG(66, *YYCURSOR);
++YYCURSOR;
-yy79:
- YYDEBUG(79, *YYCURSOR);
+yy67:
+ YYDEBUG(67, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 658 "Zend/zend_ini_scanner.l"
+#line 656 "Zend/zend_ini_scanner.l"
{
return 0;
}
-#line 1316 "Zend/zend_ini_scanner.c"
-yy80:
- YYDEBUG(80, *YYCURSOR);
+#line 1187 "Zend/zend_ini_scanner.c"
+yy68:
+ YYDEBUG(68, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(81, *YYCURSOR);
+ YYDEBUG(69, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 587 "Zend/zend_ini_scanner.l"
+#line 585 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
}
-#line 1327 "Zend/zend_ini_scanner.c"
-yy82:
- YYDEBUG(82, *YYCURSOR);
+#line 1198 "Zend/zend_ini_scanner.c"
+yy70:
+ YYDEBUG(70, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy79;
- if (yych <= '[') goto yy73;
- goto yy97;
+ if (yych <= 0x00) goto yy67;
+ if (yych <= '[') goto yy61;
+ goto yy84;
} else {
- if (yych == '{') goto yy99;
- goto yy73;
+ if (yych == '{') goto yy86;
+ goto yy61;
}
-yy83:
- YYDEBUG(83, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
+yy71:
+ YYDEBUG(71, *YYCURSOR);
+ yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy101;
+ goto yy88;
}
- goto yy79;
-yy84:
- YYDEBUG(84, *YYCURSOR);
+ goto yy67;
+yy72:
+ YYDEBUG(72, *YYCURSOR);
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy74;
- if (yych <= '9') goto yy103;
- goto yy74;
-yy85:
- YYDEBUG(85, *YYCURSOR);
- yyaccept = 2;
+ if (yych <= '/') goto yy62;
+ if (yych <= '9') goto yy90;
+ goto yy62;
+yy73:
+ YYDEBUG(73, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(86, *YYCURSOR);
+ YYDEBUG(74, *YYCURSOR);
if (yybm[0+yych] & 16) {
- goto yy85;
+ goto yy73;
}
if (yych <= '&') {
if (yych <= '\r') {
- if (yych == '\n') goto yy87;
- if (yych <= '\f') goto yy73;
+ if (yych == '\n') goto yy75;
+ if (yych <= '\f') goto yy61;
} else {
if (yych <= '"') {
- if (yych <= '!') goto yy73;
+ if (yych <= '!') goto yy61;
} else {
- if (yych == '$') goto yy94;
- goto yy73;
+ if (yych == '$') goto yy82;
+ goto yy61;
}
}
} else {
if (yych <= ':') {
- if (yych <= '\'') goto yy87;
- if (yych == '.') goto yy103;
- goto yy73;
+ if (yych <= '\'') goto yy75;
+ if (yych == '.') goto yy90;
+ goto yy61;
} else {
if (yych <= '[') {
- if (yych >= '<') goto yy73;
+ if (yych >= '<') goto yy61;
} else {
- if (yych <= '\\') goto yy96;
- if (yych >= '^') goto yy73;
+ if (yych <= '\\') goto yy79;
+ if (yych >= '^') goto yy61;
}
}
}
-yy87:
- YYDEBUG(87, *YYCURSOR);
+yy75:
+ YYDEBUG(75, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 561 "Zend/zend_ini_scanner.l"
+#line 559 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
-#line 1397 "Zend/zend_ini_scanner.c"
-yy88:
- YYDEBUG(88, *YYCURSOR);
- yyaccept = 3;
+#line 1267 "Zend/zend_ini_scanner.c"
+yy76:
+ YYDEBUG(76, *YYCURSOR);
+ yyaccept = 2;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(89, *YYCURSOR);
+ YYDEBUG(77, *YYCURSOR);
if (yybm[0+yych] & 32) {
- goto yy88;
+ goto yy76;
}
if (yych <= '$') {
if (yych <= '\r') {
- if (yych == '\n') goto yy90;
- if (yych <= '\f') goto yy73;
+ if (yych == '\n') goto yy78;
+ if (yych <= '\f') goto yy61;
} else {
- if (yych == '"') goto yy90;
- if (yych <= '#') goto yy73;
- goto yy94;
+ if (yych == '"') goto yy78;
+ if (yych <= '#') goto yy61;
+ goto yy82;
}
} else {
if (yych <= ';') {
- if (yych == '\'') goto yy90;
- if (yych <= ':') goto yy73;
+ if (yych == '\'') goto yy78;
+ if (yych <= ':') goto yy61;
} else {
- if (yych <= '[') goto yy73;
- if (yych <= '\\') goto yy96;
- if (yych >= '^') goto yy73;
+ if (yych <= '[') goto yy61;
+ if (yych <= '\\') goto yy79;
+ if (yych >= '^') goto yy61;
}
}
-yy90:
- YYDEBUG(90, *YYCURSOR);
+yy78:
+ YYDEBUG(78, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 557 "Zend/zend_ini_scanner.l"
+#line 555 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
-#line 1434 "Zend/zend_ini_scanner.c"
-yy91:
- YYDEBUG(91, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy73;
-yy92:
- YYDEBUG(92, *YYCURSOR);
+#line 1304 "Zend/zend_ini_scanner.c"
+yy79:
+ YYDEBUG(79, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(93, *YYCURSOR);
+ YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy61;
+yy80:
+ YYDEBUG(80, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(81, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 447 "Zend/zend_ini_scanner.l"
+#line 445 "Zend/zend_ini_scanner.l"
{ /* End of section or an option offset */
BEGIN(INITIAL);
return ']';
}
-#line 1449 "Zend/zend_ini_scanner.c"
-yy94:
- YYDEBUG(94, *YYCURSOR);
+#line 1321 "Zend/zend_ini_scanner.c"
+yy82:
+ YYDEBUG(82, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy95;
- if (yych <= '[') goto yy73;
- goto yy97;
+ if (yych <= 0x00) goto yy83;
+ if (yych <= '[') goto yy61;
+ goto yy84;
} else {
- if (yych != '{') goto yy73;
+ if (yych != '{') goto yy61;
}
-yy95:
- YYDEBUG(95, *YYCURSOR);
+yy83:
+ YYDEBUG(83, *YYCURSOR);
YYCURSOR = YYMARKER;
if (yyaccept <= 1) {
if (yyaccept == 0) {
- goto yy75;
+ goto yy63;
} else {
- goto yy79;
+ goto yy75;
}
} else {
- if (yyaccept == 2) {
- goto yy87;
- } else {
- goto yy90;
- }
+ goto yy78;
}
-yy96:
- YYDEBUG(96, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- goto yy73;
-yy97:
- YYDEBUG(97, *YYCURSOR);
+yy84:
+ YYDEBUG(84, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(98, *YYCURSOR);
+ YYDEBUG(85, *YYCURSOR);
if (yybm[0+yych] & 64) {
- goto yy97;
+ goto yy84;
}
- goto yy73;
-yy99:
- YYDEBUG(99, *YYCURSOR);
+ goto yy61;
+yy86:
+ YYDEBUG(86, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(100, *YYCURSOR);
+ YYDEBUG(87, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 452 "Zend/zend_ini_scanner.l"
+#line 450 "Zend/zend_ini_scanner.l"
{ /* Variable start */
yy_push_state(ST_VARNAME);
return TC_DOLLAR_CURLY;
}
-#line 1504 "Zend/zend_ini_scanner.c"
-yy101:
- YYDEBUG(101, *YYCURSOR);
+#line 1366 "Zend/zend_ini_scanner.c"
+yy88:
+ YYDEBUG(88, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(102, *YYCURSOR);
+ YYDEBUG(89, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy101;
+ goto yy88;
}
- goto yy105;
-yy103:
- YYDEBUG(103, *YYCURSOR);
- yyaccept = 2;
+ goto yy92;
+yy90:
+ YYDEBUG(90, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(104, *YYCURSOR);
+ YYDEBUG(91, *YYCURSOR);
if (yych <= '&') {
if (yych <= '\r') {
- if (yych == '\n') goto yy87;
- if (yych <= '\f') goto yy73;
- goto yy87;
+ if (yych == '\n') goto yy75;
+ if (yych <= '\f') goto yy61;
+ goto yy75;
} else {
if (yych <= '"') {
- if (yych <= '!') goto yy73;
- goto yy87;
+ if (yych <= '!') goto yy61;
+ goto yy75;
} else {
- if (yych == '$') goto yy94;
- goto yy73;
+ if (yych == '$') goto yy82;
+ goto yy61;
}
}
} else {
if (yych <= ':') {
- if (yych <= '\'') goto yy87;
- if (yych <= '/') goto yy73;
- if (yych <= '9') goto yy103;
- goto yy73;
+ if (yych <= '\'') goto yy75;
+ if (yych <= '/') goto yy61;
+ if (yych <= '9') goto yy90;
+ goto yy61;
} else {
if (yych <= '[') {
- if (yych <= ';') goto yy87;
- goto yy73;
+ if (yych <= ';') goto yy75;
+ goto yy61;
} else {
- if (yych <= '\\') goto yy96;
- if (yych <= ']') goto yy87;
- goto yy73;
+ if (yych <= '\\') goto yy79;
+ if (yych <= ']') goto yy75;
+ goto yy61;
}
}
}
-yy105:
- YYDEBUG(105, *YYCURSOR);
+yy92:
+ YYDEBUG(92, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(106, *YYCURSOR);
+ YYDEBUG(93, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 419 "Zend/zend_ini_scanner.l"
+#line 417 "Zend/zend_ini_scanner.l"
{ /* Raw string */
/* Eat leading and trailing single quotes */
if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
@@ -1563,324 +1425,7 @@ yy105:
}
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
-#line 1567 "Zend/zend_ini_scanner.c"
- }
-/* *********************************** */
-yyc_ST_RAW:
- {
- static const unsigned char yybm[] = {
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 192, 0, 128, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 192, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- };
- YYDEBUG(107, *YYCURSOR);
- YYFILL(3);
- yych = *YYCURSOR;
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy111;
- } else {
- if (yych <= '\t') goto yy113;
- if (yych <= '\n') goto yy114;
- goto yy111;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy116;
- if (yych <= 0x1F) goto yy111;
- goto yy113;
- } else {
- if (yych == ';') goto yy117;
- goto yy111;
- }
- }
- YYDEBUG(109, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(110, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 653 "Zend/zend_ini_scanner.l"
- { /* End of option value (if EOF is reached before EOL */
- BEGIN(INITIAL);
- return END_OF_LINE;
-}
-#line 1636 "Zend/zend_ini_scanner.c"
-yy111:
- YYDEBUG(111, *YYCURSOR);
- ++YYCURSOR;
-yy112:
- YYDEBUG(112, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 503 "Zend/zend_ini_scanner.l"
- { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
- unsigned char *sc = NULL;
- EAT_LEADING_WHITESPACE();
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR) {
- case '\n':
- case '\r':
- goto end_raw_value_chars;
- break;
- case ';':
- if (sc == NULL) {
- sc = YYCURSOR;
- }
- YYCURSOR++;
- break;
- case '"':
- if (yytext[0] == '"') {
- sc = NULL;
- }
- YYCURSOR++;
- break;
- default:
- YYCURSOR++;
- break;
- }
- }
-end_raw_value_chars:
- if (sc) {
- yyleng = sc - SCNG(yy_text);
- } else {
- yyleng = YYCURSOR - SCNG(yy_text);
- }
-
- EAT_TRAILING_WHITESPACE();
-
- /* Eat leading and trailing double quotes */
- if (yyleng > 1 && yytext[0] == '"' && yytext[yyleng - 1] == '"') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
-
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1687 "Zend/zend_ini_scanner.c"
-yy113:
- YYDEBUG(113, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy112;
- if (yych <= '\n') goto yy119;
- if (yych <= '\f') goto yy112;
- goto yy119;
- } else {
- if (yych <= ' ') {
- if (yych <= 0x1F) goto yy112;
- goto yy119;
- } else {
- if (yych == ';') goto yy119;
- goto yy112;
- }
- }
-yy114:
- YYDEBUG(114, *YYCURSOR);
- ++YYCURSOR;
-yy115:
- YYDEBUG(115, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 551 "Zend/zend_ini_scanner.l"
- { /* End of option value */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 1717 "Zend/zend_ini_scanner.c"
-yy116:
- YYDEBUG(116, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy114;
- goto yy115;
-yy117:
- YYDEBUG(117, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy122;
-yy118:
- YYDEBUG(118, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy119:
- YYDEBUG(119, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy118;
- }
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy120;
- if (yych <= '\n') goto yy114;
- } else {
- if (yych <= '\r') goto yy116;
- if (yych == ';') goto yy121;
- }
-yy120:
- YYDEBUG(120, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 637 "Zend/zend_ini_scanner.l"
- {
- /* eat whitespace */
- goto restart;
-}
-#line 1752 "Zend/zend_ini_scanner.c"
-yy121:
- YYDEBUG(121, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy122:
- YYDEBUG(122, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy121;
- }
- if (yych >= '\v') goto yy125;
-yy123:
- YYDEBUG(123, *YYCURSOR);
- ++YYCURSOR;
-yy124:
- YYDEBUG(124, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 647 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 1776 "Zend/zend_ini_scanner.c"
-yy125:
- YYDEBUG(125, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) == '\n') goto yy123;
- goto yy124;
- }
-/* *********************************** */
-yyc_ST_SECTION_RAW:
- {
- static const unsigned char yybm[] = {
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 192, 0, 64, 64, 0, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 192, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 0, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- };
- YYDEBUG(126, *YYCURSOR);
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy128;
- }
- if (yych <= '\r') goto yy131;
- goto yy133;
-yy128:
- YYDEBUG(128, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(129, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy128;
- }
- YYDEBUG(130, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 547 "Zend/zend_ini_scanner.l"
- { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1843 "Zend/zend_ini_scanner.c"
-yy131:
- YYDEBUG(131, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(132, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 658 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 1853 "Zend/zend_ini_scanner.c"
-yy133:
- YYDEBUG(133, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(134, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy133;
- }
- if (yych <= 0x08) goto yy135;
- if (yych <= '\n') goto yy136;
- if (yych == '\r') goto yy137;
-yy135:
- YYDEBUG(135, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 428 "Zend/zend_ini_scanner.l"
- { /* End of section */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return ']';
-}
-#line 1875 "Zend/zend_ini_scanner.c"
-yy136:
- YYDEBUG(136, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy135;
-yy137:
- YYDEBUG(137, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) == '\n') goto yy136;
- goto yy135;
+#line 1429 "Zend/zend_ini_scanner.c"
}
/* *********************************** */
yyc_ST_SECTION_VALUE:
@@ -1919,380 +1464,371 @@ yyc_ST_SECTION_VALUE:
132, 132, 132, 132, 132, 132, 132, 132,
132, 132, 132, 132, 132, 132, 132, 132,
};
- YYDEBUG(138, *YYCURSOR);
+ YYDEBUG(94, *YYCURSOR);
YYFILL(2);
yych = *YYCURSOR;
if (yybm[0+yych] & 8) {
- goto yy143;
+ goto yy99;
}
if (yych <= '/') {
if (yych <= '"') {
if (yych <= '\f') {
- if (yych <= 0x08) goto yy140;
- if (yych <= '\n') goto yy145;
+ if (yych <= 0x08) goto yy96;
+ if (yych <= '\n') goto yy101;
} else {
- if (yych <= '\r') goto yy145;
- if (yych >= '"') goto yy147;
+ if (yych <= '\r') goto yy101;
+ if (yych >= '"') goto yy103;
}
} else {
if (yych <= '&') {
- if (yych == '$') goto yy149;
+ if (yych == '$') goto yy105;
} else {
- if (yych <= '\'') goto yy150;
- if (yych <= ',') goto yy140;
- if (yych <= '.') goto yy151;
+ if (yych <= '\'') goto yy106;
+ if (yych <= ',') goto yy96;
+ if (yych <= '.') goto yy107;
}
}
} else {
if (yych <= '[') {
if (yych <= ';') {
- if (yych <= '9') goto yy152;
- if (yych >= ';') goto yy145;
+ if (yych <= '9') goto yy108;
+ if (yych >= ';') goto yy101;
} else {
- if (yych <= '@') goto yy140;
- if (yych <= 'Z') goto yy155;
+ if (yych <= '@') goto yy96;
+ if (yych <= 'Z') goto yy111;
}
} else {
if (yych <= '^') {
- if (yych <= '\\') goto yy158;
- if (yych <= ']') goto yy159;
+ if (yych <= '\\') goto yy114;
+ if (yych <= ']') goto yy115;
} else {
- if (yych == '`') goto yy140;
- if (yych <= 'z') goto yy155;
+ if (yych == '`') goto yy96;
+ if (yych <= 'z') goto yy111;
}
}
}
-yy140:
- YYDEBUG(140, *YYCURSOR);
+yy96:
+ YYDEBUG(96, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy141:
- YYDEBUG(141, *YYCURSOR);
+yy97:
+ YYDEBUG(97, *YYCURSOR);
if (yybm[0+yych] & 4) {
- goto yy140;
+ goto yy96;
}
- if (yych <= '"') goto yy142;
- if (yych <= '$') goto yy162;
- if (yych <= ';') goto yy142;
- if (yych <= '\\') goto yy164;
-yy142:
- YYDEBUG(142, *YYCURSOR);
+ if (yych <= '"') goto yy98;
+ if (yych <= '$') goto yy118;
+ if (yych <= ';') goto yy98;
+ if (yych <= '\\') goto yy114;
+yy98:
+ YYDEBUG(98, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 583 "Zend/zend_ini_scanner.l"
+#line 581 "Zend/zend_ini_scanner.l"
{ /* Get rest as section/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
-#line 1988 "Zend/zend_ini_scanner.c"
-yy143:
- YYDEBUG(143, *YYCURSOR);
+#line 1533 "Zend/zend_ini_scanner.c"
+yy99:
+ YYDEBUG(99, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(144, *YYCURSOR);
+ YYDEBUG(100, *YYCURSOR);
if (yybm[0+yych] & 8) {
- goto yy143;
+ goto yy99;
}
if (yych <= '$') {
if (yych <= '\r') {
- if (yych <= 0x08) goto yy140;
- if (yych <= '\n') goto yy142;
- if (yych <= '\f') goto yy140;
- goto yy142;
+ if (yych <= 0x08) goto yy96;
+ if (yych <= '\n') goto yy98;
+ if (yych <= '\f') goto yy96;
+ goto yy98;
} else {
- if (yych == '"') goto yy147;
- if (yych <= '#') goto yy140;
- goto yy162;
+ if (yych == '"') goto yy103;
+ if (yych <= '#') goto yy96;
+ goto yy118;
}
} else {
if (yych <= ';') {
- if (yych == '\'') goto yy142;
- if (yych <= ':') goto yy140;
- goto yy142;
+ if (yych == '\'') goto yy98;
+ if (yych <= ':') goto yy96;
+ goto yy98;
} else {
- if (yych <= '[') goto yy140;
- if (yych <= '\\') goto yy164;
- if (yych <= ']') goto yy142;
- goto yy140;
+ if (yych <= '[') goto yy96;
+ if (yych <= '\\') goto yy114;
+ if (yych <= ']') goto yy98;
+ goto yy96;
}
}
-yy145:
- YYDEBUG(145, *YYCURSOR);
+yy101:
+ YYDEBUG(101, *YYCURSOR);
++YYCURSOR;
-yy146:
- YYDEBUG(146, *YYCURSOR);
+yy102:
+ YYDEBUG(102, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 658 "Zend/zend_ini_scanner.l"
+#line 656 "Zend/zend_ini_scanner.l"
{
return 0;
}
-#line 2032 "Zend/zend_ini_scanner.c"
-yy147:
- YYDEBUG(147, *YYCURSOR);
+#line 1577 "Zend/zend_ini_scanner.c"
+yy103:
+ YYDEBUG(103, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(148, *YYCURSOR);
+ YYDEBUG(104, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 587 "Zend/zend_ini_scanner.l"
+#line 585 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
}
-#line 2043 "Zend/zend_ini_scanner.c"
-yy149:
- YYDEBUG(149, *YYCURSOR);
+#line 1588 "Zend/zend_ini_scanner.c"
+yy105:
+ YYDEBUG(105, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy146;
- if (yych <= '[') goto yy140;
- goto yy165;
+ if (yych <= 0x00) goto yy102;
+ if (yych <= '[') goto yy96;
+ goto yy120;
} else {
- if (yych == '{') goto yy167;
- goto yy140;
+ if (yych == '{') goto yy122;
+ goto yy96;
}
-yy150:
- YYDEBUG(150, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
+yy106:
+ YYDEBUG(106, *YYCURSOR);
+ yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy169;
+ goto yy124;
}
- goto yy146;
-yy151:
- YYDEBUG(151, *YYCURSOR);
+ goto yy102;
+yy107:
+ YYDEBUG(107, *YYCURSOR);
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy141;
- if (yych <= '9') goto yy171;
- goto yy141;
-yy152:
- YYDEBUG(152, *YYCURSOR);
- yyaccept = 2;
+ if (yych <= '/') goto yy97;
+ if (yych <= '9') goto yy126;
+ goto yy97;
+yy108:
+ YYDEBUG(108, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(153, *YYCURSOR);
+ YYDEBUG(109, *YYCURSOR);
if (yybm[0+yych] & 16) {
- goto yy152;
+ goto yy108;
}
if (yych <= '&') {
if (yych <= '\r') {
- if (yych == '\n') goto yy154;
- if (yych <= '\f') goto yy140;
+ if (yych == '\n') goto yy110;
+ if (yych <= '\f') goto yy96;
} else {
if (yych <= '"') {
- if (yych <= '!') goto yy140;
+ if (yych <= '!') goto yy96;
} else {
- if (yych == '$') goto yy162;
- goto yy140;
+ if (yych == '$') goto yy118;
+ goto yy96;
}
}
} else {
if (yych <= ':') {
- if (yych <= '\'') goto yy154;
- if (yych == '.') goto yy171;
- goto yy140;
+ if (yych <= '\'') goto yy110;
+ if (yych == '.') goto yy126;
+ goto yy96;
} else {
if (yych <= '[') {
- if (yych >= '<') goto yy140;
+ if (yych >= '<') goto yy96;
} else {
- if (yych <= '\\') goto yy164;
- if (yych >= '^') goto yy140;
+ if (yych <= '\\') goto yy114;
+ if (yych >= '^') goto yy96;
}
}
}
-yy154:
- YYDEBUG(154, *YYCURSOR);
+yy110:
+ YYDEBUG(110, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 561 "Zend/zend_ini_scanner.l"
+#line 559 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
-#line 2113 "Zend/zend_ini_scanner.c"
-yy155:
- YYDEBUG(155, *YYCURSOR);
- yyaccept = 3;
+#line 1657 "Zend/zend_ini_scanner.c"
+yy111:
+ YYDEBUG(111, *YYCURSOR);
+ yyaccept = 2;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(156, *YYCURSOR);
+ YYDEBUG(112, *YYCURSOR);
if (yybm[0+yych] & 32) {
- goto yy155;
+ goto yy111;
}
if (yych <= '$') {
if (yych <= '\r') {
- if (yych == '\n') goto yy157;
- if (yych <= '\f') goto yy140;
+ if (yych == '\n') goto yy113;
+ if (yych <= '\f') goto yy96;
} else {
- if (yych == '"') goto yy157;
- if (yych <= '#') goto yy140;
- goto yy162;
+ if (yych == '"') goto yy113;
+ if (yych <= '#') goto yy96;
+ goto yy118;
}
} else {
if (yych <= ';') {
- if (yych == '\'') goto yy157;
- if (yych <= ':') goto yy140;
+ if (yych == '\'') goto yy113;
+ if (yych <= ':') goto yy96;
} else {
- if (yych <= '[') goto yy140;
- if (yych <= '\\') goto yy164;
- if (yych >= '^') goto yy140;
+ if (yych <= '[') goto yy96;
+ if (yych <= '\\') goto yy114;
+ if (yych >= '^') goto yy96;
}
}
-yy157:
- YYDEBUG(157, *YYCURSOR);
+yy113:
+ YYDEBUG(113, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 557 "Zend/zend_ini_scanner.l"
+#line 555 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
-#line 2150 "Zend/zend_ini_scanner.c"
-yy158:
- YYDEBUG(158, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy140;
-yy159:
- YYDEBUG(159, *YYCURSOR);
+#line 1694 "Zend/zend_ini_scanner.c"
+yy114:
+ YYDEBUG(114, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ goto yy96;
+yy115:
+ YYDEBUG(115, *YYCURSOR);
++YYCURSOR;
YYFILL(2);
yych = *YYCURSOR;
- YYDEBUG(160, *YYCURSOR);
+ YYDEBUG(116, *YYCURSOR);
if (yych <= '\f') {
- if (yych <= 0x08) goto yy161;
- if (yych <= '\t') goto yy159;
- if (yych <= '\n') goto yy173;
+ if (yych <= 0x08) goto yy117;
+ if (yych <= '\t') goto yy115;
+ if (yych <= '\n') goto yy128;
} else {
- if (yych <= '\r') goto yy174;
- if (yych == ' ') goto yy159;
+ if (yych <= '\r') goto yy129;
+ if (yych == ' ') goto yy115;
}
-yy161:
- YYDEBUG(161, *YYCURSOR);
+yy117:
+ YYDEBUG(117, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 428 "Zend/zend_ini_scanner.l"
+#line 426 "Zend/zend_ini_scanner.l"
{ /* End of section */
BEGIN(INITIAL);
SCNG(lineno)++;
return ']';
}
-#line 2178 "Zend/zend_ini_scanner.c"
-yy162:
- YYDEBUG(162, *YYCURSOR);
+#line 1724 "Zend/zend_ini_scanner.c"
+yy118:
+ YYDEBUG(118, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy163;
- if (yych <= '[') goto yy140;
- goto yy165;
+ if (yych <= 0x00) goto yy119;
+ if (yych <= '[') goto yy96;
+ goto yy120;
} else {
- if (yych != '{') goto yy140;
+ if (yych != '{') goto yy96;
}
-yy163:
- YYDEBUG(163, *YYCURSOR);
+yy119:
+ YYDEBUG(119, *YYCURSOR);
YYCURSOR = YYMARKER;
if (yyaccept <= 1) {
if (yyaccept == 0) {
- goto yy142;
+ goto yy98;
} else {
- goto yy146;
+ goto yy110;
}
} else {
- if (yyaccept == 2) {
- goto yy154;
- } else {
- goto yy157;
- }
+ goto yy113;
}
-yy164:
- YYDEBUG(164, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- goto yy140;
-yy165:
- YYDEBUG(165, *YYCURSOR);
+yy120:
+ YYDEBUG(120, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(166, *YYCURSOR);
+ YYDEBUG(121, *YYCURSOR);
if (yybm[0+yych] & 64) {
- goto yy165;
+ goto yy120;
}
- goto yy140;
-yy167:
- YYDEBUG(167, *YYCURSOR);
+ goto yy96;
+yy122:
+ YYDEBUG(122, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(168, *YYCURSOR);
+ YYDEBUG(123, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 452 "Zend/zend_ini_scanner.l"
+#line 450 "Zend/zend_ini_scanner.l"
{ /* Variable start */
yy_push_state(ST_VARNAME);
return TC_DOLLAR_CURLY;
}
-#line 2233 "Zend/zend_ini_scanner.c"
-yy169:
- YYDEBUG(169, *YYCURSOR);
+#line 1769 "Zend/zend_ini_scanner.c"
+yy124:
+ YYDEBUG(124, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(170, *YYCURSOR);
+ YYDEBUG(125, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy169;
+ goto yy124;
}
- goto yy175;
-yy171:
- YYDEBUG(171, *YYCURSOR);
- yyaccept = 2;
+ goto yy130;
+yy126:
+ YYDEBUG(126, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(172, *YYCURSOR);
+ YYDEBUG(127, *YYCURSOR);
if (yych <= '&') {
if (yych <= '\r') {
- if (yych == '\n') goto yy154;
- if (yych <= '\f') goto yy140;
- goto yy154;
+ if (yych == '\n') goto yy110;
+ if (yych <= '\f') goto yy96;
+ goto yy110;
} else {
if (yych <= '"') {
- if (yych <= '!') goto yy140;
- goto yy154;
+ if (yych <= '!') goto yy96;
+ goto yy110;
} else {
- if (yych == '$') goto yy162;
- goto yy140;
+ if (yych == '$') goto yy118;
+ goto yy96;
}
}
} else {
if (yych <= ':') {
- if (yych <= '\'') goto yy154;
- if (yych <= '/') goto yy140;
- if (yych <= '9') goto yy171;
- goto yy140;
+ if (yych <= '\'') goto yy110;
+ if (yych <= '/') goto yy96;
+ if (yych <= '9') goto yy126;
+ goto yy96;
} else {
if (yych <= '[') {
- if (yych <= ';') goto yy154;
- goto yy140;
+ if (yych <= ';') goto yy110;
+ goto yy96;
} else {
- if (yych <= '\\') goto yy164;
- if (yych <= ']') goto yy154;
- goto yy140;
+ if (yych <= '\\') goto yy114;
+ if (yych <= ']') goto yy110;
+ goto yy96;
}
}
}
-yy173:
- YYDEBUG(173, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy161;
-yy174:
- YYDEBUG(174, *YYCURSOR);
+yy128:
+ YYDEBUG(128, *YYCURSOR);
+ ++YYCURSOR;
+ goto yy117;
+yy129:
+ YYDEBUG(129, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == '\n') goto yy173;
- goto yy161;
-yy175:
- YYDEBUG(175, *YYCURSOR);
+ if (yych == '\n') goto yy128;
+ goto yy117;
+yy130:
+ YYDEBUG(130, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(176, *YYCURSOR);
+ YYDEBUG(131, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 419 "Zend/zend_ini_scanner.l"
+#line 417 "Zend/zend_ini_scanner.l"
{ /* Raw string */
/* Eat leading and trailing single quotes */
if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
@@ -2301,56 +1837,56 @@ yy175:
}
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
-#line 2305 "Zend/zend_ini_scanner.c"
+#line 1841 "Zend/zend_ini_scanner.c"
}
/* *********************************** */
yyc_ST_VALUE:
{
static const unsigned char yybm[] = {
- 96, 98, 98, 98, 98, 98, 98, 98,
- 98, 100, 64, 98, 98, 64, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 100, 96, 96, 98, 224, 98, 96, 32,
- 96, 96, 98, 98, 98, 98, 98, 98,
+ 80, 82, 82, 82, 82, 82, 82, 82,
+ 82, 84, 64, 82, 82, 64, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 84, 80, 80, 82, 208, 82, 80, 16,
+ 80, 80, 82, 82, 82, 82, 82, 82,
122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 98, 96, 98, 96, 98, 98,
- 98, 114, 114, 114, 114, 114, 114, 114,
+ 122, 122, 82, 80, 82, 80, 82, 82,
+ 82, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 98, 98, 98, 96, 114,
- 98, 114, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 82, 82, 82, 80, 114,
+ 82, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 98, 96, 98, 96, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
- 98, 98, 98, 98, 98, 98, 98, 98,
+ 114, 114, 114, 82, 80, 82, 80, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
};
- YYDEBUG(177, *YYCURSOR);
+ YYDEBUG(132, *YYCURSOR);
YYFILL(6);
yych = *YYCURSOR;
if (yybm[0+yych] & 4) {
- goto yy184;
+ goto yy139;
}
switch (yych) {
- case 0x00: goto yy179;
+ case 0x00: goto yy134;
case '\t':
- case '\n': goto yy187;
- case '\r': goto yy189;
+ case '\n': goto yy142;
+ case '\r': goto yy144;
case ' ':
case '!':
case '&':
@@ -2358,12 +1894,12 @@ yyc_ST_VALUE:
case ')':
case '^':
case '|':
- case '~': goto yy190;
- case '"': goto yy193;
- case '$': goto yy195;
- case '\'': goto yy196;
+ case '~': goto yy145;
+ case '"': goto yy148;
+ case '$': goto yy150;
+ case '\'': goto yy151;
case '-':
- case '.': goto yy197;
+ case '.': goto yy152;
case '0':
case '1':
case '2':
@@ -2373,9 +1909,9 @@ yyc_ST_VALUE:
case '6':
case '7':
case '8':
- case '9': goto yy198;
- case ';': goto yy201;
- case '=': goto yy202;
+ case '9': goto yy153;
+ case ';': goto yy156;
+ case '=': goto yy158;
case 'A':
case 'B':
case 'C':
@@ -2418,1089 +1954,1073 @@ yyc_ST_VALUE:
case 'v':
case 'w':
case 'x':
- case 'z': goto yy204;
+ case 'z': goto yy160;
case 'F':
- case 'f': goto yy207;
+ case 'f': goto yy163;
case 'N':
- case 'n': goto yy208;
+ case 'n': goto yy164;
case 'O':
- case 'o': goto yy209;
+ case 'o': goto yy165;
case 'T':
- case 't': goto yy210;
+ case 't': goto yy166;
case 'Y':
- case 'y': goto yy211;
- default: goto yy181;
+ case 'y': goto yy167;
+ default: goto yy136;
}
-yy179:
- YYDEBUG(179, *YYCURSOR);
+yy134:
+ YYDEBUG(134, *YYCURSOR);
++YYCURSOR;
-yy180:
- YYDEBUG(180, *YYCURSOR);
+yy135:
+ YYDEBUG(135, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 653 "Zend/zend_ini_scanner.l"
+#line 651 "Zend/zend_ini_scanner.l"
{ /* End of option value (if EOF is reached before EOL */
BEGIN(INITIAL);
return END_OF_LINE;
}
-#line 2446 "Zend/zend_ini_scanner.c"
-yy181:
- YYDEBUG(181, *YYCURSOR);
+#line 1982 "Zend/zend_ini_scanner.c"
+yy136:
+ YYDEBUG(136, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
-yy182:
- YYDEBUG(182, *YYCURSOR);
+yy137:
+ YYDEBUG(137, *YYCURSOR);
if (yybm[0+yych] & 2) {
- goto yy181;
+ goto yy136;
}
- if (yych <= '"') goto yy183;
- if (yych <= '$') goto yy212;
-yy183:
- YYDEBUG(183, *YYCURSOR);
+ if (yych <= '"') goto yy138;
+ if (yych <= '$') goto yy168;
+yy138:
+ YYDEBUG(138, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 579 "Zend/zend_ini_scanner.l"
+#line 577 "Zend/zend_ini_scanner.l"
{ /* Get everything else as option/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
-#line 2467 "Zend/zend_ini_scanner.c"
-yy184:
- YYDEBUG(184, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
+#line 2003 "Zend/zend_ini_scanner.c"
+yy139:
+ YYDEBUG(139, *YYCURSOR);
+ ++YYCURSOR;
YYFILL(2);
yych = *YYCURSOR;
- YYDEBUG(185, *YYCURSOR);
+ YYDEBUG(140, *YYCURSOR);
if (yybm[0+yych] & 4) {
- goto yy184;
+ goto yy139;
}
if (yych <= '\r') {
- if (yych <= 0x08) goto yy186;
- if (yych <= '\n') goto yy187;
- if (yych >= '\r') goto yy189;
+ if (yych <= 0x08) goto yy141;
+ if (yych <= '\n') goto yy142;
+ if (yych >= '\r') goto yy144;
} else {
if (yych <= '"') {
- if (yych >= '"') goto yy193;
+ if (yych >= '"') goto yy148;
} else {
- if (yych == ';') goto yy214;
+ if (yych == ';') goto yy156;
}
}
-yy186:
- YYDEBUG(186, *YYCURSOR);
+yy141:
+ YYDEBUG(141, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 633 "Zend/zend_ini_scanner.l"
+#line 631 "Zend/zend_ini_scanner.l"
{
RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);
}
-#line 2496 "Zend/zend_ini_scanner.c"
-yy187:
- YYDEBUG(187, *YYCURSOR);
+#line 2031 "Zend/zend_ini_scanner.c"
+yy142:
+ YYDEBUG(142, *YYCURSOR);
++YYCURSOR;
-yy188:
- YYDEBUG(188, *YYCURSOR);
+yy143:
+ YYDEBUG(143, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 551 "Zend/zend_ini_scanner.l"
+#line 549 "Zend/zend_ini_scanner.l"
{ /* End of option value */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 2509 "Zend/zend_ini_scanner.c"
-yy189:
- YYDEBUG(189, *YYCURSOR);
+#line 2044 "Zend/zend_ini_scanner.c"
+yy144:
+ YYDEBUG(144, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == '\n') goto yy187;
- goto yy188;
-yy190:
- YYDEBUG(190, *YYCURSOR);
+ if (yych == '\n') goto yy142;
+ goto yy143;
+yy145:
+ YYDEBUG(145, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(191, *YYCURSOR);
- if (yych == '\t') goto yy190;
- if (yych == ' ') goto yy190;
- YYDEBUG(192, *YYCURSOR);
+ YYDEBUG(146, *YYCURSOR);
+ if (yych == '\t') goto yy145;
+ if (yych == ' ') goto yy145;
+ YYDEBUG(147, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 569 "Zend/zend_ini_scanner.l"
+#line 567 "Zend/zend_ini_scanner.l"
{ /* Boolean operators */
return yytext[0];
}
-#line 2529 "Zend/zend_ini_scanner.c"
-yy193:
- YYDEBUG(193, *YYCURSOR);
+#line 2064 "Zend/zend_ini_scanner.c"
+yy148:
+ YYDEBUG(148, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(194, *YYCURSOR);
+ YYDEBUG(149, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 587 "Zend/zend_ini_scanner.l"
+#line 585 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
}
-#line 2540 "Zend/zend_ini_scanner.c"
-yy195:
- YYDEBUG(195, *YYCURSOR);
+#line 2075 "Zend/zend_ini_scanner.c"
+yy150:
+ YYDEBUG(150, *YYCURSOR);
yych = *++YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy180;
- if (yych <= '[') goto yy181;
- goto yy216;
+ if (yych <= 0x00) goto yy135;
+ if (yych <= '[') goto yy136;
+ goto yy170;
} else {
- if (yych == '{') goto yy217;
- goto yy181;
+ if (yych == '{') goto yy171;
+ goto yy136;
}
-yy196:
- YYDEBUG(196, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
+yy151:
+ YYDEBUG(151, *YYCURSOR);
+ yych = *++YYCURSOR;
if (yybm[0+yych] & 64) {
- goto yy219;
+ goto yy173;
}
- goto yy180;
-yy197:
- YYDEBUG(197, *YYCURSOR);
+ goto yy135;
+yy152:
+ YYDEBUG(152, *YYCURSOR);
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy182;
- if (yych <= '9') goto yy221;
- goto yy182;
-yy198:
- YYDEBUG(198, *YYCURSOR);
- yyaccept = 3;
+ if (yych <= '/') goto yy137;
+ if (yych <= '9') goto yy175;
+ goto yy137;
+yy153:
+ YYDEBUG(153, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(199, *YYCURSOR);
+ YYDEBUG(154, *YYCURSOR);
if (yybm[0+yych] & 8) {
- goto yy198;
+ goto yy153;
}
if (yych <= '-') {
if (yych <= 0x1F) {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy200;
- if (yych <= 0x08) goto yy181;
+ if (yych <= 0x00) goto yy155;
+ if (yych <= 0x08) goto yy136;
} else {
- if (yych != '\r') goto yy181;
+ if (yych != '\r') goto yy136;
}
} else {
if (yych <= '$') {
- if (yych <= '"') goto yy200;
- if (yych <= '#') goto yy181;
- goto yy212;
+ if (yych <= '"') goto yy155;
+ if (yych <= '#') goto yy136;
+ goto yy168;
} else {
- if (yych <= '%') goto yy181;
- if (yych >= '*') goto yy181;
+ if (yych <= '%') goto yy136;
+ if (yych >= '*') goto yy136;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= '.') goto yy221;
- if (yych <= ':') goto yy181;
+ if (yych <= '.') goto yy175;
+ if (yych <= ':') goto yy136;
} else {
- if (yych != '=') goto yy181;
+ if (yych != '=') goto yy136;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy200;
- if (yych <= '{') goto yy181;
+ if (yych <= '^') goto yy155;
+ if (yych <= '{') goto yy136;
} else {
- if (yych != '~') goto yy181;
+ if (yych != '~') goto yy136;
}
}
}
-yy200:
- YYDEBUG(200, *YYCURSOR);
+yy155:
+ YYDEBUG(155, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 561 "Zend/zend_ini_scanner.l"
+#line 559 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
-#line 2619 "Zend/zend_ini_scanner.c"
-yy201:
- YYDEBUG(201, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy215;
-yy202:
- YYDEBUG(202, *YYCURSOR);
+#line 2153 "Zend/zend_ini_scanner.c"
+yy156:
+ YYDEBUG(156, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(203, *YYCURSOR);
+ YYFILL(2);
+ yych = *YYCURSOR;
+ YYDEBUG(157, *YYCURSOR);
+ if (yybm[0+yych] & 16) {
+ goto yy156;
+ }
+ if (yych <= '\n') goto yy177;
+ goto yy179;
+yy158:
+ YYDEBUG(158, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(159, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 573 "Zend/zend_ini_scanner.l"
+#line 571 "Zend/zend_ini_scanner.l"
{ /* Make = used in option value to trigger error */
yyless(0);
BEGIN(INITIAL);
return END_OF_LINE;
}
-#line 2636 "Zend/zend_ini_scanner.c"
-yy204:
- YYDEBUG(204, *YYCURSOR);
- yyaccept = 4;
+#line 2176 "Zend/zend_ini_scanner.c"
+yy160:
+ YYDEBUG(160, *YYCURSOR);
+ yyaccept = 2;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(205, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy204;
+ YYDEBUG(161, *YYCURSOR);
+ if (yybm[0+yych] & 32) {
+ goto yy160;
}
if (yych <= ')') {
if (yych <= '\r') {
if (yych <= 0x08) {
- if (yych >= 0x01) goto yy181;
+ if (yych >= 0x01) goto yy136;
} else {
- if (yych <= '\n') goto yy206;
- if (yych <= '\f') goto yy181;
+ if (yych <= '\n') goto yy162;
+ if (yych <= '\f') goto yy136;
}
} else {
if (yych <= '#') {
- if (yych <= 0x1F) goto yy181;
- if (yych >= '#') goto yy181;
+ if (yych <= 0x1F) goto yy136;
+ if (yych >= '#') goto yy136;
} else {
- if (yych <= '$') goto yy212;
- if (yych <= '%') goto yy181;
+ if (yych <= '$') goto yy168;
+ if (yych <= '%') goto yy136;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= ':') goto yy181;
+ if (yych <= ':') goto yy136;
} else {
- if (yych != '=') goto yy181;
+ if (yych != '=') goto yy136;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy206;
- if (yych <= '{') goto yy181;
+ if (yych <= '^') goto yy162;
+ if (yych <= '{') goto yy136;
} else {
- if (yych != '~') goto yy181;
+ if (yych != '~') goto yy136;
}
}
}
-yy206:
- YYDEBUG(206, *YYCURSOR);
+yy162:
+ YYDEBUG(162, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 557 "Zend/zend_ini_scanner.l"
+#line 555 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
-#line 2687 "Zend/zend_ini_scanner.c"
-yy207:
- YYDEBUG(207, *YYCURSOR);
- yyaccept = 4;
+#line 2227 "Zend/zend_ini_scanner.c"
+yy163:
+ YYDEBUG(163, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '<') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '/') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- goto yy182;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ goto yy137;
} else {
- if (yych <= '9') goto yy204;
- if (yych == ';') goto yy206;
- goto yy182;
+ if (yych <= '9') goto yy160;
+ if (yych == ';') goto yy162;
+ goto yy137;
}
}
} else {
if (yych <= '_') {
if (yych <= 'A') {
- if (yych <= '=') goto yy206;
- if (yych <= '@') goto yy182;
- goto yy226;
+ if (yych <= '=') goto yy162;
+ if (yych <= '@') goto yy137;
+ goto yy180;
} else {
- if (yych <= 'Z') goto yy204;
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- goto yy204;
+ if (yych <= 'Z') goto yy160;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ goto yy160;
}
} else {
if (yych <= '{') {
- if (yych <= '`') goto yy182;
- if (yych <= 'a') goto yy226;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych <= '`') goto yy137;
+ if (yych <= 'a') goto yy180;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy208:
- YYDEBUG(208, *YYCURSOR);
- yyaccept = 4;
+yy164:
+ YYDEBUG(164, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= 'N') {
if (yych <= '%') {
if (yych <= '\f') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- if (yych <= '\n') goto yy206;
- goto yy182;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ if (yych <= '\n') goto yy162;
+ goto yy137;
} else {
- if (yych <= '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- if (yych <= '"') goto yy206;
- goto yy182;
+ if (yych <= '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ if (yych <= '"') goto yy162;
+ goto yy137;
}
} else {
if (yych <= ':') {
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- if (yych <= '9') goto yy204;
- goto yy182;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ if (yych <= '9') goto yy160;
+ goto yy137;
} else {
if (yych <= '<') {
- if (yych <= ';') goto yy206;
- goto yy182;
+ if (yych <= ';') goto yy162;
+ goto yy137;
} else {
- if (yych <= '=') goto yy206;
- if (yych <= '@') goto yy182;
- goto yy204;
+ if (yych <= '=') goto yy162;
+ if (yych <= '@') goto yy137;
+ goto yy160;
}
}
}
} else {
if (yych <= 'n') {
if (yych <= 'Z') {
- if (yych <= 'O') goto yy227;
- if (yych == 'U') goto yy229;
- goto yy204;
+ if (yych <= 'O') goto yy181;
+ if (yych == 'U') goto yy183;
+ goto yy160;
} else {
if (yych <= '^') {
- if (yych <= ']') goto yy182;
- goto yy206;
+ if (yych <= ']') goto yy137;
+ goto yy162;
} else {
- if (yych == '`') goto yy182;
- goto yy204;
+ if (yych == '`') goto yy137;
+ goto yy160;
}
}
} else {
if (yych <= 'z') {
- if (yych <= 'o') goto yy227;
- if (yych == 'u') goto yy229;
- goto yy204;
+ if (yych <= 'o') goto yy181;
+ if (yych == 'u') goto yy183;
+ goto yy160;
} else {
if (yych <= '|') {
- if (yych <= '{') goto yy182;
- goto yy206;
+ if (yych <= '{') goto yy137;
+ goto yy162;
} else {
- if (yych == '~') goto yy206;
- goto yy182;
+ if (yych == '~') goto yy162;
+ goto yy137;
}
}
}
}
-yy209:
- YYDEBUG(209, *YYCURSOR);
- yyaccept = 4;
+yy165:
+ YYDEBUG(165, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= 'E') {
if (yych <= '%') {
if (yych <= '\f') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- if (yych <= '\n') goto yy206;
- goto yy182;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ if (yych <= '\n') goto yy162;
+ goto yy137;
} else {
- if (yych <= '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- if (yych <= '"') goto yy206;
- goto yy182;
+ if (yych <= '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ if (yych <= '"') goto yy162;
+ goto yy137;
}
} else {
if (yych <= ':') {
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- if (yych <= '9') goto yy204;
- goto yy182;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ if (yych <= '9') goto yy160;
+ goto yy137;
} else {
if (yych <= '<') {
- if (yych <= ';') goto yy206;
- goto yy182;
+ if (yych <= ';') goto yy162;
+ goto yy137;
} else {
- if (yych <= '=') goto yy206;
- if (yych <= '@') goto yy182;
- goto yy204;
+ if (yych <= '=') goto yy162;
+ if (yych <= '@') goto yy137;
+ goto yy160;
}
}
}
} else {
if (yych <= 'e') {
if (yych <= 'Z') {
- if (yych <= 'F') goto yy230;
- if (yych == 'N') goto yy231;
- goto yy204;
+ if (yych <= 'F') goto yy184;
+ if (yych == 'N') goto yy185;
+ goto yy160;
} else {
if (yych <= '^') {
- if (yych <= ']') goto yy182;
- goto yy206;
+ if (yych <= ']') goto yy137;
+ goto yy162;
} else {
- if (yych == '`') goto yy182;
- goto yy204;
+ if (yych == '`') goto yy137;
+ goto yy160;
}
}
} else {
if (yych <= 'z') {
- if (yych <= 'f') goto yy230;
- if (yych == 'n') goto yy231;
- goto yy204;
+ if (yych <= 'f') goto yy184;
+ if (yych == 'n') goto yy185;
+ goto yy160;
} else {
if (yych <= '|') {
- if (yych <= '{') goto yy182;
- goto yy206;
+ if (yych <= '{') goto yy137;
+ goto yy162;
} else {
- if (yych == '~') goto yy206;
- goto yy182;
+ if (yych == '~') goto yy162;
+ goto yy137;
}
}
}
}
-yy210:
- YYDEBUG(210, *YYCURSOR);
- yyaccept = 4;
+yy166:
+ YYDEBUG(166, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'R') goto yy233;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'R') goto yy187;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'r') goto yy233;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'r') goto yy187;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy211:
- YYDEBUG(211, *YYCURSOR);
- yyaccept = 4;
+yy167:
+ YYDEBUG(167, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'E') goto yy234;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'E') goto yy188;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'e') goto yy234;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'e') goto yy188;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy212:
- YYDEBUG(212, *YYCURSOR);
+yy168:
+ YYDEBUG(168, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '\\') {
- if (yych <= 0x00) goto yy213;
- if (yych <= '[') goto yy181;
- goto yy216;
+ if (yych <= 0x00) goto yy169;
+ if (yych <= '[') goto yy136;
+ goto yy170;
} else {
- if (yych != '{') goto yy181;
+ if (yych != '{') goto yy136;
}
-yy213:
- YYDEBUG(213, *YYCURSOR);
+yy169:
+ YYDEBUG(169, *YYCURSOR);
YYCURSOR = YYMARKER;
- if (yyaccept <= 3) {
+ if (yyaccept <= 2) {
if (yyaccept <= 1) {
if (yyaccept == 0) {
- goto yy183;
+ goto yy138;
} else {
- goto yy186;
+ goto yy155;
}
} else {
- if (yyaccept == 2) {
- goto yy180;
- } else {
- goto yy200;
- }
+ goto yy162;
}
} else {
- if (yyaccept <= 5) {
- if (yyaccept == 4) {
- goto yy206;
+ if (yyaccept <= 4) {
+ if (yyaccept == 3) {
+ goto yy182;
} else {
- goto yy228;
+ goto yy186;
}
} else {
- if (yyaccept == 6) {
- goto yy232;
- } else {
- goto yy249;
- }
+ goto yy203;
}
}
-yy214:
- YYDEBUG(214, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy215:
- YYDEBUG(215, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy214;
- }
- if (yych <= '\n') goto yy223;
- goto yy225;
-yy216:
- YYDEBUG(216, *YYCURSOR);
+yy170:
+ YYDEBUG(170, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy235;
+ goto yy189;
}
- goto yy181;
-yy217:
- YYDEBUG(217, *YYCURSOR);
+ goto yy136;
+yy171:
+ YYDEBUG(171, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(218, *YYCURSOR);
+ YYDEBUG(172, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 452 "Zend/zend_ini_scanner.l"
+#line 450 "Zend/zend_ini_scanner.l"
{ /* Variable start */
yy_push_state(ST_VARNAME);
return TC_DOLLAR_CURLY;
}
-#line 3046 "Zend/zend_ini_scanner.c"
-yy219:
- YYDEBUG(219, *YYCURSOR);
+#line 2566 "Zend/zend_ini_scanner.c"
+yy173:
+ YYDEBUG(173, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(220, *YYCURSOR);
+ YYDEBUG(174, *YYCURSOR);
if (yybm[0+yych] & 64) {
- goto yy219;
+ goto yy173;
}
- goto yy237;
-yy221:
- YYDEBUG(221, *YYCURSOR);
- yyaccept = 3;
+ goto yy191;
+yy175:
+ YYDEBUG(175, *YYCURSOR);
+ yyaccept = 1;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(222, *YYCURSOR);
+ YYDEBUG(176, *YYCURSOR);
if (yych <= '/') {
if (yych <= 0x1F) {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy200;
- if (yych <= 0x08) goto yy181;
- goto yy200;
+ if (yych <= 0x00) goto yy155;
+ if (yych <= 0x08) goto yy136;
+ goto yy155;
} else {
- if (yych == '\r') goto yy200;
- goto yy181;
+ if (yych == '\r') goto yy155;
+ goto yy136;
}
} else {
if (yych <= '$') {
- if (yych <= '"') goto yy200;
- if (yych <= '#') goto yy181;
- goto yy212;
+ if (yych <= '"') goto yy155;
+ if (yych <= '#') goto yy136;
+ goto yy168;
} else {
- if (yych <= '%') goto yy181;
- if (yych <= ')') goto yy200;
- goto yy181;
+ if (yych <= '%') goto yy136;
+ if (yych <= ')') goto yy155;
+ goto yy136;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= '9') goto yy221;
- if (yych <= ':') goto yy181;
- goto yy200;
+ if (yych <= '9') goto yy175;
+ if (yych <= ':') goto yy136;
+ goto yy155;
} else {
- if (yych == '=') goto yy200;
- goto yy181;
+ if (yych == '=') goto yy155;
+ goto yy136;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy200;
- if (yych <= '{') goto yy181;
- goto yy200;
+ if (yych <= '^') goto yy155;
+ if (yych <= '{') goto yy136;
+ goto yy155;
} else {
- if (yych == '~') goto yy200;
- goto yy181;
+ if (yych == '~') goto yy155;
+ goto yy136;
}
}
}
-yy223:
- YYDEBUG(223, *YYCURSOR);
+yy177:
+ YYDEBUG(177, *YYCURSOR);
++YYCURSOR;
-yy224:
- YYDEBUG(224, *YYCURSOR);
+yy178:
+ YYDEBUG(178, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 647 "Zend/zend_ini_scanner.l"
+#line 645 "Zend/zend_ini_scanner.l"
{ /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 3118 "Zend/zend_ini_scanner.c"
-yy225:
- YYDEBUG(225, *YYCURSOR);
+#line 2638 "Zend/zend_ini_scanner.c"
+yy179:
+ YYDEBUG(179, *YYCURSOR);
yych = *++YYCURSOR;
- if (yych == '\n') goto yy223;
- goto yy224;
-yy226:
- YYDEBUG(226, *YYCURSOR);
- yyaccept = 4;
+ if (yych == '\n') goto yy177;
+ goto yy178;
+yy180:
+ YYDEBUG(180, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'L') goto yy239;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'L') goto yy193;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'l') goto yy239;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'l') goto yy193;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy227:
- YYDEBUG(227, *YYCURSOR);
- yyaccept = 5;
+yy181:
+ YYDEBUG(181, *YYCURSOR);
+ yyaccept = 3;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '<') {
if (yych <= ' ') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy228;
- if (yych <= 0x08) goto yy182;
- if (yych <= '\t') goto yy240;
+ if (yych <= 0x00) goto yy182;
+ if (yych <= 0x08) goto yy137;
+ if (yych <= '\t') goto yy194;
} else {
- if (yych == '\r') goto yy228;
- if (yych <= 0x1F) goto yy182;
- goto yy240;
+ if (yych == '\r') goto yy182;
+ if (yych <= 0x1F) goto yy137;
+ goto yy194;
}
} else {
if (yych <= '/') {
- if (yych <= '"') goto yy228;
- if (yych <= '%') goto yy182;
- if (yych >= '*') goto yy182;
+ if (yych <= '"') goto yy182;
+ if (yych <= '%') goto yy137;
+ if (yych >= '*') goto yy137;
} else {
- if (yych <= '9') goto yy204;
- if (yych != ';') goto yy182;
+ if (yych <= '9') goto yy160;
+ if (yych != ';') goto yy137;
}
}
} else {
if (yych <= '_') {
if (yych <= 'N') {
- if (yych <= '=') goto yy228;
- if (yych <= '@') goto yy182;
- if (yych <= 'M') goto yy204;
- goto yy242;
+ if (yych <= '=') goto yy182;
+ if (yych <= '@') goto yy137;
+ if (yych <= 'M') goto yy160;
+ goto yy196;
} else {
- if (yych <= 'Z') goto yy204;
- if (yych <= ']') goto yy182;
- if (yych >= '_') goto yy204;
+ if (yych <= 'Z') goto yy160;
+ if (yych <= ']') goto yy137;
+ if (yych >= '_') goto yy160;
}
} else {
if (yych <= 'z') {
- if (yych <= '`') goto yy182;
- if (yych == 'n') goto yy242;
- goto yy204;
+ if (yych <= '`') goto yy137;
+ if (yych == 'n') goto yy196;
+ goto yy160;
} else {
if (yych <= '|') {
- if (yych <= '{') goto yy182;
+ if (yych <= '{') goto yy137;
} else {
- if (yych != '~') goto yy182;
+ if (yych != '~') goto yy137;
}
}
}
}
-yy228:
- YYDEBUG(228, *YYCURSOR);
+yy182:
+ YYDEBUG(182, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 476 "Zend/zend_ini_scanner.l"
+#line 474 "Zend/zend_ini_scanner.l"
{ /* FALSE value (when used outside option value/offset this causes parse error!)*/
RETURN_TOKEN(BOOL_FALSE, "", 0);
}
-#line 3233 "Zend/zend_ini_scanner.c"
-yy229:
- YYDEBUG(229, *YYCURSOR);
- yyaccept = 4;
+#line 2753 "Zend/zend_ini_scanner.c"
+yy183:
+ YYDEBUG(183, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'L') goto yy243;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'L') goto yy197;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'l') goto yy243;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'l') goto yy197;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy230:
- YYDEBUG(230, *YYCURSOR);
- yyaccept = 4;
+yy184:
+ YYDEBUG(184, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'F') goto yy244;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'F') goto yy198;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'f') goto yy244;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'f') goto yy198;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy231:
- YYDEBUG(231, *YYCURSOR);
- yyaccept = 6;
+yy185:
+ YYDEBUG(185, *YYCURSOR);
+ yyaccept = 4;
yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy204;
+ if (yybm[0+yych] & 32) {
+ goto yy160;
}
if (yych <= ')') {
if (yych <= '\f') {
if (yych <= 0x08) {
- if (yych >= 0x01) goto yy182;
+ if (yych >= 0x01) goto yy137;
} else {
- if (yych <= '\t') goto yy245;
- if (yych >= '\v') goto yy182;
+ if (yych <= '\t') goto yy199;
+ if (yych >= '\v') goto yy137;
}
} else {
if (yych <= ' ') {
- if (yych <= '\r') goto yy232;
- if (yych <= 0x1F) goto yy182;
- goto yy245;
+ if (yych <= '\r') goto yy186;
+ if (yych <= 0x1F) goto yy137;
+ goto yy199;
} else {
- if (yych <= '"') goto yy232;
- if (yych <= '%') goto yy182;
+ if (yych <= '"') goto yy186;
+ if (yych <= '%') goto yy137;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= ':') goto yy182;
+ if (yych <= ':') goto yy137;
} else {
- if (yych != '=') goto yy182;
+ if (yych != '=') goto yy137;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy232;
- if (yych <= '{') goto yy182;
+ if (yych <= '^') goto yy186;
+ if (yych <= '{') goto yy137;
} else {
- if (yych != '~') goto yy182;
+ if (yych != '~') goto yy137;
}
}
}
-yy232:
- YYDEBUG(232, *YYCURSOR);
+yy186:
+ YYDEBUG(186, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 472 "Zend/zend_ini_scanner.l"
+#line 470 "Zend/zend_ini_scanner.l"
{ /* TRUE value (when used outside option value/offset this causes parse error!) */
RETURN_TOKEN(BOOL_TRUE, "1", 1);
}
-#line 3384 "Zend/zend_ini_scanner.c"
-yy233:
- YYDEBUG(233, *YYCURSOR);
- yyaccept = 4;
+#line 2904 "Zend/zend_ini_scanner.c"
+yy187:
+ YYDEBUG(187, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'U') goto yy247;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'U') goto yy201;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'u') goto yy247;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'u') goto yy201;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy234:
- YYDEBUG(234, *YYCURSOR);
- yyaccept = 4;
+yy188:
+ YYDEBUG(188, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'S') goto yy231;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'S') goto yy185;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 's') goto yy231;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 's') goto yy185;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy235:
- YYDEBUG(235, *YYCURSOR);
+yy189:
+ YYDEBUG(189, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(236, *YYCURSOR);
+ YYDEBUG(190, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy235;
+ goto yy189;
}
- if (yych <= 0x00) goto yy183;
- if (yych == '\\') goto yy216;
- goto yy181;
-yy237:
- YYDEBUG(237, *YYCURSOR);
+ if (yych <= 0x00) goto yy138;
+ if (yych == '\\') goto yy170;
+ goto yy136;
+yy191:
+ YYDEBUG(191, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(238, *YYCURSOR);
+ YYDEBUG(192, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 419 "Zend/zend_ini_scanner.l"
+#line 417 "Zend/zend_ini_scanner.l"
{ /* Raw string */
/* Eat leading and trailing single quotes */
if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
@@ -3509,335 +3029,554 @@ yy237:
}
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
-#line 3513 "Zend/zend_ini_scanner.c"
-yy239:
- YYDEBUG(239, *YYCURSOR);
- yyaccept = 4;
+#line 3033 "Zend/zend_ini_scanner.c"
+yy193:
+ YYDEBUG(193, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'S') goto yy242;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'S') goto yy196;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 's') goto yy242;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 's') goto yy196;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy240:
- YYDEBUG(240, *YYCURSOR);
+yy194:
+ YYDEBUG(194, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(241, *YYCURSOR);
- if (yych == '\t') goto yy240;
- if (yych == ' ') goto yy240;
- goto yy228;
-yy242:
- YYDEBUG(242, *YYCURSOR);
- yyaccept = 4;
+ YYDEBUG(195, *YYCURSOR);
+ if (yych == '\t') goto yy194;
+ if (yych == ' ') goto yy194;
+ goto yy182;
+yy196:
+ YYDEBUG(196, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'E') goto yy244;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'E') goto yy198;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'e') goto yy244;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'e') goto yy198;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy243:
- YYDEBUG(243, *YYCURSOR);
- yyaccept = 4;
+yy197:
+ YYDEBUG(197, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'L') goto yy248;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'L') goto yy202;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'l') goto yy248;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'l') goto yy202;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy244:
- YYDEBUG(244, *YYCURSOR);
- yyaccept = 5;
+yy198:
+ YYDEBUG(198, *YYCURSOR);
+ yyaccept = 3;
yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy204;
+ if (yybm[0+yych] & 32) {
+ goto yy160;
}
if (yych <= ')') {
if (yych <= '\f') {
if (yych <= 0x08) {
- if (yych <= 0x00) goto yy228;
- goto yy182;
+ if (yych <= 0x00) goto yy182;
+ goto yy137;
} else {
- if (yych <= '\t') goto yy240;
- if (yych <= '\n') goto yy228;
- goto yy182;
+ if (yych <= '\t') goto yy194;
+ if (yych <= '\n') goto yy182;
+ goto yy137;
}
} else {
if (yych <= ' ') {
- if (yych <= '\r') goto yy228;
- if (yych <= 0x1F) goto yy182;
- goto yy240;
+ if (yych <= '\r') goto yy182;
+ if (yych <= 0x1F) goto yy137;
+ goto yy194;
} else {
- if (yych <= '"') goto yy228;
- if (yych <= '%') goto yy182;
- goto yy228;
+ if (yych <= '"') goto yy182;
+ if (yych <= '%') goto yy137;
+ goto yy182;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= ':') goto yy182;
- goto yy228;
- } else {
- if (yych == '=') goto yy228;
+ if (yych <= ':') goto yy137;
goto yy182;
+ } else {
+ if (yych == '=') goto yy182;
+ goto yy137;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy228;
- if (yych <= '{') goto yy182;
- goto yy228;
- } else {
- if (yych == '~') goto yy228;
+ if (yych <= '^') goto yy182;
+ if (yych <= '{') goto yy137;
goto yy182;
+ } else {
+ if (yych == '~') goto yy182;
+ goto yy137;
}
}
}
-yy245:
- YYDEBUG(245, *YYCURSOR);
+yy199:
+ YYDEBUG(199, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(246, *YYCURSOR);
- if (yych == '\t') goto yy245;
- if (yych == ' ') goto yy245;
- goto yy232;
-yy247:
- YYDEBUG(247, *YYCURSOR);
- yyaccept = 4;
+ YYDEBUG(200, *YYCURSOR);
+ if (yych == '\t') goto yy199;
+ if (yych == ' ') goto yy199;
+ goto yy186;
+yy201:
+ YYDEBUG(201, *YYCURSOR);
+ yyaccept = 2;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= '=') {
if (yych <= '"') {
if (yych <= '\n') {
- if (yych <= 0x00) goto yy206;
- if (yych <= 0x08) goto yy182;
- goto yy206;
+ if (yych <= 0x00) goto yy162;
+ if (yych <= 0x08) goto yy137;
+ goto yy162;
} else {
- if (yych == '\r') goto yy206;
- if (yych <= 0x1F) goto yy182;
- goto yy206;
+ if (yych == '\r') goto yy162;
+ if (yych <= 0x1F) goto yy137;
+ goto yy162;
}
} else {
if (yych <= '9') {
- if (yych <= '%') goto yy182;
- if (yych <= ')') goto yy206;
- if (yych <= '/') goto yy182;
- goto yy204;
+ if (yych <= '%') goto yy137;
+ if (yych <= ')') goto yy162;
+ if (yych <= '/') goto yy137;
+ goto yy160;
} else {
- if (yych == ';') goto yy206;
- if (yych <= '<') goto yy182;
- goto yy206;
+ if (yych == ';') goto yy162;
+ if (yych <= '<') goto yy137;
+ goto yy162;
}
}
} else {
if (yych <= '`') {
if (yych <= 'Z') {
- if (yych <= '@') goto yy182;
- if (yych == 'E') goto yy231;
- goto yy204;
+ if (yych <= '@') goto yy137;
+ if (yych == 'E') goto yy185;
+ goto yy160;
} else {
- if (yych <= ']') goto yy182;
- if (yych <= '^') goto yy206;
- if (yych <= '_') goto yy204;
- goto yy182;
+ if (yych <= ']') goto yy137;
+ if (yych <= '^') goto yy162;
+ if (yych <= '_') goto yy160;
+ goto yy137;
}
} else {
if (yych <= '{') {
- if (yych == 'e') goto yy231;
- if (yych <= 'z') goto yy204;
- goto yy182;
+ if (yych == 'e') goto yy185;
+ if (yych <= 'z') goto yy160;
+ goto yy137;
} else {
- if (yych == '}') goto yy182;
- if (yych <= '~') goto yy206;
- goto yy182;
+ if (yych == '}') goto yy137;
+ if (yych <= '~') goto yy162;
+ goto yy137;
}
}
}
-yy248:
- YYDEBUG(248, *YYCURSOR);
- yyaccept = 7;
+yy202:
+ YYDEBUG(202, *YYCURSOR);
+ yyaccept = 5;
yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy204;
+ if (yybm[0+yych] & 32) {
+ goto yy160;
}
if (yych <= ')') {
if (yych <= '\f') {
if (yych <= 0x08) {
- if (yych >= 0x01) goto yy182;
+ if (yych >= 0x01) goto yy137;
} else {
- if (yych <= '\t') goto yy250;
- if (yych >= '\v') goto yy182;
+ if (yych <= '\t') goto yy204;
+ if (yych >= '\v') goto yy137;
}
} else {
if (yych <= ' ') {
- if (yych <= '\r') goto yy249;
- if (yych <= 0x1F) goto yy182;
- goto yy250;
+ if (yych <= '\r') goto yy203;
+ if (yych <= 0x1F) goto yy137;
+ goto yy204;
} else {
- if (yych <= '"') goto yy249;
- if (yych <= '%') goto yy182;
+ if (yych <= '"') goto yy203;
+ if (yych <= '%') goto yy137;
}
}
} else {
if (yych <= ']') {
if (yych <= ';') {
- if (yych <= ':') goto yy182;
+ if (yych <= ':') goto yy137;
} else {
- if (yych != '=') goto yy182;
+ if (yych != '=') goto yy137;
}
} else {
if (yych <= '|') {
- if (yych <= '^') goto yy249;
- if (yych <= '{') goto yy182;
+ if (yych <= '^') goto yy203;
+ if (yych <= '{') goto yy137;
} else {
- if (yych != '~') goto yy182;
+ if (yych != '~') goto yy137;
}
}
}
-yy249:
- YYDEBUG(249, *YYCURSOR);
+yy203:
+ YYDEBUG(203, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 480 "Zend/zend_ini_scanner.l"
+#line 478 "Zend/zend_ini_scanner.l"
{
RETURN_TOKEN(NULL_NULL, "", 0);
}
-#line 3832 "Zend/zend_ini_scanner.c"
-yy250:
- YYDEBUG(250, *YYCURSOR);
+#line 3352 "Zend/zend_ini_scanner.c"
+yy204:
+ YYDEBUG(204, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(251, *YYCURSOR);
- if (yych == '\t') goto yy250;
- if (yych == ' ') goto yy250;
- goto yy249;
+ YYDEBUG(205, *YYCURSOR);
+ if (yych == '\t') goto yy204;
+ if (yych == ' ') goto yy204;
+ goto yy203;
+ }
+/* *********************************** */
+yyc_ST_SECTION_RAW:
+ {
+ static const unsigned char yybm[] = {
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 192, 0, 64, 64, 0, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 192, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 0, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ };
+ YYDEBUG(206, *YYCURSOR);
+ YYFILL(1);
+ yych = *YYCURSOR;
+ if (yybm[0+yych] & 64) {
+ goto yy208;
+ }
+ if (yych <= '\r') goto yy211;
+ goto yy213;
+yy208:
+ YYDEBUG(208, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ YYDEBUG(209, *YYCURSOR);
+ if (yybm[0+yych] & 64) {
+ goto yy208;
+ }
+ YYDEBUG(210, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 545 "Zend/zend_ini_scanner.l"
+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
+ RETURN_TOKEN(TC_RAW, yytext, yyleng);
+}
+#line 3423 "Zend/zend_ini_scanner.c"
+yy211:
+ YYDEBUG(211, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(212, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 656 "Zend/zend_ini_scanner.l"
+ {
+ return 0;
+}
+#line 3433 "Zend/zend_ini_scanner.c"
+yy213:
+ YYDEBUG(213, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(2);
+ yych = *YYCURSOR;
+ YYDEBUG(214, *YYCURSOR);
+ if (yybm[0+yych] & 128) {
+ goto yy213;
+ }
+ if (yych <= 0x08) goto yy215;
+ if (yych <= '\n') goto yy216;
+ if (yych == '\r') goto yy217;
+yy215:
+ YYDEBUG(215, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 426 "Zend/zend_ini_scanner.l"
+ { /* End of section */
+ BEGIN(INITIAL);
+ SCNG(lineno)++;
+ return ']';
+}
+#line 3455 "Zend/zend_ini_scanner.c"
+yy216:
+ YYDEBUG(216, *YYCURSOR);
+ ++YYCURSOR;
+ goto yy215;
+yy217:
+ YYDEBUG(217, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == '\n') goto yy216;
+ goto yy215;
+ }
+/* *********************************** */
+yyc_ST_DOUBLE_QUOTES:
+ {
+ static const unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 128, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ YYDEBUG(218, *YYCURSOR);
+ YYFILL(2);
+ yych = *YYCURSOR;
+ if (yych == '"') goto yy222;
+ if (yych == '$') goto yy225;
+ YYDEBUG(220, *YYCURSOR);
+ ++YYCURSOR;
+yy221:
+ YYDEBUG(221, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 595 "Zend/zend_ini_scanner.l"
+ { /* Escape double quoted string contents */
+ if (YYCURSOR > YYLIMIT) {
+ return 0;
+ }
+
+ while (YYCURSOR < YYLIMIT) {
+ switch (*YYCURSOR++) {
+ case '"':
+ if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') {
+ continue;
+ }
+ break;
+ case '$':
+ if (*YYCURSOR == '{') {
+ break;
+ }
+ continue;
+ case '\\':
+ if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') {
+ YYCURSOR++;
+ }
+ /* fall through */
+ default:
+ continue;
+ }
+
+ YYCURSOR--;
+ break;
+ }
+
+ yyleng = YYCURSOR - SCNG(yy_text);
+
+ zend_ini_escape_string(ini_lval, yytext, yyleng, '"');
+ return TC_QUOTED_STRING;
+}
+#line 3549 "Zend/zend_ini_scanner.c"
+yy222:
+ YYDEBUG(222, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ YYDEBUG(223, *YYCURSOR);
+ if (yybm[0+yych] & 128) {
+ goto yy222;
+ }
+ YYDEBUG(224, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 590 "Zend/zend_ini_scanner.l"
+ { /* Double quoted '"' string ends */
+ yy_pop_state();
+ return '"';
+}
+#line 3566 "Zend/zend_ini_scanner.c"
+yy225:
+ YYDEBUG(225, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych != '{') goto yy221;
+ YYDEBUG(226, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(227, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 450 "Zend/zend_ini_scanner.l"
+ { /* Variable start */
+ yy_push_state(ST_VARNAME);
+ return TC_DOLLAR_CURLY;
+}
+#line 3580 "Zend/zend_ini_scanner.c"
}
/* *********************************** */
yyc_ST_VARNAME:
@@ -3876,26 +3615,26 @@ yyc_ST_VARNAME:
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
};
- YYDEBUG(252, *YYCURSOR);
+ YYDEBUG(228, *YYCURSOR);
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy254;
+ goto yy230;
}
- if (yych == '}') goto yy259;
- goto yy257;
-yy254:
- YYDEBUG(254, *YYCURSOR);
+ if (yych == '}') goto yy235;
+ goto yy233;
+yy230:
+ YYDEBUG(230, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(255, *YYCURSOR);
+ YYDEBUG(231, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy254;
+ goto yy230;
}
- YYDEBUG(256, *YYCURSOR);
+ YYDEBUG(232, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 457 "Zend/zend_ini_scanner.l"
+#line 455 "Zend/zend_ini_scanner.l"
{ /* Variable name */
/* Eat leading whitespace */
EAT_LEADING_WHITESPACE();
@@ -3905,30 +3644,240 @@ yy254:
RETURN_TOKEN(TC_VARNAME, yytext, yyleng);
}
-#line 3909 "Zend/zend_ini_scanner.c"
-yy257:
- YYDEBUG(257, *YYCURSOR);
+#line 3648 "Zend/zend_ini_scanner.c"
+yy233:
+ YYDEBUG(233, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(258, *YYCURSOR);
+ YYDEBUG(234, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 658 "Zend/zend_ini_scanner.l"
+#line 656 "Zend/zend_ini_scanner.l"
{
return 0;
}
-#line 3919 "Zend/zend_ini_scanner.c"
-yy259:
- YYDEBUG(259, *YYCURSOR);
+#line 3658 "Zend/zend_ini_scanner.c"
+yy235:
+ YYDEBUG(235, *YYCURSOR);
++YYCURSOR;
- YYDEBUG(260, *YYCURSOR);
+ YYDEBUG(236, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 467 "Zend/zend_ini_scanner.l"
+#line 465 "Zend/zend_ini_scanner.l"
{ /* Variable end */
yy_pop_state();
return '}';
}
-#line 3930 "Zend/zend_ini_scanner.c"
+#line 3669 "Zend/zend_ini_scanner.c"
+ }
+/* *********************************** */
+yyc_ST_RAW:
+ {
+ static const unsigned char yybm[] = {
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 192, 0, 64, 64, 0, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 192, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ };
+ YYDEBUG(237, *YYCURSOR);
+ YYFILL(3);
+ yych = *YYCURSOR;
+ if (yych <= '\f') {
+ if (yych <= 0x08) {
+ if (yych >= 0x01) goto yy241;
+ } else {
+ if (yych <= '\t') goto yy243;
+ if (yych <= '\n') goto yy244;
+ goto yy241;
+ }
+ } else {
+ if (yych <= ' ') {
+ if (yych <= '\r') goto yy246;
+ if (yych <= 0x1F) goto yy241;
+ goto yy243;
+ } else {
+ if (yych == ';') goto yy247;
+ goto yy241;
+ }
+ }
+ YYDEBUG(239, *YYCURSOR);
+ ++YYCURSOR;
+ YYDEBUG(240, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 651 "Zend/zend_ini_scanner.l"
+ { /* End of option value (if EOF is reached before EOL */
+ BEGIN(INITIAL);
+ return END_OF_LINE;
+}
+#line 3738 "Zend/zend_ini_scanner.c"
+yy241:
+ YYDEBUG(241, *YYCURSOR);
+ ++YYCURSOR;
+yy242:
+ YYDEBUG(242, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 501 "Zend/zend_ini_scanner.l"
+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
+ unsigned char *sc = NULL;
+ EAT_LEADING_WHITESPACE();
+ while (YYCURSOR < YYLIMIT) {
+ switch (*YYCURSOR) {
+ case '\n':
+ case '\r':
+ goto end_raw_value_chars;
+ break;
+ case ';':
+ if (sc == NULL) {
+ sc = YYCURSOR;
+ }
+ YYCURSOR++;
+ break;
+ case '"':
+ if (yytext[0] == '"') {
+ sc = NULL;
+ }
+ YYCURSOR++;
+ break;
+ default:
+ YYCURSOR++;
+ break;
+ }
+ }
+end_raw_value_chars:
+ if (sc) {
+ yyleng = sc - SCNG(yy_text);
+ } else {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ }
+
+ EAT_TRAILING_WHITESPACE();
+
+ /* Eat leading and trailing double quotes */
+ if (yyleng > 1 && yytext[0] == '"' && yytext[yyleng - 1] == '"') {
+ SCNG(yy_text)++;
+ yyleng = yyleng - 2;
+ }
+
+ RETURN_TOKEN(TC_RAW, yytext, yyleng);
+}
+#line 3789 "Zend/zend_ini_scanner.c"
+yy243:
+ YYDEBUG(243, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych <= '\r') {
+ if (yych <= 0x08) goto yy242;
+ if (yych <= '\n') goto yy250;
+ if (yych <= '\f') goto yy242;
+ goto yy250;
+ } else {
+ if (yych <= ' ') {
+ if (yych <= 0x1F) goto yy242;
+ goto yy250;
+ } else {
+ if (yych == ';') goto yy250;
+ goto yy242;
+ }
+ }
+yy244:
+ YYDEBUG(244, *YYCURSOR);
+ ++YYCURSOR;
+yy245:
+ YYDEBUG(245, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 549 "Zend/zend_ini_scanner.l"
+ { /* End of option value */
+ BEGIN(INITIAL);
+ SCNG(lineno)++;
+ return END_OF_LINE;
+}
+#line 3819 "Zend/zend_ini_scanner.c"
+yy246:
+ YYDEBUG(246, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == '\n') goto yy244;
+ goto yy245;
+yy247:
+ YYDEBUG(247, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(2);
+ yych = *YYCURSOR;
+ YYDEBUG(248, *YYCURSOR);
+ if (yybm[0+yych] & 64) {
+ goto yy247;
+ }
+ if (yych <= '\n') goto yy252;
+ goto yy254;
+yy249:
+ YYDEBUG(249, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(2);
+ yych = *YYCURSOR;
+yy250:
+ YYDEBUG(250, *YYCURSOR);
+ if (yybm[0+yych] & 128) {
+ goto yy249;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08) goto yy251;
+ if (yych <= '\n') goto yy244;
+ } else {
+ if (yych <= '\r') goto yy246;
+ if (yych == ';') goto yy247;
+ }
+yy251:
+ YYDEBUG(251, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 635 "Zend/zend_ini_scanner.l"
+ {
+ /* eat whitespace */
+ goto restart;
+}
+#line 3861 "Zend/zend_ini_scanner.c"
+yy252:
+ YYDEBUG(252, *YYCURSOR);
+ ++YYCURSOR;
+yy253:
+ YYDEBUG(253, *YYCURSOR);
+ yyleng = YYCURSOR - SCNG(yy_text);
+#line 645 "Zend/zend_ini_scanner.l"
+ { /* Comment */
+ BEGIN(INITIAL);
+ SCNG(lineno)++;
+ return END_OF_LINE;
+}
+#line 3874 "Zend/zend_ini_scanner.c"
+yy254:
+ YYDEBUG(254, *YYCURSOR);
+ yych = *++YYCURSOR;
+ if (yych == '\n') goto yy252;
+ goto yy253;
}
}
-#line 662 "Zend/zend_ini_scanner.l"
+#line 660 "Zend/zend_ini_scanner.l"
}
diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h
index a21598c41d..8d6e00d055 100644
--- a/Zend/zend_ini_scanner.h
+++ b/Zend/zend_ini_scanner.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef _ZEND_INI_SCANNER_H
#define _ZEND_INI_SCANNER_H
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index c6187686db..ed4b85ad68 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -12,7 +12,7 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Zeev Suraski <zeev@zend.com> |
+ | Authors: Zeev Suraski <zeev@php.net> |
| Jani Taskinen <jani@php.net> |
| Marcus Boerger <helly@php.net> |
| Nuno Lopes <nlopess@php.net> |
@@ -20,8 +20,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <errno.h>
#include "zend.h"
#include "zend_API.h"
diff --git a/Zend/zend_ini_scanner_defs.h b/Zend/zend_ini_scanner_defs.h
index 1cbfbf1ce0..e446d7aeea 100644
--- a/Zend/zend_ini_scanner_defs.h
+++ b/Zend/zend_ini_scanner_defs.h
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 */
+/* Generated by re2c 1.0.3 */
#line 3 "Zend/zend_ini_scanner_defs.h"
enum YYCONDTYPE {
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index c857f8954b..addc9e560f 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
#include "zend_interfaces.h"
@@ -63,17 +61,23 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
zend_fcall_info_cache fcic;
ZVAL_UNDEF(&fci.function_name); /* Unused */
- fcic.initialized = 1;
if (!obj_ce) {
obj_ce = object ? Z_OBJCE_P(object) : NULL;
}
if (!fn_proxy || !*fn_proxy) {
- HashTable *function_table = obj_ce ? &obj_ce->function_table : EG(function_table);
- fcic.function_handler = zend_hash_str_find_ptr(
- function_table, function_name, function_name_len);
- if (fcic.function_handler == NULL) {
- /* error at c-level */
- zend_error_noreturn(E_CORE_ERROR, "Couldn't find implementation for method %s%s%s", obj_ce ? ZSTR_VAL(obj_ce->name) : "", obj_ce ? "::" : "", function_name);
+ if (EXPECTED(obj_ce)) {
+ fcic.function_handler = zend_hash_str_find_ptr(
+ &obj_ce->function_table, function_name, function_name_len);
+ if (UNEXPECTED(fcic.function_handler == NULL)) {
+ /* error at c-level */
+ zend_error_noreturn(E_CORE_ERROR, "Couldn't find implementation for method %s::%s", ZSTR_VAL(obj_ce->name), function_name);
+ }
+ } else {
+ fcic.function_handler = zend_fetch_function_str(function_name, function_name_len);
+ if (UNEXPECTED(fcic.function_handler == NULL)) {
+ /* error at c-level */
+ zend_error_noreturn(E_CORE_ERROR, "Couldn't find implementation for function %s", function_name);
+ }
}
if (fn_proxy) {
*fn_proxy = fcic.function_handler;
@@ -82,7 +86,6 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
fcic.function_handler = *fn_proxy;
}
- fcic.calling_scope = obj_ce;
if (object) {
fcic.called_scope = Z_OBJCE_P(object);
} else {
@@ -121,7 +124,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
/* {{{ zend_user_it_new_iterator */
ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *retval)
{
- zend_call_method_with_0_params(object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", retval);
+ zend_call_method_with_0_params(object, ce, &ce->iterator_funcs_ptr->zf_new_iterator, "getiterator", retval);
}
/* }}} */
@@ -157,12 +160,10 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter)
zval more;
int result;
- zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_valid, "valid", &more);
- if (Z_TYPE(more) != IS_UNDEF) {
- result = i_zend_is_true(&more);
- zval_ptr_dtor(&more);
- return result ? SUCCESS : FAILURE;
- }
+ zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_valid, "valid", &more);
+ result = i_zend_is_true(&more);
+ zval_ptr_dtor(&more);
+ return result ? SUCCESS : FAILURE;
}
return FAILURE;
}
@@ -175,7 +176,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter)
zval *object = &iter->it.data;
if (Z_ISUNDEF(iter->value)) {
- zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_current, "current", &iter->value);
+ zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_current, "current", &iter->value);
}
return &iter->value;
}
@@ -188,7 +189,7 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
zval *object = &iter->it.data;
zval retval;
- zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_key, "key", &retval);
+ zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_key, "key", &retval);
if (Z_TYPE(retval) != IS_UNDEF) {
ZVAL_ZVAL(key, &retval, 1, 1);
@@ -209,7 +210,7 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter)
zval *object = &iter->it.data;
zend_user_it_invalidate_current(_iter);
- zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_next, "next", NULL);
+ zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_next, "next", NULL);
}
/* }}} */
@@ -220,11 +221,11 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
zval *object = &iter->it.data;
zend_user_it_invalidate_current(_iter);
- zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_rewind, "rewind", NULL);
+ zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_rewind, "rewind", NULL);
}
/* }}} */
-zend_object_iterator_funcs zend_interface_iterator_funcs_iterator = {
+static const zend_object_iterator_funcs zend_interface_iterator_funcs_iterator = {
zend_user_it_dtor,
zend_user_it_valid,
zend_user_it_get_current_data,
@@ -249,7 +250,7 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
zend_iterator_init((zend_object_iterator*)iterator);
ZVAL_COPY(&iterator->it.data, object);
- iterator->it.funcs = ce->iterator_funcs.funcs;
+ iterator->it.funcs = &zend_interface_iterator_funcs_iterator;
iterator->ce = Z_OBJCE_P(object);
ZVAL_UNDEF(&iterator->value);
return (zend_object_iterator*)iterator;
@@ -334,8 +335,18 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
}
}
}
- class_type->iterator_funcs.zf_new_iterator = NULL;
class_type->get_iterator = zend_user_it_get_new_iterator;
+ if (class_type->iterator_funcs_ptr != NULL) {
+ class_type->iterator_funcs_ptr->zf_new_iterator = NULL;
+ } else if (class_type->type == ZEND_INTERNAL_CLASS) {
+ class_type->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
+ } else {
+ class_type->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
+ memset(class_type->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
+ }
+ if (class_type->type == ZEND_INTERNAL_CLASS) {
+ class_type->iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&class_type->function_table, "getiterator", sizeof("getiterator") - 1);
+ }
return SUCCESS;
}
/* }}} */
@@ -359,13 +370,24 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
}
}
class_type->get_iterator = zend_user_it_get_iterator;
- class_type->iterator_funcs.zf_valid = NULL;
- class_type->iterator_funcs.zf_current = NULL;
- class_type->iterator_funcs.zf_key = NULL;
- class_type->iterator_funcs.zf_next = NULL;
- class_type->iterator_funcs.zf_rewind = NULL;
- if (!class_type->iterator_funcs.funcs) {
- class_type->iterator_funcs.funcs = &zend_interface_iterator_funcs_iterator;
+ if (class_type->iterator_funcs_ptr != NULL) {
+ class_type->iterator_funcs_ptr->zf_valid = NULL;
+ class_type->iterator_funcs_ptr->zf_current = NULL;
+ class_type->iterator_funcs_ptr->zf_key = NULL;
+ class_type->iterator_funcs_ptr->zf_next = NULL;
+ class_type->iterator_funcs_ptr->zf_rewind = NULL;
+ } else if (class_type->type == ZEND_INTERNAL_CLASS) {
+ class_type->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
+ } else {
+ class_type->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
+ memset(class_type->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
+ }
+ if (class_type->type == ZEND_INTERNAL_CLASS) {
+ class_type->iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&class_type->function_table, "rewind", sizeof("rewind") - 1);
+ class_type->iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&class_type->function_table, "valid", sizeof("valid") - 1);
+ class_type->iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&class_type->function_table, "key", sizeof("key") - 1);
+ class_type->iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&class_type->function_table, "current", sizeof("current") - 1);
+ class_type->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&class_type->function_table, "next", sizeof("next") - 1);
}
return SUCCESS;
}
@@ -479,12 +501,12 @@ static int zend_implement_countable(zend_class_entry *interface, zend_class_entr
/* }}}*/
/* {{{ function tables */
-const zend_function_entry zend_funcs_aggregate[] = {
+static const zend_function_entry zend_funcs_aggregate[] = {
ZEND_ABSTRACT_ME(iterator, getIterator, NULL)
ZEND_FE_END
};
-const zend_function_entry zend_funcs_iterator[] = {
+static const zend_function_entry zend_funcs_iterator[] = {
ZEND_ABSTRACT_ME(iterator, current, NULL)
ZEND_ABSTRACT_ME(iterator, next, NULL)
ZEND_ABSTRACT_ME(iterator, key, NULL)
@@ -493,7 +515,7 @@ const zend_function_entry zend_funcs_iterator[] = {
ZEND_FE_END
};
-const zend_function_entry *zend_funcs_traversable = NULL;
+static const zend_function_entry *zend_funcs_traversable = NULL;
ZEND_BEGIN_ARG_INFO_EX(arginfo_arrayaccess_offset, 0, 0, 1)
ZEND_ARG_INFO(0, offset)
@@ -508,7 +530,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_arrayaccess_offset_value, 0, 0, 2)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
-const zend_function_entry zend_funcs_arrayaccess[] = {
+static const zend_function_entry zend_funcs_arrayaccess[] = {
ZEND_ABSTRACT_ME(arrayaccess, offsetExists, arginfo_arrayaccess_offset)
ZEND_ABSTRACT_ME(arrayaccess, offsetGet, arginfo_arrayaccess_offset_get)
ZEND_ABSTRACT_ME(arrayaccess, offsetSet, arginfo_arrayaccess_offset_value)
@@ -520,7 +542,7 @@ ZEND_BEGIN_ARG_INFO(arginfo_serializable_serialize, 0)
ZEND_ARG_INFO(0, serialized)
ZEND_END_ARG_INFO()
-const zend_function_entry zend_funcs_serializable[] = {
+static const zend_function_entry zend_funcs_serializable[] = {
ZEND_ABSTRACT_ME(serializable, serialize, NULL)
ZEND_FENTRY(unserialize, NULL, arginfo_serializable_serialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT|ZEND_ACC_CTOR)
ZEND_FE_END
@@ -529,7 +551,7 @@ const zend_function_entry zend_funcs_serializable[] = {
ZEND_BEGIN_ARG_INFO(arginfo_countable_count, 0)
ZEND_END_ARG_INFO()
-const zend_function_entry zend_funcs_countable[] = {
+static const zend_function_entry zend_funcs_countable[] = {
ZEND_ABSTRACT_ME(Countable, count, arginfo_countable_count)
ZEND_FE_END
};
diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h
index 2784e1d813..52a8396dd0 100644
--- a/Zend/zend_interfaces.h
+++ b/Zend/zend_interfaces.h
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_INTERFACES_H
#define ZEND_INTERFACES_H
diff --git a/Zend/zend_istdiostream.h b/Zend/zend_istdiostream.h
index c7e025c274..e814539e67 100644
--- a/Zend/zend_istdiostream.h
+++ b/Zend/zend_istdiostream.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef _ZEND_STDIOSTREAM
#define _ZEND_STDIOSTREAM
diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c
index e79764fb9e..81606ef6eb 100644
--- a/Zend/zend_iterators.c
+++ b/Zend/zend_iterators.c
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_API.h"
@@ -27,7 +25,7 @@ static zend_class_entry zend_iterator_class_entry;
static void iter_wrapper_free(zend_object *object);
static void iter_wrapper_dtor(zend_object *object);
-static zend_object_handlers iterator_object_handlers = {
+static const zend_object_handlers iterator_object_handlers = {
0,
iter_wrapper_free,
iter_wrapper_dtor,
@@ -81,7 +79,7 @@ ZEND_API void zend_iterator_init(zend_object_iterator *iter)
ZEND_API void zend_iterator_dtor(zend_object_iterator *iter)
{
- if (--GC_REFCOUNT(&iter->std) > 0) {
+ if (GC_DELREF(&iter->std) > 0) {
return;
}
diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h
index f740666b34..15c828abd1 100644
--- a/Zend/zend_iterators.h
+++ b/Zend/zend_iterators.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/* These iterators were designed to operate within the foreach()
* structures provided by the engine, but could be extended for use
* with other iterative engine opcodes.
@@ -57,12 +55,11 @@ typedef struct _zend_object_iterator_funcs {
struct _zend_object_iterator {
zend_object std;
zval data;
- zend_object_iterator_funcs *funcs;
+ const zend_object_iterator_funcs *funcs;
zend_ulong index; /* private to fe_reset/fe_fetch opcodes */
};
typedef struct _zend_class_iterator_funcs {
- zend_object_iterator_funcs *funcs;
union _zend_function *zf_new_iterator;
union _zend_function *zf_valid;
union _zend_function *zf_current;
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 7838c4a64d..95823ae750 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -13,14 +13,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
| Nikita Popov <nikic@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend_compile.h"
#include "zend.h"
#include "zend_list.h"
@@ -28,6 +26,7 @@
#include "zend_API.h"
#include "zend_constants.h"
#include "zend_language_scanner.h"
+#include "zend_exceptions.h"
#define YYSIZE_T size_t
#define yytnamerr zend_yytnamerr
@@ -50,7 +49,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
}
%destructor { zend_ast_destroy($$); } <ast>
-%destructor { if ($$) zend_string_release($$); } <str>
+%destructor { if ($$) zend_string_release_ex($$, 0); } <str>
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
%left ','
@@ -233,7 +232,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%type <ast> unprefixed_use_declarations const_decl inner_statement
%type <ast> expr optional_expr while_statement for_statement foreach_variable
%type <ast> foreach_statement declare_statement finally_statement unset_variable variable
-%type <ast> extends_from parameter optional_type argument expr_without_variable global_var
+%type <ast> extends_from parameter optional_type argument global_var
%type <ast> static_var class_statement trait_adaptation trait_precedence trait_alias
%type <ast> absolute_trait_method_reference trait_method_reference property echo_expr
%type <ast> new_expr anonymous_class class_name class_name_reference simple_variable
@@ -414,8 +413,8 @@ inner_statement:
| trait_declaration_statement { $$ = $1; }
| interface_declaration_statement { $$ = $1; }
| T_HALT_COMPILER '(' ')' ';'
- { $$ = NULL; zend_error_noreturn(E_COMPILE_ERROR,
- "__HALT_COMPILER() can only be used from the outermost scope"); }
+ { $$ = NULL; zend_throw_exception(zend_ce_compile_error,
+ "__HALT_COMPILER() can only be used from the outermost scope", 0); YYERROR; }
;
@@ -439,14 +438,14 @@ statement:
| T_ECHO echo_expr_list ';' { $$ = $2; }
| T_INLINE_HTML { $$ = zend_ast_create(ZEND_AST_ECHO, $1); }
| expr ';' { $$ = $1; }
- | T_UNSET '(' unset_variables ')' ';' { $$ = $3; }
+ | T_UNSET '(' unset_variables possible_comma ')' ';' { $$ = $3; }
| T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
{ $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); }
| T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')'
foreach_statement
{ $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $7, $5, $9); }
| T_DECLARE '(' const_list ')'
- { zend_handle_encoding_declaration($3); }
+ { if (!zend_handle_encoding_declaration($3)) { YYERROR; } }
declare_statement
{ $$ = zend_ast_create(ZEND_AST_DECLARE, $3, $6); }
| ';' /* empty statement */ { $$ = NULL; }
@@ -511,7 +510,8 @@ class_declaration_statement:
class_modifiers:
class_modifier { $$ = $1; }
- | class_modifiers class_modifier { $$ = zend_add_class_modifier($1, $2); }
+ | class_modifiers class_modifier
+ { $$ = zend_add_class_modifier($1, $2); if (!$$) { YYERROR; } }
;
class_modifier:
@@ -670,7 +670,7 @@ return_type:
argument_list:
'(' ')' { $$ = zend_ast_create_list(0, ZEND_AST_ARG_LIST); }
- | '(' non_empty_argument_list ')' { $$ = $2; }
+ | '(' non_empty_argument_list possible_comma ')' { $$ = $2; }
;
non_empty_argument_list:
@@ -758,9 +758,9 @@ trait_precedence:
trait_alias:
trait_method_reference T_AS T_STRING
- { $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, 0, $1, $3); }
+ { $$ = zend_ast_create(ZEND_AST_TRAIT_ALIAS, $1, $3); }
| trait_method_reference T_AS reserved_non_modifiers
- { zval zv; zend_lex_tstring(&zv); $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, 0, $1, zend_ast_create_zval(&zv)); }
+ { zval zv; zend_lex_tstring(&zv); $$ = zend_ast_create(ZEND_AST_TRAIT_ALIAS, $1, zend_ast_create_zval(&zv)); }
| trait_method_reference T_AS member_modifier identifier
{ $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, $3, $1, $4); }
| trait_method_reference T_AS member_modifier
@@ -797,7 +797,7 @@ method_modifiers:
non_empty_member_modifiers:
member_modifier { $$ = $1; }
| non_empty_member_modifiers member_modifier
- { $$ = zend_add_member_modifier($1, $2); }
+ { $$ = zend_add_member_modifier($1, $2); if (!$$) { YYERROR; } }
;
member_modifier:
@@ -869,8 +869,10 @@ new_expr:
{ $$ = $2; }
;
-expr_without_variable:
- T_LIST '(' array_pair_list ')' '=' expr
+expr:
+ variable
+ { $$ = $1; }
+ | T_LIST '(' array_pair_list ')' '=' expr
{ $3->attr = ZEND_ARRAY_SYNTAX_LIST; $$ = zend_ast_create(ZEND_AST_ASSIGN, $3, $6); }
| '[' array_pair_list ']' '=' expr
{ $2->attr = ZEND_ARRAY_SYNTAX_SHORT; $$ = zend_ast_create(ZEND_AST_ASSIGN, $2, $5); }
@@ -1019,7 +1021,7 @@ lexical_var_list:
lexical_var:
T_VARIABLE { $$ = $1; }
- | '&' T_VARIABLE { $$ = $2; $$->attr = 1; }
+ | '&' T_VARIABLE { $$ = $2; $$->attr = ZEND_BIND_REF; }
;
function_call:
@@ -1098,11 +1100,6 @@ constant:
{ $$ = zend_ast_create(ZEND_AST_CLASS_CONST, $1, $3); }
;
-expr:
- variable { $$ = $1; }
- | expr_without_variable { $$ = $1; }
-;
-
optional_expr:
/* empty */ { $$ = NULL; }
| expr { $$ = $1; }
@@ -1260,7 +1257,7 @@ encaps_var_offset:
internal_functions_in_yacc:
- T_ISSET '(' isset_variables ')' { $$ = $3; }
+ T_ISSET '(' isset_variables possible_comma ')' { $$ = $3; }
| T_EMPTY '(' expr ')' { $$ = zend_ast_create(ZEND_AST_EMPTY, $3); }
| T_INCLUDE expr
{ $$ = zend_ast_create_ex(ZEND_AST_INCLUDE_OR_EVAL, ZEND_INCLUDE, $2); }
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index d6543fadd2..39b02f0e42 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.0.1 */
+/* Generated by re2c 1.1.1 */
#line 1 "Zend/zend_language_scanner.l"
/*
+----------------------------------------------------------------------+
@@ -18,13 +18,11 @@
| Nuno Lopes <nlopess@php.net> |
| Scott MacVicar <scottmac@php.net> |
| Flex version authors: |
- | Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#if 0
# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
#else
@@ -120,6 +118,7 @@ do { \
#define GET_DOUBLE_QUOTES_SCANNED_LENGTH() SCNG(scanned_string_len)
#define IS_LABEL_START(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || (c) == '_' || (c) >= 0x80)
+#define IS_LABEL_SUCCESSOR(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9') || (c) == '_' || (c) >= 0x80)
#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7')
#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F'))
@@ -184,6 +183,7 @@ void startup_scanner(void)
CG(extra_fn_flags) = 0;
zend_stack_init(&SCNG(state_stack), sizeof(int));
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
}
static void heredoc_label_dtor(zend_heredoc_label *heredoc_label) {
@@ -197,6 +197,7 @@ void shutdown_scanner(void)
zend_stack_destroy(&SCNG(state_stack));
zend_ptr_stack_clean(&SCNG(heredoc_label_stack), (void (*)(void *)) &heredoc_label_dtor, 1);
zend_ptr_stack_destroy(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
SCNG(on_event) = NULL;
}
@@ -561,7 +562,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
}
zend_set_compiled_filename(compiled_filename);
- zend_string_release(compiled_filename);
+ zend_string_release_ex(compiled_filename, 0);
if (CG(start_lineno)) {
CG(zend_lineno) = CG(start_lineno);
@@ -651,9 +652,7 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_string *opened_path = NULL;
if (Z_TYPE_P(filename) != IS_STRING) {
- tmp = *filename;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
+ ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
file_handle.filename = Z_STRVAL_P(filename);
@@ -671,13 +670,13 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path);
if (opened_path) {
- zend_string_release(opened_path);
+ zend_string_release_ex(opened_path, 0);
}
}
zend_destroy_file_handle(&file_handle);
- if (filename==&tmp) {
- zval_dtor(&tmp);
+ if (UNEXPECTED(filename == &tmp)) {
+ zval_ptr_dtor(&tmp);
}
return retval;
}
@@ -721,7 +720,7 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename)
new_compiled_filename = zend_string_init(filename, strlen(filename), 0);
zend_set_compiled_filename(new_compiled_filename);
- zend_string_release(new_compiled_filename);
+ zend_string_release_ex(new_compiled_filename, 0);
CG(zend_lineno) = 1;
CG(increment_lineno) = 0;
RESET_DOC_COMMENT();
@@ -756,22 +755,25 @@ zend_op_array *compile_string(zval *source_string, char *filename)
zend_op_array *op_array = NULL;
zval tmp;
- if (Z_STRLEN_P(source_string)==0) {
- return NULL;
+ if (UNEXPECTED(Z_TYPE_P(source_string) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(source_string));
+ } else {
+ ZVAL_COPY(&tmp, source_string);
}
- ZVAL_DUP(&tmp, source_string);
- convert_to_string(&tmp);
- source_string = &tmp;
+ if (Z_STRLEN(tmp)==0) {
+ zval_ptr_dtor(&tmp);
+ return NULL;
+ }
zend_save_lexical_state(&original_lex_state);
- if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) {
+ if (zend_prepare_string_for_scanning(&tmp, filename) == SUCCESS) {
BEGIN(ST_IN_SCRIPTING);
op_array = zend_compile(ZEND_EVAL_CODE);
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(&tmp);
+ zval_ptr_dtor(&tmp);
return op_array;
}
@@ -806,13 +808,18 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name)
{
zend_lex_state original_lex_state;
- zval tmp = *str;
+ zval tmp;
- str = &tmp;
- zval_copy_ctor(str);
+ if (UNEXPECTED(Z_TYPE_P(str) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(str));
+ str = &tmp;
+ }
zend_save_lexical_state(&original_lex_state);
if (zend_prepare_string_for_scanning(str, str_name)==FAILURE) {
zend_restore_lexical_state(&original_lex_state);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return FAILURE;
}
BEGIN(INITIAL);
@@ -822,7 +829,9 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
SCNG(script_filtered) = NULL;
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(str);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return SUCCESS;
}
@@ -869,6 +878,8 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); \
ZVAL_STRINGL(zendlval, s, sz); \
efree(s); \
+ } else if (yyleng == 1) { \
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext))); \
} else { \
ZVAL_STRINGL(zendlval, yytext, yyleng); \
}
@@ -878,11 +889,38 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
register char *s, *t;
char *end;
+ if (len <= 1) {
+ if (len < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*str;
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
+
ZVAL_STRINGL(zendlval, str, len);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
@@ -894,23 +932,18 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
switch(*s) {
case 'n':
*t++ = '\n';
- Z_STRLEN_P(zendlval)--;
break;
case 'r':
*t++ = '\r';
- Z_STRLEN_P(zendlval)--;
break;
case 't':
*t++ = '\t';
- Z_STRLEN_P(zendlval)--;
break;
case 'f':
*t++ = '\f';
- Z_STRLEN_P(zendlval)--;
break;
case 'v':
*t++ = '\v';
- Z_STRLEN_P(zendlval)--;
break;
case 'e':
#ifdef ZEND_WIN32
@@ -918,7 +951,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
#else
*t++ = '\e';
#endif
- Z_STRLEN_P(zendlval)--;
break;
case '"':
case '`':
@@ -930,20 +962,15 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
case '\\':
case '$':
*t++ = *s;
- Z_STRLEN_P(zendlval)--;
break;
case 'x':
case 'X':
if (ZEND_IS_HEX(*(s+1))) {
char hex_buf[3] = { 0, 0, 0 };
- Z_STRLEN_P(zendlval)--; /* for the 'x' */
-
hex_buf[0] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_HEX(*(s+1))) {
hex_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
*t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
} else {
@@ -959,7 +986,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
size_t len = 0;
zend_bool valid = 1;
unsigned long codepoint;
- size_t byte_len = 0;
if (*start != '{') {
/* we silently let this pass to avoid breaking code
@@ -1015,27 +1041,20 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
/* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
if (codepoint < 0x80) {
- byte_len = 1;
*t++ = codepoint;
} else if (codepoint <= 0x7FF) {
- byte_len = 2;
*t++ = (codepoint >> 6) + 0xC0;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0xFFFF) {
- byte_len = 3;
*t++ = (codepoint >> 12) + 0xE0;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0x10FFFF) {
- byte_len = 4;
*t++ = (codepoint >> 18) + 0xF0;
*t++ = ((codepoint >> 12) & 0x3F) + 0x80;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
}
-
- Z_STRLEN_P(zendlval) -= 2; /* \u */
- Z_STRLEN_P(zendlval) -= (len - byte_len);
}
break;
default:
@@ -1044,13 +1063,10 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
char octal_buf[4] = { 0, 0, 0, 0 };
octal_buf[0] = *s;
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[2] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
}
if (octal_buf[2] &&
@@ -1076,6 +1092,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
unsigned char *str;
@@ -1089,27 +1108,145 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
return SUCCESS;
}
-static zend_always_inline int emit_token(int token, int token_line)
+#define HEREDOC_USING_SPACES 1
+#define HEREDOC_USING_TABS 2
+
+static const char *next_newline(const char *str, const char *end, size_t *newline_len) {
+ for (; str < end; str++) {
+ if (*str == '\r') {
+ *newline_len = str + 1 < end && *(str + 1) == '\n' ? 2 : 1;
+ } else if (*str == '\n') {
+ *newline_len = 1;
+ return str;
+ }
+ }
+ *newline_len = 0;
+ return NULL;
+}
+
+static zend_bool strip_multiline_string_indentation(
+ zval *zendlval, int indentation, zend_bool using_spaces,
+ zend_bool newline_at_start, zend_bool newline_at_end)
{
- if (SCNG(on_event)) {
- SCNG(on_event)(ON_TOKEN, token, token_line, SCNG(on_event_context));
+ const char *str = Z_STRVAL_P(zendlval), *end = str + Z_STRLEN_P(zendlval);
+ char *copy = Z_STRVAL_P(zendlval);
+
+ int newline_count = 0;
+ size_t newline_len;
+ const char *nl;
+
+ if (!newline_at_start) {
+ nl = next_newline(str, end, &newline_len);
+ if (!nl) {
+ return 1;
+ }
+
+ str = nl + newline_len;
+ copy = (char *) nl + newline_len;
+ newline_count++;
+ } else {
+ nl = str;
}
- return token;
-}
+ /* <= intentional */
+ while (str <= end && nl) {
+ size_t skip;
+ nl = next_newline(str, end, &newline_len);
+ if (!nl && newline_at_end) {
+ nl = end;
+ }
-#define RETURN_TOKEN(token) return emit_token(token, start_line);
+ /* Try to skip indentation */
+ for (skip = 0; skip < indentation; skip++, str++) {
+ if (str == nl) {
+ /* Don't require full indentation on whitespace-only lines */
+ break;
+ }
+
+ if (str == end || (*str != ' ' && *str != '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception_ex(zend_ce_parse_error, 0,
+ "Invalid body indentation level (expecting an indentation level of at least %d)", indentation);
+ goto error;
+ }
-int lex_scan(zval *zendlval)
+ if ((!using_spaces && *str == ' ') || (using_spaces && *str == '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception(zend_ce_parse_error,
+ "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ goto error;
+ }
+ }
+
+ if (str == end) {
+ break;
+ }
+
+ size_t len = nl ? (nl - str + newline_len) : (end - str);
+ memmove(copy, str, len);
+ str += len;
+ copy += len;
+ newline_count++;
+ }
+
+ *copy = '\0';
+ Z_STRLEN_P(zendlval) = copy - Z_STRVAL_P(zendlval);
+ return 1;
+
+error:
+ zval_ptr_dtor_str(zendlval);
+ ZVAL_UNDEF(zendlval);
+
+ return 0;
+}
+
+static void copy_heredoc_label_stack(void *void_heredoc_label)
{
+ zend_heredoc_label *heredoc_label = void_heredoc_label;
+ zend_heredoc_label *new_heredoc_label = emalloc(sizeof(zend_heredoc_label));
+
+ *new_heredoc_label = *heredoc_label;
+ new_heredoc_label->label = estrndup(heredoc_label->label, heredoc_label->length);
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) new_heredoc_label);
+}
+
+#define PARSER_MODE() \
+ EXPECTED(elem != NULL)
+
+#define RETURN_TOKEN(_token) do { \
+ token = _token; \
+ goto emit_token; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_VAL(_token) do { \
+ token = _token; \
+ goto emit_token_with_val; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_STR(_token, _offset) do { \
+ token = _token; \
+ offset = _offset; \
+ goto emit_token_with_str; \
+ } while (0)
+
+#define SKIP_TOKEN(_token) do { \
+ token = _token; \
+ goto skip_token; \
+ } while (0)
+
+int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem)
+{
+int token;
+int offset;
int start_line = CG(zend_lineno);
+ ZVAL_UNDEF(zendlval);
restart:
SCNG(yy_text) = YYCURSOR;
-#line 1113 "Zend/zend_language_scanner.c"
+#line 1250 "Zend/zend_language_scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
@@ -1317,7 +1454,7 @@ yy3:
++YYCURSOR;
YYDEBUG(4, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2390 "Zend/zend_language_scanner.l"
+#line 2750 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -1326,7 +1463,7 @@ yy3:
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
goto restart;
}
-#line 1330 "Zend/zend_language_scanner.c"
+#line 1467 "Zend/zend_language_scanner.c"
yy5:
YYDEBUG(5, *YYCURSOR);
++YYCURSOR;
@@ -1338,12 +1475,11 @@ yy5:
}
YYDEBUG(7, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1292 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
{
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_WHITESPACE);
+ goto return_whitespace;
}
-#line 1347 "Zend/zend_language_scanner.c"
+#line 1483 "Zend/zend_language_scanner.c"
yy8:
YYDEBUG(8, *YYCURSOR);
yych = *++YYCURSOR;
@@ -1351,17 +1487,17 @@ yy8:
yy9:
YYDEBUG(9, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1577 "Zend/zend_language_scanner.l"
+#line 1712 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(yytext[0]);
}
-#line 1359 "Zend/zend_language_scanner.c"
+#line 1495 "Zend/zend_language_scanner.c"
yy10:
YYDEBUG(10, *YYCURSOR);
++YYCURSOR;
YYDEBUG(11, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2038 "Zend/zend_language_scanner.l"
+#line 2224 "Zend/zend_language_scanner.l"
{
int bprefix = (yytext[0] != '"') ? 1 : 0;
@@ -1369,8 +1505,12 @@ yy10:
switch (*YYCURSOR++) {
case '"':
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"');
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
case '$':
if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
break;
@@ -1402,13 +1542,13 @@ yy10:
BEGIN(ST_DOUBLE_QUOTES);
RETURN_TOKEN('"');
}
-#line 1406 "Zend/zend_language_scanner.c"
+#line 1546 "Zend/zend_language_scanner.c"
yy12:
YYDEBUG(12, *YYCURSOR);
++YYCURSOR;
YYDEBUG(13, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1898 "Zend/zend_language_scanner.l"
+#line 2051 "Zend/zend_language_scanner.l"
{
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
@@ -1435,9 +1575,12 @@ yy12:
yyleng = YYCURSOR - SCNG(yy_text);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
-#line 1441 "Zend/zend_language_scanner.c"
+#line 1584 "Zend/zend_language_scanner.c"
yy14:
YYDEBUG(14, *YYCURSOR);
yych = *++YYCURSOR;
@@ -1468,7 +1611,7 @@ yy17:
++YYCURSOR;
YYDEBUG(18, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1969 "Zend/zend_language_scanner.l"
+#line 2134 "Zend/zend_language_scanner.l"
{
register char *s, *t;
char *end;
@@ -1491,41 +1634,62 @@ yy17:
* for ' (unrecognized by parser), instead of old flex fallback to "Unexpected character..."
* rule, which continued in ST_IN_SCRIPTING state after the quote */
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
}
+ if (yyleng-bprefix-2 <= 1) {
+ if (yyleng-bprefix-2 < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*(yytext+bprefix+1);
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
-
- switch(*s) {
- case '\\':
- case '\'':
- *t++ = *s;
- Z_STRLEN_P(zendlval)--;
- break;
- default:
- *t++ = '\\';
- *t++ = *s;
- break;
+ if (*s == '\\' || *s == '\'') {
+ *t++ = *s;
+ } else {
+ *t++ = '\\';
+ *t++ = *s;
}
} else {
*t++ = *s;
}
-
if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
CG(zend_lineno)++;
}
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
char *str = NULL;
@@ -1534,9 +1698,9 @@ yy17:
SCNG(output_filter)((unsigned char **)&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
ZVAL_STRINGL(zendlval, str, sz);
}
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
}
-#line 1540 "Zend/zend_language_scanner.c"
+#line 1704 "Zend/zend_language_scanner.c"
yy19:
YYDEBUG(19, *YYCURSOR);
yyaccept = 0;
@@ -1660,7 +1824,7 @@ yy26:
yy27:
YYDEBUG(27, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1647 "Zend/zend_language_scanner.l"
+#line 1781 "Zend/zend_language_scanner.l"
{
char *end;
if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
@@ -1673,7 +1837,10 @@ yy27:
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_LNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
} else {
errno = 0;
@@ -1690,21 +1857,26 @@ yy27:
zend_throw_exception(zend_ce_parse_error,
"Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
}
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
/* Also not an assert for the same reason */
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
ZEND_ASSERT(!errno);
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
-#line 1708 "Zend/zend_language_scanner.c"
+#line 1880 "Zend/zend_language_scanner.c"
yy28:
YYDEBUG(28, *YYCURSOR);
yyaccept = 1;
@@ -1786,12 +1958,11 @@ yy35:
yy36:
YYDEBUG(36, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1892 "Zend/zend_language_scanner.l"
+#line 2046 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 1795 "Zend/zend_language_scanner.c"
+#line 1966 "Zend/zend_language_scanner.c"
yy37:
YYDEBUG(37, *YYCURSOR);
yyaccept = 2;
@@ -2076,11 +2247,11 @@ yy58:
++YYCURSOR;
YYDEBUG(59, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1317 "Zend/zend_language_scanner.l"
+#line 1452 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NS_SEPARATOR);
}
-#line 2084 "Zend/zend_language_scanner.c"
+#line 2255 "Zend/zend_language_scanner.c"
yy60:
YYDEBUG(60, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2096,23 +2267,23 @@ yy62:
++YYCURSOR;
YYDEBUG(63, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2128 "Zend/zend_language_scanner.l"
+#line 2403 "Zend/zend_language_scanner.l"
{
BEGIN(ST_BACKQUOTE);
RETURN_TOKEN('`');
}
-#line 2105 "Zend/zend_language_scanner.c"
+#line 2276 "Zend/zend_language_scanner.c"
yy64:
YYDEBUG(64, *YYCURSOR);
++YYCURSOR;
YYDEBUG(65, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1582 "Zend/zend_language_scanner.l"
+#line 1717 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_IN_SCRIPTING);
RETURN_TOKEN('{');
}
-#line 2116 "Zend/zend_language_scanner.c"
+#line 2287 "Zend/zend_language_scanner.c"
yy66:
YYDEBUG(66, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2124,7 +2295,7 @@ yy67:
++YYCURSOR;
YYDEBUG(68, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1594 "Zend/zend_language_scanner.l"
+#line 1729 "Zend/zend_language_scanner.l"
{
RESET_DOC_COMMENT();
if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -2132,7 +2303,7 @@ yy67:
}
RETURN_TOKEN('}');
}
-#line 2136 "Zend/zend_language_scanner.c"
+#line 2307 "Zend/zend_language_scanner.c"
yy69:
YYDEBUG(69, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2140,11 +2311,11 @@ yy69:
yy70:
YYDEBUG(70, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1481 "Zend/zend_language_scanner.l"
+#line 1616 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_NOT_EQUAL);
}
-#line 2148 "Zend/zend_language_scanner.c"
+#line 2319 "Zend/zend_language_scanner.c"
yy71:
YYDEBUG(71, *YYCURSOR);
++YYCURSOR;
@@ -2169,42 +2340,41 @@ yy71:
yy73:
YYDEBUG(73, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 2178 "Zend/zend_language_scanner.c"
+#line 2348 "Zend/zend_language_scanner.c"
yy74:
YYDEBUG(74, *YYCURSOR);
++YYCURSOR;
YYDEBUG(75, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1525 "Zend/zend_language_scanner.l"
+#line 1660 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MOD_EQUAL);
}
-#line 2188 "Zend/zend_language_scanner.c"
+#line 2358 "Zend/zend_language_scanner.c"
yy76:
YYDEBUG(76, *YYCURSOR);
++YYCURSOR;
YYDEBUG(77, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1553 "Zend/zend_language_scanner.l"
+#line 1688 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOLEAN_AND);
}
-#line 2198 "Zend/zend_language_scanner.c"
+#line 2368 "Zend/zend_language_scanner.c"
yy78:
YYDEBUG(78, *YYCURSOR);
++YYCURSOR;
YYDEBUG(79, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1537 "Zend/zend_language_scanner.l"
+#line 1672 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_AND_EQUAL);
}
-#line 2208 "Zend/zend_language_scanner.c"
+#line 2378 "Zend/zend_language_scanner.c"
yy80:
YYDEBUG(80, *YYCURSOR);
++YYCURSOR;
@@ -2334,72 +2504,72 @@ yy92:
if (yych == '=') goto yy205;
YYDEBUG(93, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1509 "Zend/zend_language_scanner.l"
+#line 1644 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_POW);
}
-#line 2342 "Zend/zend_language_scanner.c"
+#line 2512 "Zend/zend_language_scanner.c"
yy94:
YYDEBUG(94, *YYCURSOR);
++YYCURSOR;
YYDEBUG(95, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1505 "Zend/zend_language_scanner.l"
+#line 1640 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MUL_EQUAL);
}
-#line 2352 "Zend/zend_language_scanner.c"
+#line 2522 "Zend/zend_language_scanner.c"
yy96:
YYDEBUG(96, *YYCURSOR);
++YYCURSOR;
YYDEBUG(97, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1461 "Zend/zend_language_scanner.l"
+#line 1596 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INC);
}
-#line 2362 "Zend/zend_language_scanner.c"
+#line 2532 "Zend/zend_language_scanner.c"
yy98:
YYDEBUG(98, *YYCURSOR);
++YYCURSOR;
YYDEBUG(99, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1497 "Zend/zend_language_scanner.l"
+#line 1632 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PLUS_EQUAL);
}
-#line 2372 "Zend/zend_language_scanner.c"
+#line 2542 "Zend/zend_language_scanner.c"
yy100:
YYDEBUG(100, *YYCURSOR);
++YYCURSOR;
YYDEBUG(101, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1465 "Zend/zend_language_scanner.l"
+#line 1600 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DEC);
}
-#line 2382 "Zend/zend_language_scanner.c"
+#line 2552 "Zend/zend_language_scanner.c"
yy102:
YYDEBUG(102, *YYCURSOR);
++YYCURSOR;
YYDEBUG(103, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1501 "Zend/zend_language_scanner.l"
+#line 1636 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MINUS_EQUAL);
}
-#line 2392 "Zend/zend_language_scanner.c"
+#line 2562 "Zend/zend_language_scanner.c"
yy104:
YYDEBUG(104, *YYCURSOR);
++YYCURSOR;
YYDEBUG(105, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1287 "Zend/zend_language_scanner.l"
+#line 1424 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_PROPERTY);
RETURN_TOKEN(T_OBJECT_OPERATOR);
}
-#line 2403 "Zend/zend_language_scanner.c"
+#line 2573 "Zend/zend_language_scanner.c"
yy106:
YYDEBUG(106, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2422,26 +2592,26 @@ yy107:
yy109:
YYDEBUG(109, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1740 "Zend/zend_language_scanner.l"
+#line 1886 "Zend/zend_language_scanner.l"
{
const char *end;
ZVAL_DOUBLE(zendlval, zend_strtod(yytext, &end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
-#line 2435 "Zend/zend_language_scanner.c"
+#line 2605 "Zend/zend_language_scanner.c"
yy110:
YYDEBUG(110, *YYCURSOR);
++YYCURSOR;
YYDEBUG(111, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1521 "Zend/zend_language_scanner.l"
+#line 1656 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONCAT_EQUAL);
}
-#line 2445 "Zend/zend_language_scanner.c"
+#line 2615 "Zend/zend_language_scanner.c"
yy112:
YYDEBUG(112, *YYCURSOR);
yyaccept = 4;
@@ -2450,7 +2620,7 @@ yy112:
yy113:
YYDEBUG(113, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1927 "Zend/zend_language_scanner.l"
+#line 2083 "Zend/zend_language_scanner.l"
{
int doc_com;
@@ -2478,22 +2648,28 @@ yy113:
if (doc_com) {
CG(doc_comment) = zend_string_init(yytext, yyleng, 0);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_DOC_COMMENT);
+ }
RETURN_TOKEN(T_DOC_COMMENT);
}
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
-#line 2487 "Zend/zend_language_scanner.c"
+#line 2663 "Zend/zend_language_scanner.c"
yy114:
YYDEBUG(114, *YYCURSOR);
++YYCURSOR;
YYDEBUG(115, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1517 "Zend/zend_language_scanner.l"
+#line 1652 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DIV_EQUAL);
}
-#line 2497 "Zend/zend_language_scanner.c"
+#line 2673 "Zend/zend_language_scanner.c"
yy116:
YYDEBUG(116, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2525,11 +2701,11 @@ yy119:
++YYCURSOR;
YYDEBUG(120, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1313 "Zend/zend_language_scanner.l"
+#line 1448 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM);
}
-#line 2533 "Zend/zend_language_scanner.c"
+#line 2709 "Zend/zend_language_scanner.c"
yy121:
YYDEBUG(121, *YYCURSOR);
yyaccept = 5;
@@ -2540,22 +2716,22 @@ yy121:
yy122:
YYDEBUG(122, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1569 "Zend/zend_language_scanner.l"
+#line 1704 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SL);
}
-#line 2548 "Zend/zend_language_scanner.c"
+#line 2724 "Zend/zend_language_scanner.c"
yy123:
YYDEBUG(123, *YYCURSOR);
yych = *++YYCURSOR;
if (yych == '>') goto yy223;
YYDEBUG(124, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1489 "Zend/zend_language_scanner.l"
+#line 1624 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL);
}
-#line 2559 "Zend/zend_language_scanner.c"
+#line 2735 "Zend/zend_language_scanner.c"
yy125:
YYDEBUG(125, *YYCURSOR);
++YYCURSOR;
@@ -2566,42 +2742,42 @@ yy126:
if (yych == '=') goto yy225;
YYDEBUG(127, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1477 "Zend/zend_language_scanner.l"
+#line 1612 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_EQUAL);
}
-#line 2574 "Zend/zend_language_scanner.c"
+#line 2750 "Zend/zend_language_scanner.c"
yy128:
YYDEBUG(128, *YYCURSOR);
++YYCURSOR;
YYDEBUG(129, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1445 "Zend/zend_language_scanner.l"
+#line 1580 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DOUBLE_ARROW);
}
-#line 2584 "Zend/zend_language_scanner.c"
+#line 2760 "Zend/zend_language_scanner.c"
yy130:
YYDEBUG(130, *YYCURSOR);
++YYCURSOR;
YYDEBUG(131, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1493 "Zend/zend_language_scanner.l"
+#line 1628 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_GREATER_OR_EQUAL);
}
-#line 2594 "Zend/zend_language_scanner.c"
+#line 2770 "Zend/zend_language_scanner.c"
yy132:
YYDEBUG(132, *YYCURSOR);
yych = *++YYCURSOR;
if (yych == '=') goto yy227;
YYDEBUG(133, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1573 "Zend/zend_language_scanner.l"
+#line 1708 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SR);
}
-#line 2605 "Zend/zend_language_scanner.c"
+#line 2781 "Zend/zend_language_scanner.c"
yy134:
YYDEBUG(134, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2610,25 +2786,28 @@ yy134:
yy135:
YYDEBUG(135, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1960 "Zend/zend_language_scanner.l"
+#line 2122 "Zend/zend_language_scanner.l"
{
BEGIN(INITIAL);
if (yytext[yyleng-1] != '>') {
CG(increment_lineno) = 1;
}
- RETURN_TOKEN(T_CLOSE_TAG); /* implicit ';' at php-end tag */
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(';'); /* implicit ';' at php-end tag */
+ }
+ RETURN_TOKEN(T_CLOSE_TAG);
}
-#line 2622 "Zend/zend_language_scanner.c"
+#line 2801 "Zend/zend_language_scanner.c"
yy136:
YYDEBUG(136, *YYCURSOR);
++YYCURSOR;
YYDEBUG(137, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1325 "Zend/zend_language_scanner.l"
+#line 1460 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_COALESCE);
}
-#line 2632 "Zend/zend_language_scanner.c"
+#line 2811 "Zend/zend_language_scanner.c"
yy138:
YYDEBUG(138, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2655,11 +2834,11 @@ yy141:
}
YYDEBUG(142, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1227 "Zend/zend_language_scanner.l"
+#line 1364 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_AS);
}
-#line 2663 "Zend/zend_language_scanner.c"
+#line 2842 "Zend/zend_language_scanner.c"
yy143:
YYDEBUG(143, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2745,11 +2924,11 @@ yy150:
}
YYDEBUG(151, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1195 "Zend/zend_language_scanner.l"
+#line 1332 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DO);
}
-#line 2753 "Zend/zend_language_scanner.c"
+#line 2932 "Zend/zend_language_scanner.c"
yy152:
YYDEBUG(152, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2834,11 +3013,11 @@ yy163:
}
YYDEBUG(164, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1171 "Zend/zend_language_scanner.l"
+#line 1308 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IF);
}
-#line 2842 "Zend/zend_language_scanner.c"
+#line 3021 "Zend/zend_language_scanner.c"
yy165:
YYDEBUG(165, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2899,11 +3078,11 @@ yy171:
}
YYDEBUG(172, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1557 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_OR);
}
-#line 2907 "Zend/zend_language_scanner.c"
+#line 3086 "Zend/zend_language_scanner.c"
yy173:
YYDEBUG(173, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3017,11 +3196,11 @@ yy186:
++YYCURSOR;
YYDEBUG(187, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1545 "Zend/zend_language_scanner.l"
+#line 1680 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_XOR_EQUAL);
}
-#line 3025 "Zend/zend_language_scanner.c"
+#line 3204 "Zend/zend_language_scanner.c"
yy188:
YYDEBUG(188, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3049,31 +3228,31 @@ yy189:
++YYCURSOR;
YYDEBUG(190, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1541 "Zend/zend_language_scanner.l"
+#line 1676 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OR_EQUAL);
}
-#line 3057 "Zend/zend_language_scanner.c"
+#line 3236 "Zend/zend_language_scanner.c"
yy191:
YYDEBUG(191, *YYCURSOR);
++YYCURSOR;
YYDEBUG(192, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1549 "Zend/zend_language_scanner.l"
+#line 1684 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOLEAN_OR);
}
-#line 3067 "Zend/zend_language_scanner.c"
+#line 3246 "Zend/zend_language_scanner.c"
yy193:
YYDEBUG(193, *YYCURSOR);
++YYCURSOR;
YYDEBUG(194, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1473 "Zend/zend_language_scanner.l"
+#line 1608 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_NOT_IDENTICAL);
}
-#line 3077 "Zend/zend_language_scanner.c"
+#line 3256 "Zend/zend_language_scanner.c"
yy195:
YYDEBUG(195, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3139,21 +3318,21 @@ yy205:
++YYCURSOR;
YYDEBUG(206, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1513 "Zend/zend_language_scanner.l"
+#line 1648 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_POW_EQUAL);
}
-#line 3147 "Zend/zend_language_scanner.c"
+#line 3326 "Zend/zend_language_scanner.c"
yy207:
YYDEBUG(207, *YYCURSOR);
++YYCURSOR;
YYDEBUG(208, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1321 "Zend/zend_language_scanner.l"
+#line 1456 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELLIPSIS);
}
-#line 3157 "Zend/zend_language_scanner.c"
+#line 3336 "Zend/zend_language_scanner.c"
yy209:
YYDEBUG(209, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3177,7 +3356,7 @@ yy210:
}
YYDEBUG(212, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1619 "Zend/zend_language_scanner.l"
+#line 1753 "Zend/zend_language_scanner.l"
{
char *bin = yytext + 2; /* Skip "0b" */
int len = yyleng - 2;
@@ -3197,15 +3376,15 @@ yy210:
ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2));
ZEND_ASSERT(!errno && end == yytext + yyleng);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
-#line 3209 "Zend/zend_language_scanner.c"
+#line 3388 "Zend/zend_language_scanner.c"
yy213:
YYDEBUG(213, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3231,7 +3410,7 @@ yy216:
}
YYDEBUG(218, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1691 "Zend/zend_language_scanner.l"
+#line 1833 "Zend/zend_language_scanner.l"
{
char *hex = yytext + 2; /* Skip "0x" */
int len = yyleng - 2;
@@ -3251,15 +3430,15 @@ yy216:
ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16));
ZEND_ASSERT(!errno && end == hex + len);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == hex + len);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
-#line 3263 "Zend/zend_language_scanner.c"
+#line 3442 "Zend/zend_language_scanner.c"
yy219:
YYDEBUG(219, *YYCURSOR);
++YYCURSOR;
@@ -3294,41 +3473,41 @@ yy221:
++YYCURSOR;
YYDEBUG(222, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1529 "Zend/zend_language_scanner.l"
+#line 1664 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SL_EQUAL);
}
-#line 3302 "Zend/zend_language_scanner.c"
+#line 3481 "Zend/zend_language_scanner.c"
yy223:
YYDEBUG(223, *YYCURSOR);
++YYCURSOR;
YYDEBUG(224, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1485 "Zend/zend_language_scanner.l"
+#line 1620 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SPACESHIP);
}
-#line 3312 "Zend/zend_language_scanner.c"
+#line 3491 "Zend/zend_language_scanner.c"
yy225:
YYDEBUG(225, *YYCURSOR);
++YYCURSOR;
YYDEBUG(226, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1604 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_IDENTICAL);
}
-#line 3322 "Zend/zend_language_scanner.c"
+#line 3501 "Zend/zend_language_scanner.c"
yy227:
YYDEBUG(227, *YYCURSOR);
++YYCURSOR;
YYDEBUG(228, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1533 "Zend/zend_language_scanner.l"
+#line 1668 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SR_EQUAL);
}
-#line 3332 "Zend/zend_language_scanner.c"
+#line 3511 "Zend/zend_language_scanner.c"
yy229:
YYDEBUG(229, *YYCURSOR);
++YYCURSOR;
@@ -3352,11 +3531,11 @@ yy232:
}
YYDEBUG(233, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1561 "Zend/zend_language_scanner.l"
+#line 1696 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_AND);
}
-#line 3360 "Zend/zend_language_scanner.c"
+#line 3539 "Zend/zend_language_scanner.c"
yy234:
YYDEBUG(234, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3437,11 +3616,11 @@ yy245:
}
YYDEBUG(246, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1129 "Zend/zend_language_scanner.l"
+#line 1266 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXIT);
}
-#line 3445 "Zend/zend_language_scanner.c"
+#line 3624 "Zend/zend_language_scanner.c"
yy247:
YYDEBUG(247, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3523,11 +3702,11 @@ yy255:
yy256:
YYDEBUG(256, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1199 "Zend/zend_language_scanner.l"
+#line 1336 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FOR);
}
-#line 3531 "Zend/zend_language_scanner.c"
+#line 3710 "Zend/zend_language_scanner.c"
yy257:
YYDEBUG(257, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3596,11 +3775,11 @@ yy267:
}
YYDEBUG(268, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1329 "Zend/zend_language_scanner.l"
+#line 1464 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NEW);
}
-#line 3604 "Zend/zend_language_scanner.c"
+#line 3783 "Zend/zend_language_scanner.c"
yy269:
YYDEBUG(269, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3673,11 +3852,11 @@ yy278:
}
YYDEBUG(279, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1155 "Zend/zend_language_scanner.l"
+#line 1292 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRY);
}
-#line 3681 "Zend/zend_language_scanner.c"
+#line 3860 "Zend/zend_language_scanner.c"
yy280:
YYDEBUG(280, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3692,11 +3871,11 @@ yy281:
}
YYDEBUG(282, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1393 "Zend/zend_language_scanner.l"
+#line 1528 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_USE);
}
-#line 3700 "Zend/zend_language_scanner.c"
+#line 3879 "Zend/zend_language_scanner.c"
yy283:
YYDEBUG(283, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3705,11 +3884,11 @@ yy283:
}
YYDEBUG(284, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1337 "Zend/zend_language_scanner.l"
+#line 1472 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_VAR);
}
-#line 3713 "Zend/zend_language_scanner.c"
+#line 3892 "Zend/zend_language_scanner.c"
yy285:
YYDEBUG(285, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3724,11 +3903,11 @@ yy286:
}
YYDEBUG(287, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1565 "Zend/zend_language_scanner.l"
+#line 1700 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_XOR);
}
-#line 3732 "Zend/zend_language_scanner.c"
+#line 3911 "Zend/zend_language_scanner.c"
yy288:
YYDEBUG(288, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3942,11 +4121,11 @@ yy317:
}
YYDEBUG(318, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1239 "Zend/zend_language_scanner.l"
+#line 1376 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CASE);
}
-#line 3950 "Zend/zend_language_scanner.c"
+#line 4129 "Zend/zend_language_scanner.c"
yy319:
YYDEBUG(319, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3997,11 +4176,11 @@ yy326:
}
YYDEBUG(327, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1259 "Zend/zend_language_scanner.l"
+#line 1396 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ECHO);
}
-#line 4005 "Zend/zend_language_scanner.c"
+#line 4184 "Zend/zend_language_scanner.c"
yy328:
YYDEBUG(328, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4025,11 +4204,11 @@ yy328:
yy329:
YYDEBUG(329, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1183 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELSE);
}
-#line 4033 "Zend/zend_language_scanner.c"
+#line 4212 "Zend/zend_language_scanner.c"
yy330:
YYDEBUG(330, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4074,11 +4253,11 @@ yy336:
}
YYDEBUG(337, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1369 "Zend/zend_language_scanner.l"
+#line 1504 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EVAL);
}
-#line 4082 "Zend/zend_language_scanner.c"
+#line 4261 "Zend/zend_language_scanner.c"
yy338:
YYDEBUG(338, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4087,11 +4266,11 @@ yy338:
}
YYDEBUG(339, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1125 "Zend/zend_language_scanner.l"
+#line 1262 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXIT);
}
-#line 4095 "Zend/zend_language_scanner.c"
+#line 4274 "Zend/zend_language_scanner.c"
yy340:
YYDEBUG(340, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4130,11 +4309,11 @@ yy345:
}
YYDEBUG(346, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1255 "Zend/zend_language_scanner.l"
+#line 1392 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_GOTO);
}
-#line 4138 "Zend/zend_language_scanner.c"
+#line 4317 "Zend/zend_language_scanner.c"
yy347:
YYDEBUG(347, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4183,11 +4362,11 @@ yy352:
}
YYDEBUG(353, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1449 "Zend/zend_language_scanner.l"
+#line 1584 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LIST);
}
-#line 4191 "Zend/zend_language_scanner.c"
+#line 4370 "Zend/zend_language_scanner.c"
yy354:
YYDEBUG(354, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4374,11 +4553,11 @@ yy383:
++YYCURSOR;
YYDEBUG(385, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1341 "Zend/zend_language_scanner.l"
+#line 1476 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INT_CAST);
}
-#line 4382 "Zend/zend_language_scanner.c"
+#line 4561 "Zend/zend_language_scanner.c"
yy386:
YYDEBUG(386, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4475,11 +4654,13 @@ yy396:
yy397:
YYDEBUG(397, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2080 "Zend/zend_language_scanner.l"
+#line 2270 "Zend/zend_language_scanner.l"
{
char *s;
- int bprefix = (yytext[0] != '<') ? 1 : 0;
+ unsigned char *saved_cursor;
+ int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0;
zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label));
+ zend_bool is_heredoc = 1;
CG(zend_lineno)++;
heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0);
@@ -4492,6 +4673,7 @@ yy397:
if (*s == '\'') {
s++;
heredoc_label->length -= 2;
+ is_heredoc = 0;
BEGIN(ST_NOWDOC);
} else {
@@ -4504,25 +4686,107 @@ yy397:
}
heredoc_label->label = estrndup(s, heredoc_label->length);
+ heredoc_label->indentation = 0;
+ saved_cursor = YYCURSOR;
+
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ YYCURSOR = saved_cursor;
+ RETURN_TOKEN(T_START_HEREDOC);
+ }
/* Check for ending label on the next line */
if (heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (!IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ }
- if (*end == ';') {
- end++;
- }
+ YYCURSOR = saved_cursor;
+ heredoc_label->indentation = indentation;
- if (*end == '\n' || *end == '\r') {
BEGIN(ST_END_HEREDOC);
+ RETURN_TOKEN(T_START_HEREDOC);
}
}
- zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+ YYCURSOR = saved_cursor;
+
+ if (is_heredoc && !SCNG(heredoc_scan_ahead)) {
+ zend_lex_state current_state;
+ int heredoc_nesting_level = 1;
+ int first_token = 0;
+
+ zend_save_lexical_state(&current_state);
+
+ SCNG(heredoc_scan_ahead) = 1;
+ SCNG(heredoc_indentation) = 0;
+ SCNG(heredoc_indentation_uses_spaces) = 0;
+ LANG_SCNG(on_event) = NULL;
+
+ zend_ptr_stack_reverse_apply(&current_state.heredoc_label_stack, copy_heredoc_label_stack);
+
+ zend_exception_save();
+ while (heredoc_nesting_level) {
+ zval zv;
+ int retval;
+
+ ZVAL_UNDEF(&zv);
+ retval = lex_scan(&zv, NULL);
+ zval_ptr_dtor_nogc(&zv);
+
+ if (EG(exception)) {
+ zend_clear_exception();
+ break;
+ }
+
+ if (!first_token) {
+ first_token = retval;
+ }
+
+ switch (retval) {
+ case T_START_HEREDOC:
+ ++heredoc_nesting_level;
+ break;
+ case T_END_HEREDOC:
+ --heredoc_nesting_level;
+ break;
+ case END:
+ heredoc_nesting_level = 0;
+ }
+ }
+ zend_exception_restore();
+
+ if (
+ (first_token == T_VARIABLE
+ || first_token == T_DOLLAR_OPEN_CURLY_BRACES
+ || first_token == T_CURLY_OPEN
+ ) && SCNG(heredoc_indentation)) {
+ zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation));
+ }
+
+ heredoc_label->indentation = SCNG(heredoc_indentation);
+ heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces);
+
+ zend_restore_lexical_state(&current_state);
+ SCNG(heredoc_scan_ahead) = 0;
+ CG(increment_lineno) = 0;
+ }
RETURN_TOKEN(T_START_HEREDOC);
}
-#line 4526 "Zend/zend_language_scanner.c"
+#line 4790 "Zend/zend_language_scanner.c"
yy398:
YYDEBUG(398, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4542,11 +4806,11 @@ yy400:
}
YYDEBUG(401, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1453 "Zend/zend_language_scanner.l"
+#line 1588 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ARRAY);
}
-#line 4550 "Zend/zend_language_scanner.c"
+#line 4814 "Zend/zend_language_scanner.c"
yy402:
YYDEBUG(402, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4555,11 +4819,11 @@ yy402:
}
YYDEBUG(403, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1247 "Zend/zend_language_scanner.l"
+#line 1384 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BREAK);
}
-#line 4563 "Zend/zend_language_scanner.c"
+#line 4827 "Zend/zend_language_scanner.c"
yy404:
YYDEBUG(404, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4574,11 +4838,11 @@ yy405:
}
YYDEBUG(406, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1159 "Zend/zend_language_scanner.l"
+#line 1296 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CATCH);
}
-#line 4582 "Zend/zend_language_scanner.c"
+#line 4846 "Zend/zend_language_scanner.c"
yy407:
YYDEBUG(407, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4587,11 +4851,11 @@ yy407:
}
YYDEBUG(408, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1267 "Zend/zend_language_scanner.l"
+#line 1404 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLASS);
}
-#line 4595 "Zend/zend_language_scanner.c"
+#line 4859 "Zend/zend_language_scanner.c"
yy409:
YYDEBUG(409, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4600,11 +4864,11 @@ yy409:
}
YYDEBUG(410, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1333 "Zend/zend_language_scanner.l"
+#line 1468 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLONE);
}
-#line 4608 "Zend/zend_language_scanner.c"
+#line 4872 "Zend/zend_language_scanner.c"
yy411:
YYDEBUG(411, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4613,11 +4877,11 @@ yy411:
}
YYDEBUG(412, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1137 "Zend/zend_language_scanner.l"
+#line 1274 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONST);
}
-#line 4621 "Zend/zend_language_scanner.c"
+#line 4885 "Zend/zend_language_scanner.c"
yy413:
YYDEBUG(413, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4650,11 +4914,11 @@ yy417:
}
YYDEBUG(418, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1409 "Zend/zend_language_scanner.l"
+#line 1544 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EMPTY);
}
-#line 4658 "Zend/zend_language_scanner.c"
+#line 4922 "Zend/zend_language_scanner.c"
yy419:
YYDEBUG(419, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4675,11 +4939,11 @@ yy421:
}
YYDEBUG(422, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1179 "Zend/zend_language_scanner.l"
+#line 1316 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDIF);
}
-#line 4683 "Zend/zend_language_scanner.c"
+#line 4947 "Zend/zend_language_scanner.c"
yy423:
YYDEBUG(423, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4721,11 +4985,11 @@ yy426:
yy427:
YYDEBUG(427, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1425 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FINAL);
}
-#line 4729 "Zend/zend_language_scanner.c"
+#line 4993 "Zend/zend_language_scanner.c"
yy428:
YYDEBUG(428, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4782,11 +5046,11 @@ yy436:
}
YYDEBUG(437, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1405 "Zend/zend_language_scanner.l"
+#line 1540 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ISSET);
}
-#line 4790 "Zend/zend_language_scanner.c"
+#line 5054 "Zend/zend_language_scanner.c"
yy438:
YYDEBUG(438, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4801,11 +5065,11 @@ yy439:
}
YYDEBUG(440, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1263 "Zend/zend_language_scanner.l"
+#line 1400 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PRINT);
}
-#line 4809 "Zend/zend_language_scanner.c"
+#line 5073 "Zend/zend_language_scanner.c"
yy441:
YYDEBUG(441, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4856,11 +5120,11 @@ yy448:
}
YYDEBUG(449, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1167 "Zend/zend_language_scanner.l"
+#line 1304 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_THROW);
}
-#line 4864 "Zend/zend_language_scanner.c"
+#line 5128 "Zend/zend_language_scanner.c"
yy450:
YYDEBUG(450, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4869,11 +5133,11 @@ yy450:
}
YYDEBUG(451, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1275 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRAIT);
}
-#line 4877 "Zend/zend_language_scanner.c"
+#line 5141 "Zend/zend_language_scanner.c"
yy452:
YYDEBUG(452, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4882,11 +5146,11 @@ yy452:
}
YYDEBUG(453, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1441 "Zend/zend_language_scanner.l"
+#line 1576 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_UNSET);
}
-#line 4890 "Zend/zend_language_scanner.c"
+#line 5154 "Zend/zend_language_scanner.c"
yy454:
YYDEBUG(454, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4895,11 +5159,11 @@ yy454:
}
YYDEBUG(455, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1187 "Zend/zend_language_scanner.l"
+#line 1324 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_WHILE);
}
-#line 4903 "Zend/zend_language_scanner.c"
+#line 5167 "Zend/zend_language_scanner.c"
yy456:
YYDEBUG(456, *YYCURSOR);
yyaccept = 6;
@@ -4917,11 +5181,11 @@ yy456:
yy457:
YYDEBUG(457, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1151 "Zend/zend_language_scanner.l"
+#line 1288 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_YIELD);
}
-#line 4925 "Zend/zend_language_scanner.c"
+#line 5189 "Zend/zend_language_scanner.c"
yy458:
YYDEBUG(458, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5013,11 +5277,11 @@ yy471:
++YYCURSOR;
YYDEBUG(473, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1361 "Zend/zend_language_scanner.l"
+#line 1496 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOL_CAST);
}
-#line 5021 "Zend/zend_language_scanner.c"
+#line 5285 "Zend/zend_language_scanner.c"
yy474:
YYDEBUG(474, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5047,11 +5311,11 @@ yy478:
++YYCURSOR;
YYDEBUG(479, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1345 "Zend/zend_language_scanner.l"
+#line 1480 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DOUBLE_CAST);
}
-#line 5055 "Zend/zend_language_scanner.c"
+#line 5319 "Zend/zend_language_scanner.c"
yy480:
YYDEBUG(480, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5116,11 +5380,11 @@ yy489:
}
YYDEBUG(490, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1175 "Zend/zend_language_scanner.l"
+#line 1312 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELSEIF);
}
-#line 5124 "Zend/zend_language_scanner.c"
+#line 5388 "Zend/zend_language_scanner.c"
yy491:
YYDEBUG(491, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5150,11 +5414,11 @@ yy492:
yy493:
YYDEBUG(493, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1203 "Zend/zend_language_scanner.l"
+#line 1340 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDFOR);
}
-#line 5158 "Zend/zend_language_scanner.c"
+#line 5422 "Zend/zend_language_scanner.c"
yy494:
YYDEBUG(494, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5199,11 +5463,11 @@ yy500:
}
YYDEBUG(501, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1401 "Zend/zend_language_scanner.l"
+#line 1536 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_GLOBAL);
}
-#line 5207 "Zend/zend_language_scanner.c"
+#line 5471 "Zend/zend_language_scanner.c"
yy502:
YYDEBUG(502, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5260,11 +5524,11 @@ yy510:
}
YYDEBUG(511, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1572 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PUBLIC);
}
-#line 5268 "Zend/zend_language_scanner.c"
+#line 5532 "Zend/zend_language_scanner.c"
yy512:
YYDEBUG(512, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5279,11 +5543,11 @@ yy513:
}
YYDEBUG(514, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1141 "Zend/zend_language_scanner.l"
+#line 1278 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_RETURN);
}
-#line 5287 "Zend/zend_language_scanner.c"
+#line 5551 "Zend/zend_language_scanner.c"
yy515:
YYDEBUG(515, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5292,11 +5556,11 @@ yy515:
}
YYDEBUG(516, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1417 "Zend/zend_language_scanner.l"
+#line 1552 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_STATIC);
}
-#line 5300 "Zend/zend_language_scanner.c"
+#line 5564 "Zend/zend_language_scanner.c"
yy517:
YYDEBUG(517, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5305,11 +5569,11 @@ yy517:
}
YYDEBUG(518, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1231 "Zend/zend_language_scanner.l"
+#line 1368 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SWITCH);
}
-#line 5313 "Zend/zend_language_scanner.c"
+#line 5577 "Zend/zend_language_scanner.c"
yy519:
YYDEBUG(519, *YYCURSOR);
++YYCURSOR;
@@ -5389,11 +5653,11 @@ yy530:
++YYCURSOR;
YYDEBUG(531, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1353 "Zend/zend_language_scanner.l"
+#line 1488 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ARRAY_CAST);
}
-#line 5397 "Zend/zend_language_scanner.c"
+#line 5661 "Zend/zend_language_scanner.c"
yy532:
YYDEBUG(532, *YYCURSOR);
++YYCURSOR;
@@ -5439,11 +5703,11 @@ yy538:
++YYCURSOR;
YYDEBUG(539, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1365 "Zend/zend_language_scanner.l"
+#line 1500 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_UNSET_CAST);
}
-#line 5447 "Zend/zend_language_scanner.c"
+#line 5711 "Zend/zend_language_scanner.c"
yy540:
YYDEBUG(540, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5470,11 +5734,11 @@ yy543:
}
YYDEBUG(544, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1215 "Zend/zend_language_scanner.l"
+#line 1352 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DECLARE);
}
-#line 5478 "Zend/zend_language_scanner.c"
+#line 5742 "Zend/zend_language_scanner.c"
yy545:
YYDEBUG(545, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5483,11 +5747,11 @@ yy545:
}
YYDEBUG(546, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1243 "Zend/zend_language_scanner.l"
+#line 1380 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DEFAULT);
}
-#line 5491 "Zend/zend_language_scanner.c"
+#line 5755 "Zend/zend_language_scanner.c"
yy547:
YYDEBUG(547, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5520,11 +5784,11 @@ yy551:
}
YYDEBUG(552, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1279 "Zend/zend_language_scanner.l"
+#line 1416 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXTENDS);
}
-#line 5528 "Zend/zend_language_scanner.c"
+#line 5792 "Zend/zend_language_scanner.c"
yy553:
YYDEBUG(553, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5533,11 +5797,11 @@ yy553:
}
YYDEBUG(554, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1163 "Zend/zend_language_scanner.l"
+#line 1300 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FINALLY);
}
-#line 5541 "Zend/zend_language_scanner.c"
+#line 5805 "Zend/zend_language_scanner.c"
yy555:
YYDEBUG(555, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5546,11 +5810,11 @@ yy555:
}
YYDEBUG(556, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1207 "Zend/zend_language_scanner.l"
+#line 1344 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FOREACH);
}
-#line 5554 "Zend/zend_language_scanner.c"
+#line 5818 "Zend/zend_language_scanner.c"
yy557:
YYDEBUG(557, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5584,11 +5848,11 @@ yy559:
yy560:
YYDEBUG(560, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1373 "Zend/zend_language_scanner.l"
+#line 1508 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INCLUDE);
}
-#line 5592 "Zend/zend_language_scanner.c"
+#line 5856 "Zend/zend_language_scanner.c"
yy561:
YYDEBUG(561, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5621,11 +5885,11 @@ yy565:
}
YYDEBUG(566, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1429 "Zend/zend_language_scanner.l"
+#line 1564 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PRIVATE);
}
-#line 5629 "Zend/zend_language_scanner.c"
+#line 5893 "Zend/zend_language_scanner.c"
yy567:
YYDEBUG(567, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5653,11 +5917,11 @@ yy568:
yy569:
YYDEBUG(569, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1381 "Zend/zend_language_scanner.l"
+#line 1516 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_REQUIRE);
}
-#line 5661 "Zend/zend_language_scanner.c"
+#line 5925 "Zend/zend_language_scanner.c"
yy570:
YYDEBUG(570, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5677,11 +5941,11 @@ yy572:
}
YYDEBUG(573, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1773 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DIR);
}
-#line 5685 "Zend/zend_language_scanner.c"
+#line 5949 "Zend/zend_language_scanner.c"
yy574:
YYDEBUG(574, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5726,21 +5990,21 @@ yy581:
++YYCURSOR;
YYDEBUG(582, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1349 "Zend/zend_language_scanner.l"
+#line 1484 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_STRING_CAST);
}
-#line 5734 "Zend/zend_language_scanner.c"
+#line 5998 "Zend/zend_language_scanner.c"
yy583:
YYDEBUG(583, *YYCURSOR);
++YYCURSOR;
YYDEBUG(584, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1357 "Zend/zend_language_scanner.l"
+#line 1492 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OBJECT_CAST);
}
-#line 5744 "Zend/zend_language_scanner.c"
+#line 6008 "Zend/zend_language_scanner.c"
yy585:
YYDEBUG(585, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5749,11 +6013,11 @@ yy585:
}
YYDEBUG(586, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1421 "Zend/zend_language_scanner.l"
+#line 1556 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ABSTRACT);
}
-#line 5757 "Zend/zend_language_scanner.c"
+#line 6021 "Zend/zend_language_scanner.c"
yy587:
YYDEBUG(587, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5762,11 +6026,11 @@ yy587:
}
YYDEBUG(588, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1457 "Zend/zend_language_scanner.l"
+#line 1592 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CALLABLE);
}
-#line 5770 "Zend/zend_language_scanner.c"
+#line 6034 "Zend/zend_language_scanner.c"
yy589:
YYDEBUG(589, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5775,11 +6039,11 @@ yy589:
}
YYDEBUG(590, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1251 "Zend/zend_language_scanner.l"
+#line 1388 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONTINUE);
}
-#line 5783 "Zend/zend_language_scanner.c"
+#line 6047 "Zend/zend_language_scanner.c"
yy591:
YYDEBUG(591, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5806,11 +6070,11 @@ yy594:
}
YYDEBUG(595, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1191 "Zend/zend_language_scanner.l"
+#line 1328 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDWHILE);
}
-#line 5814 "Zend/zend_language_scanner.c"
+#line 6078 "Zend/zend_language_scanner.c"
yy596:
YYDEBUG(596, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5819,11 +6083,11 @@ yy596:
}
YYDEBUG(597, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1133 "Zend/zend_language_scanner.l"
+#line 1270 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FUNCTION);
}
-#line 5827 "Zend/zend_language_scanner.c"
+#line 6091 "Zend/zend_language_scanner.c"
yy598:
YYDEBUG(598, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5891,11 +6155,11 @@ yy608:
}
YYDEBUG(609, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1769 "Zend/zend_language_scanner.l"
+#line 1915 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FILE);
}
-#line 5899 "Zend/zend_language_scanner.c"
+#line 6163 "Zend/zend_language_scanner.c"
yy610:
YYDEBUG(610, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5916,11 +6180,11 @@ yy612:
}
YYDEBUG(613, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1765 "Zend/zend_language_scanner.l"
+#line 1911 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LINE);
}
-#line 5924 "Zend/zend_language_scanner.c"
+#line 6188 "Zend/zend_language_scanner.c"
yy614:
YYDEBUG(614, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5957,11 +6221,11 @@ yy619:
}
YYDEBUG(620, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1235 "Zend/zend_language_scanner.l"
+#line 1372 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDSWITCH);
}
-#line 5965 "Zend/zend_language_scanner.c"
+#line 6229 "Zend/zend_language_scanner.c"
yy621:
YYDEBUG(621, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5988,11 +6252,11 @@ yy624:
}
YYDEBUG(625, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1397 "Zend/zend_language_scanner.l"
+#line 1532 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INSTEADOF);
}
-#line 5996 "Zend/zend_language_scanner.c"
+#line 6260 "Zend/zend_language_scanner.c"
yy626:
YYDEBUG(626, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6001,11 +6265,11 @@ yy626:
}
YYDEBUG(627, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1271 "Zend/zend_language_scanner.l"
+#line 1408 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INTERFACE);
}
-#line 6009 "Zend/zend_language_scanner.c"
+#line 6273 "Zend/zend_language_scanner.c"
yy628:
YYDEBUG(628, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6014,11 +6278,11 @@ yy628:
}
YYDEBUG(629, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1389 "Zend/zend_language_scanner.l"
+#line 1524 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NAMESPACE);
}
-#line 6022 "Zend/zend_language_scanner.c"
+#line 6286 "Zend/zend_language_scanner.c"
yy630:
YYDEBUG(630, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6027,11 +6291,11 @@ yy630:
}
YYDEBUG(631, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1433 "Zend/zend_language_scanner.l"
+#line 1568 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PROTECTED);
}
-#line 6035 "Zend/zend_language_scanner.c"
+#line 6299 "Zend/zend_language_scanner.c"
yy632:
YYDEBUG(632, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6052,11 +6316,11 @@ yy634:
}
YYDEBUG(635, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1749 "Zend/zend_language_scanner.l"
+#line 1895 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLASS_C);
}
-#line 6060 "Zend/zend_language_scanner.c"
+#line 6324 "Zend/zend_language_scanner.c"
yy636:
YYDEBUG(636, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6088,11 +6352,11 @@ yy640:
}
YYDEBUG(641, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1753 "Zend/zend_language_scanner.l"
+#line 1899 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRAIT_C);
}
-#line 6096 "Zend/zend_language_scanner.c"
+#line 6360 "Zend/zend_language_scanner.c"
yy642:
YYDEBUG(642, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6101,11 +6365,11 @@ yy642:
}
YYDEBUG(643, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1219 "Zend/zend_language_scanner.l"
+#line 1356 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDDECLARE);
}
-#line 6109 "Zend/zend_language_scanner.c"
+#line 6373 "Zend/zend_language_scanner.c"
yy644:
YYDEBUG(644, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6114,11 +6378,11 @@ yy644:
}
YYDEBUG(645, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1211 "Zend/zend_language_scanner.l"
+#line 1348 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDFOREACH);
}
-#line 6122 "Zend/zend_language_scanner.c"
+#line 6386 "Zend/zend_language_scanner.c"
yy646:
YYDEBUG(646, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6127,11 +6391,11 @@ yy646:
}
YYDEBUG(647, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1283 "Zend/zend_language_scanner.l"
+#line 1420 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IMPLEMENTS);
}
-#line 6135 "Zend/zend_language_scanner.c"
+#line 6399 "Zend/zend_language_scanner.c"
yy648:
YYDEBUG(648, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6146,11 +6410,11 @@ yy649:
}
YYDEBUG(650, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1223 "Zend/zend_language_scanner.l"
+#line 1360 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INSTANCEOF);
}
-#line 6154 "Zend/zend_language_scanner.c"
+#line 6418 "Zend/zend_language_scanner.c"
yy651:
YYDEBUG(651, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6198,11 +6462,11 @@ yy655:
}
YYDEBUG(656, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1761 "Zend/zend_language_scanner.l"
+#line 1907 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_METHOD_C);
}
-#line 6206 "Zend/zend_language_scanner.c"
+#line 6470 "Zend/zend_language_scanner.c"
yy657:
YYDEBUG(657, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6226,13 +6490,13 @@ yy660:
++YYCURSOR;
YYDEBUG(661, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1145 "Zend/zend_language_scanner.l"
+#line 1282 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
HANDLE_NEWLINES(yytext, yyleng);
RETURN_TOKEN(T_YIELD_FROM);
}
-#line 6236 "Zend/zend_language_scanner.c"
+#line 6500 "Zend/zend_language_scanner.c"
yy662:
YYDEBUG(662, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6257,11 +6521,11 @@ yy665:
}
YYDEBUG(666, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1377 "Zend/zend_language_scanner.l"
+#line 1512 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INCLUDE_ONCE);
}
-#line 6265 "Zend/zend_language_scanner.c"
+#line 6529 "Zend/zend_language_scanner.c"
yy667:
YYDEBUG(667, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6270,11 +6534,11 @@ yy667:
}
YYDEBUG(668, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1385 "Zend/zend_language_scanner.l"
+#line 1520 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_REQUIRE_ONCE);
}
-#line 6278 "Zend/zend_language_scanner.c"
+#line 6542 "Zend/zend_language_scanner.c"
yy669:
YYDEBUG(669, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6283,11 +6547,11 @@ yy669:
}
YYDEBUG(670, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1757 "Zend/zend_language_scanner.l"
+#line 1903 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FUNC_C);
}
-#line 6291 "Zend/zend_language_scanner.c"
+#line 6555 "Zend/zend_language_scanner.c"
yy671:
YYDEBUG(671, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6313,11 +6577,11 @@ yy674:
}
YYDEBUG(675, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1777 "Zend/zend_language_scanner.l"
+#line 1923 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NS_C);
}
-#line 6321 "Zend/zend_language_scanner.c"
+#line 6585 "Zend/zend_language_scanner.c"
yy676:
YYDEBUG(676, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6331,11 +6595,11 @@ yy677:
}
YYDEBUG(678, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1413 "Zend/zend_language_scanner.l"
+#line 1548 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_HALT_COMPILER);
}
-#line 6339 "Zend/zend_language_scanner.c"
+#line 6603 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_LOOKING_FOR_PROPERTY:
@@ -6401,13 +6665,13 @@ yy681:
yy682:
YYDEBUG(682, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1307 "Zend/zend_language_scanner.l"
+#line 1442 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
goto restart;
}
-#line 6411 "Zend/zend_language_scanner.c"
+#line 6675 "Zend/zend_language_scanner.c"
yy683:
YYDEBUG(683, *YYCURSOR);
++YYCURSOR;
@@ -6419,12 +6683,11 @@ yy683:
}
YYDEBUG(685, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1292 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
{
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_WHITESPACE);
+ goto return_whitespace;
}
-#line 6428 "Zend/zend_language_scanner.c"
+#line 6691 "Zend/zend_language_scanner.c"
yy686:
YYDEBUG(686, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6441,23 +6704,22 @@ yy687:
}
YYDEBUG(689, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1301 "Zend/zend_language_scanner.l"
+#line 1437 "Zend/zend_language_scanner.l"
{
yy_pop_state();
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 6451 "Zend/zend_language_scanner.c"
+#line 6713 "Zend/zend_language_scanner.c"
yy690:
YYDEBUG(690, *YYCURSOR);
++YYCURSOR;
YYDEBUG(691, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1297 "Zend/zend_language_scanner.l"
+#line 1433 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OBJECT_OPERATOR);
}
-#line 6461 "Zend/zend_language_scanner.c"
+#line 6723 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_BACKQUOTE:
@@ -6510,7 +6772,7 @@ yyc_ST_BACKQUOTE:
yy695:
YYDEBUG(695, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2217 "Zend/zend_language_scanner.l"
+#line 2495 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -6548,10 +6810,14 @@ yy695:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '`');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '`') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
-#line 6555 "Zend/zend_language_scanner.c"
+#line 6821 "Zend/zend_language_scanner.c"
yy696:
YYDEBUG(696, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6575,12 +6841,12 @@ yy697:
++YYCURSOR;
YYDEBUG(698, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2161 "Zend/zend_language_scanner.l"
+#line 2435 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN('`');
}
-#line 6584 "Zend/zend_language_scanner.c"
+#line 6850 "Zend/zend_language_scanner.c"
yy699:
YYDEBUG(699, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6601,36 +6867,34 @@ yy700:
yy702:
YYDEBUG(702, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6610 "Zend/zend_language_scanner.c"
+#line 6875 "Zend/zend_language_scanner.c"
yy703:
YYDEBUG(703, *YYCURSOR);
++YYCURSOR;
YYDEBUG(704, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 6621 "Zend/zend_language_scanner.c"
+#line 6886 "Zend/zend_language_scanner.c"
yy705:
YYDEBUG(705, *YYCURSOR);
++YYCURSOR;
YYDEBUG(706, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 6634 "Zend/zend_language_scanner.c"
+#line 6898 "Zend/zend_language_scanner.c"
yy707:
YYDEBUG(707, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6644,14 +6908,13 @@ yy709:
++YYCURSOR;
YYDEBUG(710, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6655 "Zend/zend_language_scanner.c"
+#line 6918 "Zend/zend_language_scanner.c"
yy711:
YYDEBUG(711, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6669,14 +6932,13 @@ yy712:
++YYCURSOR;
YYDEBUG(713, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6680 "Zend/zend_language_scanner.c"
+#line 6942 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_DOUBLE_QUOTES:
@@ -6729,7 +6991,7 @@ yyc_ST_DOUBLE_QUOTES:
yy717:
YYDEBUG(717, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2167 "Zend/zend_language_scanner.l"
+#line 2441 "Zend/zend_language_scanner.l"
{
if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -6775,21 +7037,25 @@ yy717:
double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '"');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
-#line 6782 "Zend/zend_language_scanner.c"
+#line 7048 "Zend/zend_language_scanner.c"
yy718:
YYDEBUG(718, *YYCURSOR);
++YYCURSOR;
YYDEBUG(719, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2156 "Zend/zend_language_scanner.l"
+#line 2430 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN('"');
}
-#line 6793 "Zend/zend_language_scanner.c"
+#line 7059 "Zend/zend_language_scanner.c"
yy720:
YYDEBUG(720, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6828,36 +7094,34 @@ yy722:
yy724:
YYDEBUG(724, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6837 "Zend/zend_language_scanner.c"
+#line 7102 "Zend/zend_language_scanner.c"
yy725:
YYDEBUG(725, *YYCURSOR);
++YYCURSOR;
YYDEBUG(726, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 6848 "Zend/zend_language_scanner.c"
+#line 7113 "Zend/zend_language_scanner.c"
yy727:
YYDEBUG(727, *YYCURSOR);
++YYCURSOR;
YYDEBUG(728, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 6861 "Zend/zend_language_scanner.c"
+#line 7125 "Zend/zend_language_scanner.c"
yy729:
YYDEBUG(729, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6871,14 +7135,13 @@ yy731:
++YYCURSOR;
YYDEBUG(732, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6882 "Zend/zend_language_scanner.c"
+#line 7145 "Zend/zend_language_scanner.c"
yy733:
YYDEBUG(733, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6896,14 +7159,13 @@ yy734:
++YYCURSOR;
YYDEBUG(735, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6907 "Zend/zend_language_scanner.c"
+#line 7169 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_HEREDOC:
@@ -6952,11 +7214,10 @@ yyc_ST_HEREDOC:
yy739:
YYDEBUG(739, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2259 "Zend/zend_language_scanner.l"
+#line 2541 "Zend/zend_language_scanner.l"
{
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = 0;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -6972,28 +7233,55 @@ yy739:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto heredoc_scan_done;
+ if (SCNG(heredoc_scan_ahead)) {
+ SCNG(heredoc_indentation) = indentation;
+ SCNG(heredoc_indentation_uses_spaces) = (spacing == HEREDOC_USING_SPACES);
+ } else {
+ YYCURSOR -= indentation;
}
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto heredoc_scan_done;
}
continue;
case '$':
@@ -7020,12 +7308,33 @@ yy739:
}
heredoc_scan_done:
+
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ zend_string *copy = Z_STR_P(zendlval);
+
+ if (!strip_multiline_string_indentation(
+ zendlval, heredoc_label->indentation, heredoc_label->indentation_uses_spaces,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
- zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) {
+ zend_string_efree(copy);
+ RETURN_TOKEN(T_ERROR);
+ }
+
+ zend_string_efree(copy);
+ } else {
+ HANDLE_NEWLINES(yytext, yyleng - newline);
+ }
+
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7029 "Zend/zend_language_scanner.c"
+#line 7338 "Zend/zend_language_scanner.c"
yy740:
YYDEBUG(740, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7064,36 +7373,34 @@ yy742:
yy744:
YYDEBUG(744, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7073 "Zend/zend_language_scanner.c"
+#line 7381 "Zend/zend_language_scanner.c"
yy745:
YYDEBUG(745, *YYCURSOR);
++YYCURSOR;
YYDEBUG(746, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 7084 "Zend/zend_language_scanner.c"
+#line 7392 "Zend/zend_language_scanner.c"
yy747:
YYDEBUG(747, *YYCURSOR);
++YYCURSOR;
YYDEBUG(748, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 7097 "Zend/zend_language_scanner.c"
+#line 7404 "Zend/zend_language_scanner.c"
yy749:
YYDEBUG(749, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7107,14 +7414,13 @@ yy751:
++YYCURSOR;
YYDEBUG(752, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7118 "Zend/zend_language_scanner.c"
+#line 7424 "Zend/zend_language_scanner.c"
yy753:
YYDEBUG(753, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7132,14 +7438,13 @@ yy754:
++YYCURSOR;
YYDEBUG(755, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7143 "Zend/zend_language_scanner.c"
+#line 7448 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_LOOKING_FOR_VARNAME:
@@ -7196,14 +7501,14 @@ yy758:
yy759:
YYDEBUG(759, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1612 "Zend/zend_language_scanner.l"
+#line 1746 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
goto restart;
}
-#line 7207 "Zend/zend_language_scanner.c"
+#line 7512 "Zend/zend_language_scanner.c"
yy760:
YYDEBUG(760, *YYCURSOR);
yych = *(YYMARKER = ++YYCURSOR);
@@ -7250,15 +7555,14 @@ yy764:
++YYCURSOR;
YYDEBUG(765, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1603 "Zend/zend_language_scanner.l"
+#line 1738 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
- zend_copy_value(zendlval, yytext, yyleng);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
- RETURN_TOKEN(T_STRING_VARNAME);
+ RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0);
}
-#line 7262 "Zend/zend_language_scanner.c"
+#line 7566 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_VAR_OFFSET:
@@ -7347,7 +7651,7 @@ yy768:
++YYCURSOR;
YYDEBUG(769, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2390 "Zend/zend_language_scanner.l"
+#line 2750 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7356,33 +7660,33 @@ yy768:
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
goto restart;
}
-#line 7360 "Zend/zend_language_scanner.c"
+#line 7664 "Zend/zend_language_scanner.c"
yy770:
YYDEBUG(770, *YYCURSOR);
++YYCURSOR;
YYDEBUG(771, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1884 "Zend/zend_language_scanner.l"
+#line 2038 "Zend/zend_language_scanner.l"
{
/* Invalid rule to return a more explicit parse error with proper line number */
yyless(0);
yy_pop_state();
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7374 "Zend/zend_language_scanner.c"
+#line 7678 "Zend/zend_language_scanner.c"
yy772:
YYDEBUG(772, *YYCURSOR);
++YYCURSOR;
yy773:
YYDEBUG(773, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1879 "Zend/zend_language_scanner.l"
+#line 2033 "Zend/zend_language_scanner.l"
{
/* Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error */
RETURN_TOKEN(yytext[0]);
}
-#line 7386 "Zend/zend_language_scanner.c"
+#line 7690 "Zend/zend_language_scanner.c"
yy774:
YYDEBUG(774, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7417,7 +7721,7 @@ yy775:
yy776:
YYDEBUG(776, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1719 "Zend/zend_language_scanner.l"
+#line 1861 "Zend/zend_language_scanner.l"
{ /* Offset could be treated as a long */
if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) {
char *end;
@@ -7431,9 +7735,9 @@ yy776:
string:
ZVAL_STRINGL(zendlval, yytext, yyleng);
}
- RETURN_TOKEN(T_NUM_STRING);
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
-#line 7437 "Zend/zend_language_scanner.c"
+#line 7741 "Zend/zend_language_scanner.c"
yy777:
YYDEBUG(777, *YYCURSOR);
++YYCURSOR;
@@ -7455,23 +7759,22 @@ yy779:
}
YYDEBUG(781, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1892 "Zend/zend_language_scanner.l"
+#line 2046 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 7464 "Zend/zend_language_scanner.c"
+#line 7767 "Zend/zend_language_scanner.c"
yy782:
YYDEBUG(782, *YYCURSOR);
++YYCURSOR;
YYDEBUG(783, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1874 "Zend/zend_language_scanner.l"
+#line 2028 "Zend/zend_language_scanner.l"
{
yy_pop_state();
RETURN_TOKEN(']');
}
-#line 7475 "Zend/zend_language_scanner.c"
+#line 7778 "Zend/zend_language_scanner.c"
yy784:
YYDEBUG(784, *YYCURSOR);
++YYCURSOR;
@@ -7496,12 +7799,11 @@ yy784:
yy786:
YYDEBUG(786, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7505 "Zend/zend_language_scanner.c"
+#line 7807 "Zend/zend_language_scanner.c"
yy787:
YYDEBUG(787, *YYCURSOR);
++YYCURSOR;
@@ -7513,12 +7815,16 @@ yy787:
yy789:
YYDEBUG(789, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1735 "Zend/zend_language_scanner.l"
+#line 1877 "Zend/zend_language_scanner.l"
{ /* Offset must be treated as a string */
- ZVAL_STRINGL(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_NUM_STRING);
+ if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
+ } else {
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
+ }
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
-#line 7522 "Zend/zend_language_scanner.c"
+#line 7828 "Zend/zend_language_scanner.c"
yy790:
YYDEBUG(790, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7568,7 +7874,7 @@ yyc_INITIAL:
yy800:
YYDEBUG(800, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1804 "Zend/zend_language_scanner.l"
+#line 1959 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7607,13 +7913,15 @@ inline_char_handler:
if (readsize < yyleng) {
yyless(readsize);
}
+ } else if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
} else {
- ZVAL_STRINGL(zendlval, yytext, yyleng);
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
}
HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_INLINE_HTML);
+ RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
}
-#line 7617 "Zend/zend_language_scanner.c"
+#line 7925 "Zend/zend_language_scanner.c"
yy801:
YYDEBUG(801, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7629,27 +7937,33 @@ yy801:
yy803:
YYDEBUG(803, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1795 "Zend/zend_language_scanner.l"
+#line 1947 "Zend/zend_language_scanner.l"
{
if (CG(short_tags)) {
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
} else {
goto inline_char_handler;
}
}
-#line 7642 "Zend/zend_language_scanner.c"
+#line 7953 "Zend/zend_language_scanner.c"
yy804:
YYDEBUG(804, *YYCURSOR);
++YYCURSOR;
YYDEBUG(805, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1782 "Zend/zend_language_scanner.l"
+#line 1928 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ECHO);
+ }
RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
}
-#line 7653 "Zend/zend_language_scanner.c"
+#line 7967 "Zend/zend_language_scanner.c"
yy806:
YYDEBUG(806, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7680,13 +7994,16 @@ yy810:
yy811:
YYDEBUG(811, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1788 "Zend/zend_language_scanner.l"
+#line 1937 "Zend/zend_language_scanner.l"
{
HANDLE_NEWLINE(yytext[yyleng-1]);
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
}
-#line 7690 "Zend/zend_language_scanner.c"
+#line 8007 "Zend/zend_language_scanner.c"
yy812:
YYDEBUG(812, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7701,12 +8018,12 @@ yyc_ST_END_HEREDOC:
++YYCURSOR;
YYDEBUG(816, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2134 "Zend/zend_language_scanner.l"
+#line 2409 "Zend/zend_language_scanner.l"
{
zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
- YYCURSOR += heredoc_label->length - 1;
- yyleng = heredoc_label->length;
+ yyleng = heredoc_label->indentation + heredoc_label->length;
+ YYCURSOR += yyleng - 1;
heredoc_label_dtor(heredoc_label);
efree(heredoc_label);
@@ -7714,7 +8031,7 @@ yyc_ST_END_HEREDOC:
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN(T_END_HEREDOC);
}
-#line 7718 "Zend/zend_language_scanner.c"
+#line 8035 "Zend/zend_language_scanner.c"
/* *********************************** */
yyc_ST_NOWDOC:
YYDEBUG(817, *YYCURSOR);
@@ -7724,11 +8041,10 @@ yyc_ST_NOWDOC:
++YYCURSOR;
YYDEBUG(820, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2333 "Zend/zend_language_scanner.l"
+#line 2662 "Zend/zend_language_scanner.l"
{
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = -1;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7744,28 +8060,51 @@ yyc_ST_NOWDOC:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto nowdoc_scan_done;
- }
+ YYCURSOR -= indentation;
+ heredoc_label->indentation = indentation;
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto nowdoc_scan_done;
}
/* fall through */
default:
@@ -7775,13 +8114,56 @@ yyc_ST_NOWDOC:
nowdoc_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!EG(exception) && spacing != -1 && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ if (!strip_multiline_string_indentation(
+ zendlval, indentation, spacing == HEREDOC_USING_SPACES,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ }
- zend_copy_value(zendlval, yytext, yyleng - newline);
HANDLE_NEWLINES(yytext, yyleng - newline);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7784 "Zend/zend_language_scanner.c"
+#line 8132 "Zend/zend_language_scanner.c"
}
-#line 2399 "Zend/zend_language_scanner.l"
+#line 2759 "Zend/zend_language_scanner.l"
+
+
+emit_token_with_str:
+ zend_copy_value(zendlval, (yytext + offset), (yyleng - offset));
+emit_token_with_val:
+ if (PARSER_MODE()) {
+ ZEND_ASSERT(Z_TYPE_P(zendlval) != IS_UNDEF);
+ elem->ast = zend_ast_create_zval_with_lineno(zendlval, start_line);
+ }
+
+emit_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ return token;
+
+return_whitespace:
+ HANDLE_NEWLINES(yytext, yyleng);
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, T_WHITESPACE, start_line, SCNG(on_event_context));
+ }
+ if (PARSER_MODE()) {
+ start_line = CG(zend_lineno);
+ goto restart;
+ } else {
+ return T_WHITESPACE;
+ }
+
+skip_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ start_line = CG(zend_lineno);
+ goto restart;
}
diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h
index 2064d6d17a..9241ae3fc2 100644
--- a/Zend/zend_language_scanner.h
+++ b/Zend/zend_language_scanner.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_SCANNER_H
#define ZEND_SCANNER_H
@@ -61,6 +59,8 @@ typedef struct _zend_lex_state {
typedef struct _zend_heredoc_label {
char *label;
int length;
+ int indentation;
+ zend_bool indentation_uses_spaces;
} zend_heredoc_label;
BEGIN_EXTERN_C()
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 0cc3d0e72b..69c392a9bc 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -16,13 +16,11 @@
| Nuno Lopes <nlopess@php.net> |
| Scott MacVicar <scottmac@php.net> |
| Flex version authors: |
- | Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#if 0
# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
#else
@@ -117,6 +115,7 @@ do { \
#define GET_DOUBLE_QUOTES_SCANNED_LENGTH() SCNG(scanned_string_len)
#define IS_LABEL_START(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || (c) == '_' || (c) >= 0x80)
+#define IS_LABEL_SUCCESSOR(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9') || (c) == '_' || (c) >= 0x80)
#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7')
#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F'))
@@ -181,6 +180,7 @@ void startup_scanner(void)
CG(extra_fn_flags) = 0;
zend_stack_init(&SCNG(state_stack), sizeof(int));
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
}
static void heredoc_label_dtor(zend_heredoc_label *heredoc_label) {
@@ -194,6 +194,7 @@ void shutdown_scanner(void)
zend_stack_destroy(&SCNG(state_stack));
zend_ptr_stack_clean(&SCNG(heredoc_label_stack), (void (*)(void *)) &heredoc_label_dtor, 1);
zend_ptr_stack_destroy(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
SCNG(on_event) = NULL;
}
@@ -558,7 +559,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
}
zend_set_compiled_filename(compiled_filename);
- zend_string_release(compiled_filename);
+ zend_string_release_ex(compiled_filename, 0);
if (CG(start_lineno)) {
CG(zend_lineno) = CG(start_lineno);
@@ -648,9 +649,7 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_string *opened_path = NULL;
if (Z_TYPE_P(filename) != IS_STRING) {
- tmp = *filename;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
+ ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
file_handle.filename = Z_STRVAL_P(filename);
@@ -668,13 +667,13 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path);
if (opened_path) {
- zend_string_release(opened_path);
+ zend_string_release_ex(opened_path, 0);
}
}
zend_destroy_file_handle(&file_handle);
- if (filename==&tmp) {
- zval_dtor(&tmp);
+ if (UNEXPECTED(filename == &tmp)) {
+ zval_ptr_dtor(&tmp);
}
return retval;
}
@@ -718,7 +717,7 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename)
new_compiled_filename = zend_string_init(filename, strlen(filename), 0);
zend_set_compiled_filename(new_compiled_filename);
- zend_string_release(new_compiled_filename);
+ zend_string_release_ex(new_compiled_filename, 0);
CG(zend_lineno) = 1;
CG(increment_lineno) = 0;
RESET_DOC_COMMENT();
@@ -753,22 +752,25 @@ zend_op_array *compile_string(zval *source_string, char *filename)
zend_op_array *op_array = NULL;
zval tmp;
- if (Z_STRLEN_P(source_string)==0) {
- return NULL;
+ if (UNEXPECTED(Z_TYPE_P(source_string) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(source_string));
+ } else {
+ ZVAL_COPY(&tmp, source_string);
}
- ZVAL_DUP(&tmp, source_string);
- convert_to_string(&tmp);
- source_string = &tmp;
+ if (Z_STRLEN(tmp)==0) {
+ zval_ptr_dtor(&tmp);
+ return NULL;
+ }
zend_save_lexical_state(&original_lex_state);
- if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) {
+ if (zend_prepare_string_for_scanning(&tmp, filename) == SUCCESS) {
BEGIN(ST_IN_SCRIPTING);
op_array = zend_compile(ZEND_EVAL_CODE);
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(&tmp);
+ zval_ptr_dtor(&tmp);
return op_array;
}
@@ -803,13 +805,18 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name)
{
zend_lex_state original_lex_state;
- zval tmp = *str;
+ zval tmp;
- str = &tmp;
- zval_copy_ctor(str);
+ if (UNEXPECTED(Z_TYPE_P(str) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(str));
+ str = &tmp;
+ }
zend_save_lexical_state(&original_lex_state);
if (zend_prepare_string_for_scanning(str, str_name)==FAILURE) {
zend_restore_lexical_state(&original_lex_state);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return FAILURE;
}
BEGIN(INITIAL);
@@ -819,7 +826,9 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
SCNG(script_filtered) = NULL;
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(str);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return SUCCESS;
}
@@ -866,6 +875,8 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); \
ZVAL_STRINGL(zendlval, s, sz); \
efree(s); \
+ } else if (yyleng == 1) { \
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext))); \
} else { \
ZVAL_STRINGL(zendlval, yytext, yyleng); \
}
@@ -875,11 +886,38 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
register char *s, *t;
char *end;
+ if (len <= 1) {
+ if (len < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*str;
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
+
ZVAL_STRINGL(zendlval, str, len);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
@@ -891,23 +929,18 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
switch(*s) {
case 'n':
*t++ = '\n';
- Z_STRLEN_P(zendlval)--;
break;
case 'r':
*t++ = '\r';
- Z_STRLEN_P(zendlval)--;
break;
case 't':
*t++ = '\t';
- Z_STRLEN_P(zendlval)--;
break;
case 'f':
*t++ = '\f';
- Z_STRLEN_P(zendlval)--;
break;
case 'v':
*t++ = '\v';
- Z_STRLEN_P(zendlval)--;
break;
case 'e':
#ifdef ZEND_WIN32
@@ -915,7 +948,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
#else
*t++ = '\e';
#endif
- Z_STRLEN_P(zendlval)--;
break;
case '"':
case '`':
@@ -927,20 +959,15 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
case '\\':
case '$':
*t++ = *s;
- Z_STRLEN_P(zendlval)--;
break;
case 'x':
case 'X':
if (ZEND_IS_HEX(*(s+1))) {
char hex_buf[3] = { 0, 0, 0 };
- Z_STRLEN_P(zendlval)--; /* for the 'x' */
-
hex_buf[0] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_HEX(*(s+1))) {
hex_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
*t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
} else {
@@ -956,7 +983,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
size_t len = 0;
zend_bool valid = 1;
unsigned long codepoint;
- size_t byte_len = 0;
if (*start != '{') {
/* we silently let this pass to avoid breaking code
@@ -1012,27 +1038,20 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
/* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
if (codepoint < 0x80) {
- byte_len = 1;
*t++ = codepoint;
} else if (codepoint <= 0x7FF) {
- byte_len = 2;
*t++ = (codepoint >> 6) + 0xC0;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0xFFFF) {
- byte_len = 3;
*t++ = (codepoint >> 12) + 0xE0;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0x10FFFF) {
- byte_len = 4;
*t++ = (codepoint >> 18) + 0xF0;
*t++ = ((codepoint >> 12) & 0x3F) + 0x80;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
}
-
- Z_STRLEN_P(zendlval) -= 2; /* \u */
- Z_STRLEN_P(zendlval) -= (len - byte_len);
}
break;
default:
@@ -1041,13 +1060,10 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
char octal_buf[4] = { 0, 0, 0, 0 };
octal_buf[0] = *s;
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[2] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
}
if (octal_buf[2] &&
@@ -1073,6 +1089,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
unsigned char *str;
@@ -1086,22 +1105,140 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
return SUCCESS;
}
-static zend_always_inline int emit_token(int token, int token_line)
+#define HEREDOC_USING_SPACES 1
+#define HEREDOC_USING_TABS 2
+
+static const char *next_newline(const char *str, const char *end, size_t *newline_len) {
+ for (; str < end; str++) {
+ if (*str == '\r') {
+ *newline_len = str + 1 < end && *(str + 1) == '\n' ? 2 : 1;
+ } else if (*str == '\n') {
+ *newline_len = 1;
+ return str;
+ }
+ }
+ *newline_len = 0;
+ return NULL;
+}
+
+static zend_bool strip_multiline_string_indentation(
+ zval *zendlval, int indentation, zend_bool using_spaces,
+ zend_bool newline_at_start, zend_bool newline_at_end)
{
- if (SCNG(on_event)) {
- SCNG(on_event)(ON_TOKEN, token, token_line, SCNG(on_event_context));
+ const char *str = Z_STRVAL_P(zendlval), *end = str + Z_STRLEN_P(zendlval);
+ char *copy = Z_STRVAL_P(zendlval);
+
+ int newline_count = 0;
+ size_t newline_len;
+ const char *nl;
+
+ if (!newline_at_start) {
+ nl = next_newline(str, end, &newline_len);
+ if (!nl) {
+ return 1;
+ }
+
+ str = nl + newline_len;
+ copy = (char *) nl + newline_len;
+ newline_count++;
+ } else {
+ nl = str;
}
- return token;
-}
+ /* <= intentional */
+ while (str <= end && nl) {
+ size_t skip;
+ nl = next_newline(str, end, &newline_len);
+ if (!nl && newline_at_end) {
+ nl = end;
+ }
+
+ /* Try to skip indentation */
+ for (skip = 0; skip < indentation; skip++, str++) {
+ if (str == nl) {
+ /* Don't require full indentation on whitespace-only lines */
+ break;
+ }
+
+ if (str == end || (*str != ' ' && *str != '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception_ex(zend_ce_parse_error, 0,
+ "Invalid body indentation level (expecting an indentation level of at least %d)", indentation);
+ goto error;
+ }
+
+ if ((!using_spaces && *str == ' ') || (using_spaces && *str == '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception(zend_ce_parse_error,
+ "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ goto error;
+ }
+ }
-#define RETURN_TOKEN(token) return emit_token(token, start_line);
+ if (str == end) {
+ break;
+ }
+
+ size_t len = nl ? (nl - str + newline_len) : (end - str);
+ memmove(copy, str, len);
+ str += len;
+ copy += len;
+ newline_count++;
+ }
-int lex_scan(zval *zendlval)
+ *copy = '\0';
+ Z_STRLEN_P(zendlval) = copy - Z_STRVAL_P(zendlval);
+ return 1;
+
+error:
+ zval_ptr_dtor_str(zendlval);
+ ZVAL_UNDEF(zendlval);
+
+ return 0;
+}
+
+static void copy_heredoc_label_stack(void *void_heredoc_label)
{
+ zend_heredoc_label *heredoc_label = void_heredoc_label;
+ zend_heredoc_label *new_heredoc_label = emalloc(sizeof(zend_heredoc_label));
+
+ *new_heredoc_label = *heredoc_label;
+ new_heredoc_label->label = estrndup(heredoc_label->label, heredoc_label->length);
+
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) new_heredoc_label);
+}
+
+#define PARSER_MODE() \
+ EXPECTED(elem != NULL)
+#define RETURN_TOKEN(_token) do { \
+ token = _token; \
+ goto emit_token; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_VAL(_token) do { \
+ token = _token; \
+ goto emit_token_with_val; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_STR(_token, _offset) do { \
+ token = _token; \
+ offset = _offset; \
+ goto emit_token_with_str; \
+ } while (0)
+
+#define SKIP_TOKEN(_token) do { \
+ token = _token; \
+ goto skip_token; \
+ } while (0)
+
+int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem)
+{
+int token;
+int offset;
int start_line = CG(zend_lineno);
+ ZVAL_UNDEF(zendlval);
restart:
SCNG(yy_text) = YYCURSOR;
@@ -1290,8 +1427,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
}
<ST_IN_SCRIPTING,ST_LOOKING_FOR_PROPERTY>{WHITESPACE}+ {
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_WHITESPACE);
+ goto return_whitespace;
}
<ST_LOOKING_FOR_PROPERTY>"->" {
@@ -1300,8 +1436,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
<ST_LOOKING_FOR_PROPERTY>{LABEL} {
yy_pop_state();
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
<ST_LOOKING_FOR_PROPERTY>{ANY_CHAR} {
@@ -1602,10 +1737,9 @@ NEWLINE ("\r"|"\n"|"\r\n")
<ST_LOOKING_FOR_VARNAME>{LABEL}[[}] {
yyless(yyleng - 1);
- zend_copy_value(zendlval, yytext, yyleng);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
- RETURN_TOKEN(T_STRING_VARNAME);
+ RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0);
}
@@ -1635,12 +1769,12 @@ NEWLINE ("\r"|"\n"|"\r\n")
ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2));
ZEND_ASSERT(!errno && end == yytext + yyleng);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
@@ -1656,7 +1790,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_LNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
} else {
errno = 0;
@@ -1673,19 +1810,24 @@ NEWLINE ("\r"|"\n"|"\r\n")
zend_throw_exception(zend_ce_parse_error,
"Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
}
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
/* Also not an assert for the same reason */
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
ZEND_ASSERT(!errno);
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
<ST_IN_SCRIPTING>{HNUM} {
@@ -1707,12 +1849,12 @@ NEWLINE ("\r"|"\n"|"\r\n")
ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16));
ZEND_ASSERT(!errno && end == hex + len);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == hex + len);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
@@ -1729,12 +1871,16 @@ NEWLINE ("\r"|"\n"|"\r\n")
string:
ZVAL_STRINGL(zendlval, yytext, yyleng);
}
- RETURN_TOKEN(T_NUM_STRING);
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
<ST_VAR_OFFSET>{LNUM}|{HNUM}|{BNUM} { /* Offset must be treated as a string */
- ZVAL_STRINGL(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_NUM_STRING);
+ if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
+ } else {
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
+ }
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
<ST_IN_SCRIPTING>{DNUM}|{EXPONENT_DNUM} {
@@ -1743,7 +1889,7 @@ string:
ZVAL_DOUBLE(zendlval, zend_strtod(yytext, &end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
<ST_IN_SCRIPTING>"__CLASS__" {
@@ -1781,6 +1927,9 @@ string:
<INITIAL>"<?=" {
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ECHO);
+ }
RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
}
@@ -1788,6 +1937,9 @@ string:
<INITIAL>"<?php"([ \t]|{NEWLINE}) {
HANDLE_NEWLINE(yytext[yyleng-1]);
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
}
@@ -1795,6 +1947,9 @@ string:
<INITIAL>"<?" {
if (CG(short_tags)) {
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
} else {
goto inline_char_handler;
@@ -1839,11 +1994,13 @@ inline_char_handler:
if (readsize < yyleng) {
yyless(readsize);
}
+ } else if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
} else {
- ZVAL_STRINGL(zendlval, yytext, yyleng);
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
}
HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_INLINE_HTML);
+ RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
}
@@ -1853,8 +2010,7 @@ inline_char_handler:
<ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"->"[a-zA-Z_\x80-\xff] {
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
/* A [ always designates a variable offset, regardless of what follows
@@ -1862,13 +2018,11 @@ inline_char_handler:
<ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"[" {
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET>"$"{LABEL} {
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
<ST_VAR_OFFSET>"]" {
@@ -1886,12 +2040,11 @@ inline_char_handler:
yyless(0);
yy_pop_state();
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
<ST_IN_SCRIPTING,ST_VAR_OFFSET>{LABEL} {
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
@@ -1921,6 +2074,9 @@ inline_char_handler:
yyleng = YYCURSOR - SCNG(yy_text);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
@@ -1951,9 +2107,15 @@ inline_char_handler:
if (doc_com) {
CG(doc_comment) = zend_string_init(yytext, yyleng, 0);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_DOC_COMMENT);
+ }
RETURN_TOKEN(T_DOC_COMMENT);
}
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
@@ -1962,7 +2124,10 @@ inline_char_handler:
if (yytext[yyleng-1] != '>') {
CG(increment_lineno) = 1;
}
- RETURN_TOKEN(T_CLOSE_TAG); /* implicit ';' at php-end tag */
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(';'); /* implicit ';' at php-end tag */
+ }
+ RETURN_TOKEN(T_CLOSE_TAG);
}
@@ -1988,41 +2153,62 @@ inline_char_handler:
* for ' (unrecognized by parser), instead of old flex fallback to "Unexpected character..."
* rule, which continued in ST_IN_SCRIPTING state after the quote */
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
}
+ if (yyleng-bprefix-2 <= 1) {
+ if (yyleng-bprefix-2 < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*(yytext+bprefix+1);
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
-
- switch(*s) {
- case '\\':
- case '\'':
- *t++ = *s;
- Z_STRLEN_P(zendlval)--;
- break;
- default:
- *t++ = '\\';
- *t++ = *s;
- break;
+ if (*s == '\\' || *s == '\'') {
+ *t++ = *s;
+ } else {
+ *t++ = '\\';
+ *t++ = *s;
}
} else {
*t++ = *s;
}
-
if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
CG(zend_lineno)++;
}
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
char *str = NULL;
@@ -2031,7 +2217,7 @@ inline_char_handler:
SCNG(output_filter)((unsigned char **)&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
ZVAL_STRINGL(zendlval, str, sz);
}
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
}
@@ -2042,8 +2228,12 @@ inline_char_handler:
switch (*YYCURSOR++) {
case '"':
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"');
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
case '$':
if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
break;
@@ -2079,8 +2269,10 @@ inline_char_handler:
<ST_IN_SCRIPTING>b?"<<<"{TABS_AND_SPACES}({LABEL}|([']{LABEL}['])|(["]{LABEL}["])){NEWLINE} {
char *s;
- int bprefix = (yytext[0] != '<') ? 1 : 0;
+ unsigned char *saved_cursor;
+ int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0;
zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label));
+ zend_bool is_heredoc = 1;
CG(zend_lineno)++;
heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0);
@@ -2093,6 +2285,7 @@ inline_char_handler:
if (*s == '\'') {
s++;
heredoc_label->length -= 2;
+ is_heredoc = 0;
BEGIN(ST_NOWDOC);
} else {
@@ -2105,21 +2298,103 @@ inline_char_handler:
}
heredoc_label->label = estrndup(s, heredoc_label->length);
+ heredoc_label->indentation = 0;
+ saved_cursor = YYCURSOR;
+
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ YYCURSOR = saved_cursor;
+ RETURN_TOKEN(T_START_HEREDOC);
+ }
/* Check for ending label on the next line */
if (heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (!IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ }
- if (*end == ';') {
- end++;
- }
+ YYCURSOR = saved_cursor;
+ heredoc_label->indentation = indentation;
- if (*end == '\n' || *end == '\r') {
BEGIN(ST_END_HEREDOC);
+ RETURN_TOKEN(T_START_HEREDOC);
}
}
- zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+ YYCURSOR = saved_cursor;
+
+ if (is_heredoc && !SCNG(heredoc_scan_ahead)) {
+ zend_lex_state current_state;
+ int heredoc_nesting_level = 1;
+ int first_token = 0;
+
+ zend_save_lexical_state(&current_state);
+
+ SCNG(heredoc_scan_ahead) = 1;
+ SCNG(heredoc_indentation) = 0;
+ SCNG(heredoc_indentation_uses_spaces) = 0;
+ LANG_SCNG(on_event) = NULL;
+
+ zend_ptr_stack_reverse_apply(&current_state.heredoc_label_stack, copy_heredoc_label_stack);
+
+ zend_exception_save();
+ while (heredoc_nesting_level) {
+ zval zv;
+ int retval;
+
+ ZVAL_UNDEF(&zv);
+ retval = lex_scan(&zv, NULL);
+ zval_ptr_dtor_nogc(&zv);
+
+ if (EG(exception)) {
+ zend_clear_exception();
+ break;
+ }
+
+ if (!first_token) {
+ first_token = retval;
+ }
+
+ switch (retval) {
+ case T_START_HEREDOC:
+ ++heredoc_nesting_level;
+ break;
+ case T_END_HEREDOC:
+ --heredoc_nesting_level;
+ break;
+ case END:
+ heredoc_nesting_level = 0;
+ }
+ }
+ zend_exception_restore();
+
+ if (
+ (first_token == T_VARIABLE
+ || first_token == T_DOLLAR_OPEN_CURLY_BRACES
+ || first_token == T_CURLY_OPEN
+ ) && SCNG(heredoc_indentation)) {
+ zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation));
+ }
+
+ heredoc_label->indentation = SCNG(heredoc_indentation);
+ heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces);
+
+ zend_restore_lexical_state(&current_state);
+ SCNG(heredoc_scan_ahead) = 0;
+ CG(increment_lineno) = 0;
+ }
RETURN_TOKEN(T_START_HEREDOC);
}
@@ -2134,8 +2409,8 @@ inline_char_handler:
<ST_END_HEREDOC>{ANY_CHAR} {
zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
- YYCURSOR += heredoc_label->length - 1;
- yyleng = heredoc_label->length;
+ yyleng = heredoc_label->indentation + heredoc_label->length;
+ YYCURSOR += yyleng - 1;
heredoc_label_dtor(heredoc_label);
efree(heredoc_label);
@@ -2146,7 +2421,6 @@ inline_char_handler:
<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"{$" {
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
@@ -2209,8 +2483,12 @@ inline_char_handler:
double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '"');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
@@ -2251,15 +2529,18 @@ double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '`');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '`') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
<ST_HEREDOC>{ANY_CHAR} {
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = 0;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -2275,28 +2556,55 @@ double_quotes_scan_done:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto heredoc_scan_done;
+ if (SCNG(heredoc_scan_ahead)) {
+ SCNG(heredoc_indentation) = indentation;
+ SCNG(heredoc_indentation_uses_spaces) = (spacing == HEREDOC_USING_SPACES);
+ } else {
+ YYCURSOR -= indentation;
}
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto heredoc_scan_done;
}
continue;
case '$':
@@ -2323,17 +2631,37 @@ double_quotes_scan_done:
}
heredoc_scan_done:
+
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ zend_string *copy = Z_STR_P(zendlval);
+
+ if (!strip_multiline_string_indentation(
+ zendlval, heredoc_label->indentation, heredoc_label->indentation_uses_spaces,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
+
+ if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) {
+ zend_string_efree(copy);
+ RETURN_TOKEN(T_ERROR);
+ }
- zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ zend_string_efree(copy);
+ } else {
+ HANDLE_NEWLINES(yytext, yyleng - newline);
+ }
+
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
<ST_NOWDOC>{ANY_CHAR} {
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = -1;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -2349,28 +2677,51 @@ heredoc_scan_done:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto nowdoc_scan_done;
- }
+ YYCURSOR -= indentation;
+ heredoc_label->indentation = indentation;
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto nowdoc_scan_done;
}
/* fall through */
default:
@@ -2380,10 +2731,19 @@ heredoc_scan_done:
nowdoc_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!EG(exception) && spacing != -1 && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ if (!strip_multiline_string_indentation(
+ zendlval, indentation, spacing == HEREDOC_USING_SPACES,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ }
- zend_copy_value(zendlval, yytext, yyleng - newline);
HANDLE_NEWLINES(yytext, yyleng - newline);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
@@ -2397,4 +2757,38 @@ nowdoc_scan_done:
}
*/
+
+emit_token_with_str:
+ zend_copy_value(zendlval, (yytext + offset), (yyleng - offset));
+
+emit_token_with_val:
+ if (PARSER_MODE()) {
+ ZEND_ASSERT(Z_TYPE_P(zendlval) != IS_UNDEF);
+ elem->ast = zend_ast_create_zval_with_lineno(zendlval, start_line);
+ }
+
+emit_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ return token;
+
+return_whitespace:
+ HANDLE_NEWLINES(yytext, yyleng);
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, T_WHITESPACE, start_line, SCNG(on_event_context));
+ }
+ if (PARSER_MODE()) {
+ start_line = CG(zend_lineno);
+ goto restart;
+ } else {
+ return T_WHITESPACE;
+ }
+
+skip_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ start_line = CG(zend_lineno);
+ goto restart;
}
diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h
index 3c01b5bc76..b06f9d3ecb 100644
--- a/Zend/zend_language_scanner_defs.h
+++ b/Zend/zend_language_scanner_defs.h
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.0.1 */
+/* Generated by re2c 1.1.1 */
#line 3 "Zend/zend_language_scanner_defs.h"
enum YYCONDTYPE {
diff --git a/Zend/zend_list.c b/Zend/zend_list.c
index 8da745ff95..aa16c5b7ef 100644
--- a/Zend/zend_list.c
+++ b/Zend/zend_list.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/* resource lists */
#include "zend.h"
@@ -31,7 +29,7 @@ ZEND_API int le_index_ptr;
/* true global */
static HashTable list_destructors;
-ZEND_API zval *zend_list_insert(void *ptr, int type)
+ZEND_API zval* ZEND_FASTCALL zend_list_insert(void *ptr, int type)
{
int index;
zval zv;
@@ -44,16 +42,16 @@ ZEND_API zval *zend_list_insert(void *ptr, int type)
return zend_hash_index_add_new(&EG(regular_list), index, &zv);
}
-ZEND_API int zend_list_delete(zend_resource *res)
+ZEND_API int ZEND_FASTCALL zend_list_delete(zend_resource *res)
{
- if (--GC_REFCOUNT(res) <= 0) {
+ if (GC_DELREF(res) <= 0) {
return zend_hash_index_del(&EG(regular_list), res->handle);
} else {
return SUCCESS;
}
}
-ZEND_API int zend_list_free(zend_resource *res)
+ZEND_API int ZEND_FASTCALL zend_list_free(zend_resource *res)
{
if (GC_REFCOUNT(res) <= 0) {
return zend_hash_index_del(&EG(regular_list), res->handle);
@@ -81,7 +79,7 @@ static void zend_resource_dtor(zend_resource *res)
}
-ZEND_API int zend_list_close(zend_resource *res)
+ZEND_API int ZEND_FASTCALL zend_list_close(zend_resource *res)
{
if (GC_REFCOUNT(res) <= 0) {
return zend_list_free(res);
@@ -337,6 +335,29 @@ const char *zend_rsrc_list_get_rsrc_type(zend_resource *res)
}
}
+ZEND_API zend_resource* zend_register_persistent_resource_ex(zend_string *key, void *rsrc_pointer, int rsrc_type)
+{
+ zval *zv;
+ zval tmp;
+
+ ZVAL_NEW_PERSISTENT_RES(&tmp, -1, rsrc_pointer, rsrc_type);
+ GC_MAKE_PERSISTENT_LOCAL(Z_COUNTED(tmp));
+ GC_MAKE_PERSISTENT_LOCAL(key);
+
+ zv = zend_hash_update(&EG(persistent_list), key, &tmp);
+
+ return Z_RES_P(zv);
+}
+
+ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type)
+{
+ zend_string *str = zend_string_init(key, key_len, 1);
+ zend_resource *ret = zend_register_persistent_resource_ex(str, rsrc_pointer, rsrc_type);
+
+ zend_string_release_ex(str, 1);
+ return ret;
+}
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_list.h b/Zend/zend_list.h
index 33fa3a396f..820a6a925b 100644
--- a/Zend/zend_list.h
+++ b/Zend/zend_list.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_LIST_H
#define ZEND_LIST_H
@@ -54,10 +52,10 @@ void zend_destroy_rsrc_list(HashTable *ht);
int zend_init_rsrc_list_dtors(void);
void zend_destroy_rsrc_list_dtors(void);
-ZEND_API zval *zend_list_insert(void *ptr, int type);
-ZEND_API int zend_list_free(zend_resource *res);
-ZEND_API int zend_list_delete(zend_resource *res);
-ZEND_API int zend_list_close(zend_resource *res);
+ZEND_API zval* ZEND_FASTCALL zend_list_insert(void *ptr, int type);
+ZEND_API int ZEND_FASTCALL zend_list_free(zend_resource *res);
+ZEND_API int ZEND_FASTCALL zend_list_delete(zend_resource *res);
+ZEND_API int ZEND_FASTCALL zend_list_close(zend_resource *res);
ZEND_API zend_resource *zend_register_resource(void *rsrc_pointer, int rsrc_type);
ZEND_API void *zend_fetch_resource(zend_resource *res, const char *resource_type_name, int resource_type);
@@ -68,6 +66,9 @@ ZEND_API void *zend_fetch_resource2_ex(zval *res, const char *resource_type_name
ZEND_API const char *zend_rsrc_list_get_rsrc_type(zend_resource *res);
ZEND_API int zend_fetch_list_dtor_id(const char *type_name);
+ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type);
+ZEND_API zend_resource* zend_register_persistent_resource_ex(zend_string *key, void *rsrc_pointer, int rsrc_type);
+
extern ZEND_API int le_index_ptr; /* list entry type for index pointers */
END_EXTERN_C()
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c
index de93f295e4..ea5e2cae45 100644
--- a/Zend/zend_llist.c
+++ b/Zend/zend_llist.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_llist.h"
#include "zend_sort.h"
@@ -200,7 +198,7 @@ ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func)
zend_llist_element **elements;
zend_llist_element *element, **ptr;
- if (l->count <= 0) {
+ if (l->count == 0) {
return;
}
diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h
index a197a03ebe..e98cb5c8b4 100644
--- a/Zend/zend_llist.h
+++ b/Zend/zend_llist.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_LLIST_H
#define ZEND_LLIST_H
diff --git a/Zend/zend_long.h b/Zend/zend_long.h
index 6d495427d5..2279a79755 100644
--- a/Zend/zend_long.h
+++ b/Zend/zend_long.h
@@ -16,9 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
-
#ifndef ZEND_LONG_H
#define ZEND_LONG_H
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 487ebf51c7..f73c3058e0 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef MODULES_H
#define MODULES_H
@@ -33,7 +31,7 @@
#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
#define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
-#define ZEND_MODULE_API_NO 20170718
+#define ZEND_MODULE_API_NO 20180731
#ifdef ZTS
#define USING_ZTS 1
#else
diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c
index 2b2d59b67c..b6d8864f14 100644
--- a/Zend/zend_multibyte.c
+++ b/Zend/zend_multibyte.c
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_compile.h"
#include "zend_operators.h"
diff --git a/Zend/zend_multibyte.h b/Zend/zend_multibyte.h
index 1ccb8c9a07..f6a131dbe6 100644
--- a/Zend/zend_multibyte.h
+++ b/Zend/zend_multibyte.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_MULTIBYTE_H
#define ZEND_MULTIBYTE_H
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index 26853a3cbf..1ec1af06a5 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend_portability.h"
#ifndef ZEND_MULTIPLY_H
@@ -161,11 +159,18 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si
size_t res = nmemb;
size_t m_overflow = 0;
- __asm__ ("mull %3\n\taddl %4,%0\n\tadcl $0,%1"
+ if (ZEND_CONST_COND(offset == 0, 0)) {
+ __asm__ ("mull %3\n\tadcl $0,%1"
+ : "=&a"(res), "=&d" (m_overflow)
+ : "%0"(res),
+ "rm"(size));
+ } else {
+ __asm__ ("mull %3\n\taddl %4,%0\n\tadcl $0,%1"
: "=&a"(res), "=&d" (m_overflow)
: "%0"(res),
"rm"(size),
"rm"(offset));
+ }
if (UNEXPECTED(m_overflow)) {
*overflow = 1;
@@ -188,14 +193,21 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si
# define LP_SUFF "q"
#endif
- __asm__ ("mul" LP_SUFF " %3\n\t"
- "add %4,%0\n\t"
- "adc $0,%1"
- : "=&a"(res), "=&d" (m_overflow)
- : "%0"(res),
- "rm"(size),
- "rm"(offset));
-
+ if (ZEND_CONST_COND(offset == 0, 0)) {
+ __asm__ ("mul" LP_SUFF " %3\n\t"
+ "adc $0,%1"
+ : "=&a"(res), "=&d" (m_overflow)
+ : "%0"(res),
+ "rm"(size));
+ } else {
+ __asm__ ("mul" LP_SUFF " %3\n\t"
+ "add %4,%0\n\t"
+ "adc $0,%1"
+ : "=&a"(res), "=&d" (m_overflow)
+ : "%0"(res),
+ "rm"(size),
+ "rm"(offset));
+ }
#undef LP_SUFF
if (UNEXPECTED(m_overflow)) {
*overflow = 1;
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index d0555c0031..266c257f79 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_globals.h"
#include "zend_variables.h"
@@ -35,24 +33,14 @@
#define DEBUG_OBJECT_HANDLERS 0
+#define ZEND_WRONG_PROPERTY_OFFSET 0
+
/* guard flags */
#define IN_GET (1<<0)
#define IN_SET (1<<1)
#define IN_UNSET (1<<2)
#define IN_ISSET (1<<3)
-#define Z_OBJ_PROTECT_RECURSION(zval_p) \
- do { \
- if (Z_OBJ_APPLY_COUNT_P(zval_p) >= 3) { \
- zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?"); \
- } \
- Z_OBJ_INC_APPLY_COUNT_P(zval_p); \
- } while (0)
-
-
-#define Z_OBJ_UNPROTECT_RECURSION(zval_p) \
- Z_OBJ_DEC_APPLY_COUNT_P(zval_p)
-
/*
__X accessors explanation:
@@ -76,17 +64,15 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
zend_property_info *prop_info;
zend_class_entry *ce = zobj->ce;
- ALLOC_HASHTABLE(zobj->properties);
- zend_hash_init(zobj->properties, ce->default_properties_count, NULL, ZVAL_PTR_DTOR, 0);
+ zobj->properties = zend_new_array(ce->default_properties_count);
if (ce->default_properties_count) {
- zend_hash_real_init(zobj->properties, 0);
- zobj->properties->nInternalPointer = 0;
+ zend_hash_real_init_mixed(zobj->properties);
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
if (/*prop_info->ce == ce &&*/
(prop_info->flags & ZEND_ACC_STATIC) == 0) {
if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
- zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
}
_zend_hash_append_ind(zobj->properties, prop_info->name,
@@ -102,7 +88,7 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
zval zv;
if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
- zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
}
ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
@@ -140,7 +126,7 @@ ZEND_API HashTable *zend_std_get_gc(zval *object, zval **table, int *n) /* {{{ *
*n = 0;
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)
&& EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
zobj->properties = zend_array_dup(zobj->properties);
}
return zobj->properties;
@@ -182,8 +168,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp) /* {{{ *
}
} else if (Z_TYPE(retval) == IS_NULL) {
*is_temp = 1;
- ALLOC_HASHTABLE(ht);
- zend_hash_init(ht, 0, NULL, ZVAL_PTR_DTOR, 0);
+ ht = zend_new_array(0);
return ht;
}
@@ -193,10 +178,13 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp) /* {{{ *
}
/* }}} */
-static void zend_std_call_getter(zval *object, zval *member, zval *retval) /* {{{ */
+static void zend_std_call_getter(zend_object *zobj, zend_string *prop_name, zval *retval) /* {{{ */
{
- zend_class_entry *ce = Z_OBJCE_P(object);
+ zend_class_entry *ce = zobj->ce;
zend_class_entry *orig_fake_scope = EG(fake_scope);
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval member;
EG(fake_scope) = NULL;
@@ -205,16 +193,34 @@ static void zend_std_call_getter(zval *object, zval *member, zval *retval) /* {{
it should return whether the call was successful or not
*/
- zend_call_method_with_1_params(object, ce, &ce->__get, ZEND_GET_FUNC_NAME, retval, member);
+
+ ZVAL_STR(&member, prop_name);
+
+ fci.size = sizeof(fci);
+ fci.object = zobj;
+ fci.retval = retval;
+ fci.param_count = 1;
+ fci.params = &member;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = ce->__get;
+ fcic.called_scope = ce;
+ fcic.object = zobj;
+
+ zend_call_function(&fci, &fcic);
EG(fake_scope) = orig_fake_scope;
}
/* }}} */
-static void zend_std_call_setter(zval *object, zval *member, zval *value) /* {{{ */
+static void zend_std_call_setter(zend_object *zobj, zend_string *prop_name, zval *value) /* {{{ */
{
- zend_class_entry *ce = Z_OBJCE_P(object);
+ zend_class_entry *ce = zobj->ce;
zend_class_entry *orig_fake_scope = EG(fake_scope);
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval args[2], ret;
EG(fake_scope) = NULL;
@@ -222,16 +228,37 @@ static void zend_std_call_setter(zval *object, zval *member, zval *value) /* {{{
property name
value to be set
*/
- zend_call_method_with_2_params(object, ce, &ce->__set, ZEND_SET_FUNC_NAME, NULL, member, value);
+
+ ZVAL_STR(&args[0], prop_name);
+ ZVAL_COPY_VALUE(&args[1], value);
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = zobj;
+ fci.retval = &ret;
+ fci.param_count = 2;
+ fci.params = args;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = ce->__set;
+ fcic.called_scope = ce;
+ fcic.object = zobj;
+
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
EG(fake_scope) = orig_fake_scope;
}
/* }}} */
-static void zend_std_call_unsetter(zval *object, zval *member) /* {{{ */
+static void zend_std_call_unsetter(zend_object *zobj, zend_string *prop_name) /* {{{ */
{
- zend_class_entry *ce = Z_OBJCE_P(object);
+ zend_class_entry *ce = zobj->ce;
zend_class_entry *orig_fake_scope = EG(fake_scope);
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval ret, member;
EG(fake_scope) = NULL;
@@ -239,20 +266,35 @@ static void zend_std_call_unsetter(zval *object, zval *member) /* {{{ */
property name
*/
- if (Z_REFCOUNTED_P(member)) Z_ADDREF_P(member);
+ ZVAL_STR(&member, prop_name);
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = zobj;
+ fci.retval = &ret;
+ fci.param_count = 1;
+ fci.params = &member;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
- zend_call_method_with_1_params(object, ce, &ce->__unset, ZEND_UNSET_FUNC_NAME, NULL, member);
+ fcic.function_handler = ce->__unset;
+ fcic.called_scope = ce;
+ fcic.object = zobj;
- zval_ptr_dtor(member);
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
EG(fake_scope) = orig_fake_scope;
}
/* }}} */
-static void zend_std_call_issetter(zval *object, zval *member, zval *retval) /* {{{ */
+static void zend_std_call_issetter(zend_object *zobj, zend_string *prop_name, zval *retval) /* {{{ */
{
- zend_class_entry *ce = Z_OBJCE_P(object);
+ zend_class_entry *ce = zobj->ce;
zend_class_entry *orig_fake_scope = EG(fake_scope);
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval member;
EG(fake_scope) = NULL;
@@ -262,11 +304,21 @@ static void zend_std_call_issetter(zval *object, zval *member, zval *retval) /*
it should return whether the property is set or not
*/
- if (Z_REFCOUNTED_P(member)) Z_ADDREF_P(member);
+ ZVAL_STR(&member, prop_name);
+
+ fci.size = sizeof(fci);
+ fci.object = zobj;
+ fci.retval = retval;
+ fci.param_count = 1;
+ fci.params = &member;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
- zend_call_method_with_1_params(object, ce, &ce->__isset, ZEND_ISSET_FUNC_NAME, retval, member);
+ fcic.function_handler = ce->__isset;
+ fcic.called_scope = ce;
+ fcic.object = zobj;
- zval_ptr_dtor(member);
+ zend_call_function(&fci, &fcic);
EG(fake_scope) = orig_fake_scope;
}
@@ -311,7 +363,7 @@ static zend_always_inline zend_bool is_derived_class(zend_class_entry *child_cla
}
/* }}} */
-static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce, zend_string *member, int silent, void **cache_slot) /* {{{ */
+static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *ce, zend_string *member, int silent, void **cache_slot) /* {{{ */
{
zval *zv;
zend_property_info *property_info = NULL;
@@ -319,14 +371,7 @@ static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce
zend_class_entry *scope;
if (cache_slot && EXPECTED(ce == CACHED_PTR_EX(cache_slot))) {
- return (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
- }
-
- if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
- if (!silent) {
- zend_throw_error(NULL, "Cannot access property started with '\\0'");
- }
- return ZEND_WRONG_PROPERTY_OFFSET;
+ return (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
}
if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)) {
@@ -376,8 +421,14 @@ static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce
}
} else if (UNEXPECTED(property_info == NULL)) {
exit_dynamic:
+ if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
+ if (!silent) {
+ zend_throw_error(NULL, "Cannot access property started with '\\0'");
+ }
+ return ZEND_WRONG_PROPERTY_OFFSET;
+ }
if (cache_slot) {
- CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(intptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
}
return ZEND_DYNAMIC_PROPERTY_OFFSET;
} else if (UNEXPECTED(property_info == ZEND_WRONG_PROPERTY_INFO)) {
@@ -390,7 +441,7 @@ exit_dynamic:
exit:
if (cache_slot) {
- CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(intptr_t)property_info->offset);
+ CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)property_info->offset);
}
return property_info->offset;
}
@@ -403,13 +454,6 @@ ZEND_API zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_s
uint32_t flags;
zend_class_entry *scope;
- if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
- if (!silent) {
- zend_throw_error(NULL, "Cannot access property started with '\\0'");
- }
- return ZEND_WRONG_PROPERTY_INFO;
- }
-
if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)) {
goto exit_dynamic;
}
@@ -453,6 +497,12 @@ ZEND_API zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_s
property_info = (zend_property_info*)Z_PTR_P(zv);
} else if (UNEXPECTED(property_info == NULL)) {
exit_dynamic:
+ if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
+ if (!silent) {
+ zend_throw_error(NULL, "Cannot access property started with '\\0'");
+ }
+ return ZEND_WRONG_PROPERTY_INFO;
+ }
return NULL;
} else if (UNEXPECTED(property_info == ZEND_WRONG_PROPERTY_INFO)) {
/* Information was available, but we were denied access. Error out. */
@@ -482,7 +532,7 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf
member = zend_string_copy(prop_info_name);
}
property_info = zend_get_property_info(zobj->ce, member, 1);
- zend_string_release(member);
+ zend_string_release_ex(member, 0);
if (property_info == NULL) {
/* undefined public property */
if (class_name && class_name[0] != '*') {
@@ -520,27 +570,26 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
zval *zv;
uint32_t *ptr;
- ZEND_ASSERT(GC_FLAGS(zobj) & IS_OBJ_USE_GUARDS);
+ ZEND_ASSERT(zobj->ce->ce_flags & ZEND_ACC_USE_GUARDS);
zv = zobj->properties_table + zobj->ce->default_properties_count;
if (EXPECTED(Z_TYPE_P(zv) == IS_STRING)) {
zend_string *str = Z_STR_P(zv);
if (EXPECTED(str == member) ||
/* hash values are always pred-calculated here */
(EXPECTED(ZSTR_H(str) == ZSTR_H(member)) &&
- EXPECTED(ZSTR_LEN(str) == ZSTR_LEN(member)) &&
- EXPECTED(memcmp(ZSTR_VAL(str), ZSTR_VAL(member), ZSTR_LEN(member)) == 0))) {
- return &zv->u2.property_guard;
- } else if (EXPECTED(zv->u2.property_guard == 0)) {
- zend_string_release(Z_STR_P(zv));
+ EXPECTED(zend_string_equal_content(str, member)))) {
+ return &Z_PROPERTY_GUARD_P(zv);
+ } else if (EXPECTED(Z_PROPERTY_GUARD_P(zv) == 0)) {
+ zval_ptr_dtor_str(zv);
ZVAL_STR_COPY(zv, member);
- return &zv->u2.property_guard;
+ return &Z_PROPERTY_GUARD_P(zv);
} else {
ALLOC_HASHTABLE(guards);
zend_hash_init(guards, 8, NULL, zend_property_guard_dtor, 0);
/* mark pointer as "special" using low bit */
zend_hash_add_new_ptr(guards, str,
- (void*)(((zend_uintptr_t)&zv->u2.property_guard) | 1));
- zend_string_release(Z_STR_P(zv));
+ (void*)(((zend_uintptr_t)&Z_PROPERTY_GUARD_P(zv)) | 1));
+ zval_ptr_dtor_str(zv);
ZVAL_ARR(zv, guards);
}
} else if (EXPECTED(Z_TYPE_P(zv) == IS_ARRAY)) {
@@ -552,10 +601,9 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
}
} else {
ZEND_ASSERT(Z_TYPE_P(zv) == IS_UNDEF);
- GC_FLAGS(zobj) |= IS_OBJ_HAS_GUARDS;
ZVAL_STR_COPY(zv, member);
- zv->u2.property_guard = 0;
- return &zv->u2.property_guard;
+ Z_PROPERTY_GUARD_P(zv) = 0;
+ return &Z_PROPERTY_GUARD_P(zv);
}
/* we have to allocate uint32_t separately because ht->arData may be reallocated */
ptr = (uint32_t*)emalloc(sizeof(uint32_t));
@@ -564,122 +612,132 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
}
/* }}} */
-zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
+ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
{
zend_object *zobj;
- zval tmp_member, tmp_object;
+ zend_string *name, *tmp_name;
zval *retval;
- uint32_t property_offset;
+ uintptr_t property_offset;
uint32_t *guard = NULL;
zobj = Z_OBJ_P(object);
-
- ZVAL_UNDEF(&tmp_member);
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_STR(&tmp_member, zval_get_string(member));
- member = &tmp_member;
- cache_slot = NULL;
- }
+ name = zval_get_tmp_string(member, &tmp_name);
#if DEBUG_OBJECT_HANDLERS
- fprintf(stderr, "Read object #%d property: %s\n", Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
+ fprintf(stderr, "Read object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name));
#endif
/* make zend_get_property_info silent if we have getter - we may want to use it */
- property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (type == BP_VAR_IS) || (zobj->ce->__get != NULL), cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, (type == BP_VAR_IS) || (zobj->ce->__get != NULL), cache_slot);
- if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, property_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
+ retval = OBJ_PROP(zobj, property_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ goto exit;
+ }
+ } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(property_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(property_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == name) ||
+ (EXPECTED(p->h == ZSTR_H(name)) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, name))))) {
+ retval = &p->val;
+ goto exit;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, name);
+ if (EXPECTED(retval)) {
+ if (cache_slot) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ }
goto exit;
}
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(member));
- if (EXPECTED(retval)) goto exit;
}
} else if (UNEXPECTED(EG(exception))) {
retval = &EG(uninitialized_zval);
goto exit;
}
- ZVAL_UNDEF(&tmp_object);
-
/* magic isset */
if ((type == BP_VAR_IS) && zobj->ce->__isset) {
zval tmp_result;
- guard = zend_get_property_guard(zobj, Z_STR_P(member));
+ guard = zend_get_property_guard(zobj, name);
if (!((*guard) & IN_ISSET)) {
- if (Z_TYPE(tmp_member) == IS_UNDEF) {
- ZVAL_COPY(&tmp_member, member);
- member = &tmp_member;
+ if (!tmp_name && !ZSTR_IS_INTERNED(name)) {
+ tmp_name = zend_string_copy(name);
}
- ZVAL_COPY(&tmp_object, object);
+ GC_ADDREF(zobj);
ZVAL_UNDEF(&tmp_result);
*guard |= IN_ISSET;
- zend_std_call_issetter(&tmp_object, member, &tmp_result);
+ zend_std_call_issetter(zobj, name, &tmp_result);
*guard &= ~IN_ISSET;
if (!zend_is_true(&tmp_result)) {
retval = &EG(uninitialized_zval);
- zval_ptr_dtor(&tmp_object);
+ OBJ_RELEASE(zobj);
zval_ptr_dtor(&tmp_result);
goto exit;
}
zval_ptr_dtor(&tmp_result);
+ if (zobj->ce->__get && !((*guard) & IN_GET)) {
+ goto call_getter;
+ }
+ OBJ_RELEASE(zobj);
+ } else if (zobj->ce->__get && !((*guard) & IN_GET)) {
+ goto call_getter_addref;
}
- }
-
- /* magic get */
- if (zobj->ce->__get) {
- if (guard == NULL) {
- guard = zend_get_property_guard(zobj, Z_STR_P(member));
- }
+ } else if (zobj->ce->__get) {
+ /* magic get */
+ guard = zend_get_property_guard(zobj, name);
if (!((*guard) & IN_GET)) {
/* have getter - try with it! */
- if (Z_TYPE(tmp_object) == IS_UNDEF) {
- ZVAL_COPY(&tmp_object, object);
- }
+call_getter_addref:
+ GC_ADDREF(zobj);
+call_getter:
*guard |= IN_GET; /* prevent circular getting */
- zend_std_call_getter(&tmp_object, member, rv);
+ zend_std_call_getter(zobj, name, rv);
*guard &= ~IN_GET;
if (Z_TYPE_P(rv) != IS_UNDEF) {
retval = rv;
if (!Z_ISREF_P(rv) &&
(type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET)) {
- SEPARATE_ZVAL(rv);
if (UNEXPECTED(Z_TYPE_P(rv) != IS_OBJECT)) {
- zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member));
+ zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
}
}
} else {
retval = &EG(uninitialized_zval);
}
- zval_ptr_dtor(&tmp_object);
+ OBJ_RELEASE(zobj);
goto exit;
- } else if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) {
- zval_ptr_dtor(&tmp_object);
+ } else if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
zend_throw_error(NULL, "Cannot access property started with '\\0'");
retval = &EG(uninitialized_zval);
goto exit;
}
}
- zval_ptr_dtor(&tmp_object);
-
if ((type != BP_VAR_IS)) {
- zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member));
+ zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
}
retval = &EG(uninitialized_zval);
exit:
- if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) {
- zval_ptr_dtor(&tmp_member);
- }
+ zend_tmp_string_release(tmp_name);
return retval;
}
@@ -688,35 +746,29 @@ exit:
ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
{
zend_object *zobj;
- zval tmp_member;
+ zend_string *name, *tmp_name;
zval *variable_ptr;
- uint32_t property_offset;
+ uintptr_t property_offset;
zobj = Z_OBJ_P(object);
+ name = zval_get_tmp_string(member, &tmp_name);
- ZVAL_UNDEF(&tmp_member);
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_STR(&tmp_member, zval_get_string(member));
- member = &tmp_member;
- cache_slot = NULL;
- }
+ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__set != NULL), cache_slot);
- property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (zobj->ce->__set != NULL), cache_slot);
-
- if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- variable_ptr = OBJ_PROP(zobj, property_offset);
- if (Z_TYPE_P(variable_ptr) != IS_UNDEF) {
- goto found;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
+ 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;
+ }
+ } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
+ if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) {
+ if ((variable_ptr = zend_hash_find(zobj->properties, name)) != NULL) {
found:
zend_assign_to_variable(variable_ptr, value, IS_CV);
goto exit;
@@ -728,55 +780,51 @@ found:
/* magic set */
if (zobj->ce->__set) {
- uint32_t *guard = zend_get_property_guard(zobj, Z_STR_P(member));
+ uint32_t *guard = zend_get_property_guard(zobj, name);
if (!((*guard) & IN_SET)) {
- zval tmp_object;
-
- ZVAL_COPY(&tmp_object, object);
+ GC_ADDREF(zobj);
(*guard) |= IN_SET; /* prevent circular setting */
- zend_std_call_setter(&tmp_object, member, value);
+ zend_std_call_setter(zobj, name, value);
(*guard) &= ~IN_SET;
- zval_ptr_dtor(&tmp_object);
- } else if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
+ OBJ_RELEASE(zobj);
+ } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) {
goto write_std_property;
} else {
- if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) {
+ if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
zend_throw_error(NULL, "Cannot access property started with '\\0'");
goto exit;
}
}
- } else if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- zval tmp;
-
+ } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) {
write_std_property:
if (Z_REFCOUNTED_P(value)) {
if (Z_ISREF_P(value)) {
/* if we assign referenced variable, we should separate it */
- ZVAL_COPY(&tmp, Z_REFVAL_P(value));
- value = &tmp;
+ value = Z_REFVAL_P(value);
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
} else {
Z_ADDREF_P(value);
}
}
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value);
} else {
if (!zobj->properties) {
rebuild_object_properties(zobj);
}
- zend_hash_add_new(zobj->properties, Z_STR_P(member), value);
+ zend_hash_add_new(zobj->properties, name, value);
}
}
exit:
- if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) {
- zval_ptr_dtor(&tmp_member);
- }
+ zend_tmp_string_release(tmp_name);
}
/* }}} */
-zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
+ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
@@ -786,8 +834,7 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /*
/* [] construct */
ZVAL_NULL(&tmp_offset);
} else {
- ZVAL_DEREF(offset);
- ZVAL_COPY(&tmp_offset, offset);
+ ZVAL_COPY_DEREF(&tmp_offset, offset);
}
ZVAL_COPY(&tmp_object, object);
@@ -826,7 +873,7 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /*
}
/* }}} */
-static void zend_std_write_dimension(zval *object, zval *offset, zval *value) /* {{{ */
+ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
@@ -835,8 +882,7 @@ static void zend_std_write_dimension(zval *object, zval *offset, zval *value) /*
if (!offset) {
ZVAL_NULL(&tmp_offset);
} else {
- ZVAL_DEREF(offset);
- ZVAL_COPY(&tmp_offset, offset);
+ ZVAL_COPY_DEREF(&tmp_offset, offset);
}
ZVAL_COPY(&tmp_object, object);
zend_call_method_with_2_params(&tmp_object, ce, NULL, "offsetset", NULL, &tmp_offset, value);
@@ -848,29 +894,22 @@ static void zend_std_write_dimension(zval *object, zval *offset, zval *value) /*
}
/* }}} */
-static int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */
+ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval retval, tmp_offset, tmp_object;
int result;
if (EXPECTED(instanceof_function_ex(ce, zend_ce_arrayaccess, 1) != 0)) {
- ZVAL_DEREF(offset);
- ZVAL_COPY(&tmp_offset, offset);
+ ZVAL_COPY_DEREF(&tmp_offset, offset);
ZVAL_COPY(&tmp_object, object);
zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetexists", &retval, &tmp_offset);
- if (EXPECTED(Z_TYPE(retval) != IS_UNDEF)) {
+ result = i_zend_is_true(&retval);
+ zval_ptr_dtor(&retval);
+ if (check_empty && result && EXPECTED(!EG(exception))) {
+ zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetget", &retval, &tmp_offset);
result = i_zend_is_true(&retval);
zval_ptr_dtor(&retval);
- if (check_empty && result && EXPECTED(!EG(exception))) {
- zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetget", &retval, &tmp_offset);
- if (EXPECTED(Z_TYPE(retval) != IS_UNDEF)) {
- result = i_zend_is_true(&retval);
- zval_ptr_dtor(&retval);
- }
- }
- } else {
- result = 0;
}
zval_ptr_dtor(&tmp_object);
zval_ptr_dtor(&tmp_offset);
@@ -882,19 +921,15 @@ static int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /
}
/* }}} */
-static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
+ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
{
zend_object *zobj;
- zend_string *name;
+ zend_string *name, *tmp_name;
zval *retval = NULL;
- uint32_t property_offset;
+ uintptr_t property_offset;
zobj = Z_OBJ_P(object);
- if (EXPECTED(Z_TYPE_P(member) == IS_STRING)) {
- name = Z_STR_P(member);
- } else {
- name = zval_get_string(member);
- }
+ name = zval_get_tmp_string(member, &tmp_name);
#if DEBUG_OBJECT_HANDLERS
fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name));
@@ -902,99 +937,86 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot);
- if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, property_offset);
- 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));
- }
- } else {
- /* we do have getter - fail and let it try again with usual get/set */
- retval = NULL;
- }
- }
- } else {
- if (EXPECTED(zobj->properties)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- if (EXPECTED((retval = zend_hash_find(zobj->properties, name)) != NULL)) {
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- zend_string_release(name);
- }
- return retval;
- }
- }
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
+ retval = OBJ_PROP(zobj, property_offset);
+ if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
if (EXPECTED(!zobj->ce->__get) ||
UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) {
- if (UNEXPECTED(!zobj->properties)) {
- rebuild_object_properties(zobj);
- }
- retval = zend_hash_update(zobj->properties, name, &EG(uninitialized_zval));
+ 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));
}
+ } else {
+ /* we do have getter - fail and let it try again with usual get/set */
+ retval = NULL;
+ }
+ }
+ } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
+ if (EXPECTED(zobj->properties)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ if (EXPECTED((retval = zend_hash_find(zobj->properties, name)) != NULL)) {
+ zend_tmp_string_release(tmp_name);
+ return retval;
+ }
+ }
+ if (EXPECTED(!zobj->ce->__get) ||
+ UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) {
+ if (UNEXPECTED(!zobj->properties)) {
+ rebuild_object_properties(zobj);
+ }
+ retval = zend_hash_update(zobj->properties, name, &EG(uninitialized_zval));
+ /* 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));
}
}
}
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- zend_string_release(name);
- }
+ zend_tmp_string_release(tmp_name);
return retval;
}
/* }}} */
-static void zend_std_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
+ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
{
zend_object *zobj;
- zval tmp_member;
- uint32_t property_offset;
+ zend_string *name, *tmp_name;
+ uintptr_t property_offset;
zobj = Z_OBJ_P(object);
+ name = zval_get_tmp_string(member, &tmp_name);
- ZVAL_UNDEF(&tmp_member);
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_STR(&tmp_member, zval_get_string(member));
- member = &tmp_member;
- cache_slot = NULL;
- }
-
- property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (zobj->ce->__unset != NULL), cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__unset != NULL), cache_slot);
- if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- zval *slot = OBJ_PROP(zobj, property_offset);
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
+ zval *slot = OBJ_PROP(zobj, property_offset);
- if (Z_TYPE_P(slot) != IS_UNDEF) {
- zval_ptr_dtor(slot);
- ZVAL_UNDEF(slot);
- if (zobj->properties) {
- zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND;
- }
- goto exit;
+ if (Z_TYPE_P(slot) != IS_UNDEF) {
+ zval_ptr_dtor(slot);
+ ZVAL_UNDEF(slot);
+ if (zobj->properties) {
+ HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
}
- } else if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- if (EXPECTED(zend_hash_del(zobj->properties, Z_STR_P(member)) != FAILURE)) {
- goto exit;
+ goto exit;
+ }
+ } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))
+ && EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
}
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ if (EXPECTED(zend_hash_del(zobj->properties, name) != FAILURE)) {
+ goto exit;
}
} else if (UNEXPECTED(EG(exception))) {
goto exit;
@@ -1002,18 +1024,14 @@ static void zend_std_unset_property(zval *object, zval *member, void **cache_slo
/* magic unset */
if (zobj->ce->__unset) {
- uint32_t *guard = zend_get_property_guard(zobj, Z_STR_P(member));
+ uint32_t *guard = zend_get_property_guard(zobj, name);
if (!((*guard) & IN_UNSET)) {
- zval tmp_object;
-
/* have unseter - try with it! */
- ZVAL_COPY(&tmp_object, object);
(*guard) |= IN_UNSET; /* prevent circular unsetting */
- zend_std_call_unsetter(&tmp_object, member);
+ zend_std_call_unsetter(zobj, name);
(*guard) &= ~IN_UNSET;
- zval_ptr_dtor(&tmp_object);
} else {
- if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) {
+ if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
zend_throw_error(NULL, "Cannot access property started with '\\0'");
goto exit;
}
@@ -1021,20 +1039,17 @@ static void zend_std_unset_property(zval *object, zval *member, void **cache_slo
}
exit:
- if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) {
- zval_ptr_dtor(&tmp_member);
- }
+ zend_tmp_string_release(tmp_name);
}
/* }}} */
-static void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
+ZEND_API void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
if (instanceof_function_ex(ce, zend_ce_arrayaccess, 1)) {
- ZVAL_DEREF(offset);
- ZVAL_COPY(&tmp_offset, offset);
+ ZVAL_COPY_DEREF(&tmp_offset, offset);
ZVAL_COPY(&tmp_object, object);
zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetunset", NULL, &tmp_offset);
zval_ptr_dtor(&tmp_object);
@@ -1045,13 +1060,35 @@ static void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
}
/* }}} */
+static zend_always_inline zend_function *zend_get_parent_private(zend_class_entry *scope, zend_class_entry *ce, zend_string *function_name) /* {{{ */
+{
+ zval *func;
+ zend_function *fbc;
+
+ ce = ce->parent;
+ while (ce) {
+ if (ce == scope) {
+ if ((func = zend_hash_find(&ce->function_table, function_name))) {
+ fbc = Z_FUNC_P(func);
+ if (fbc->common.fn_flags & ZEND_ACC_PRIVATE
+ && fbc->common.scope == scope) {
+ return fbc;
+ }
+ }
+ break;
+ }
+ ce = ce->parent;
+ }
+ return NULL;
+}
+/* }}} */
+
/* Ensures that we're allowed to call a private method.
* Returns the function address that should be called, or NULL
* if no such function exists.
*/
-static inline zend_function *zend_check_private_int(zend_function *fbc, zend_class_entry *ce, zend_string *function_name) /* {{{ */
+ZEND_API int zend_check_private(zend_function *fbc, zend_class_entry *ce, zend_string *function_name) /* {{{ */
{
- zval *func;
zend_class_entry *scope;
if (!ce) {
@@ -1067,32 +1104,12 @@ static inline zend_function *zend_check_private_int(zend_function *fbc, zend_cla
scope = zend_get_executed_scope();
if (fbc->common.scope == ce && scope == ce) {
/* rule #1 checks out ok, allow the function call */
- return fbc;
+ return 1;
}
/* Check rule #2 */
- ce = ce->parent;
- while (ce) {
- if (ce == scope) {
- if ((func = zend_hash_find(&ce->function_table, function_name))) {
- fbc = Z_FUNC_P(func);
- if (fbc->common.fn_flags & ZEND_ACC_PRIVATE
- && fbc->common.scope == scope) {
- return fbc;
- }
- }
- break;
- }
- ce = ce->parent;
- }
- return NULL;
-}
-/* }}} */
-
-ZEND_API int zend_check_private(zend_function *fbc, zend_class_entry *ce, zend_string *function_name) /* {{{ */
-{
- return zend_check_private_int(fbc, ce, function_name) != NULL;
+ return zend_get_parent_private(scope, ce, function_name) != NULL;
}
/* }}} */
@@ -1148,8 +1165,7 @@ ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend
func->fn_flags |= ZEND_ACC_STATIC;
}
func->opcodes = &EG(call_trampoline_op);
-
- func->prototype = fbc;
+ func->run_time_cache = (void*)(intptr_t)-1;
func->scope = fbc->common.scope;
/* reserve space for arguments, local and temorary variables */
func->T = (fbc->type == ZEND_USER_FUNCTION)? MAX(fbc->op_array.last_var + fbc->op_array.T, 2) : 2;
@@ -1175,7 +1191,7 @@ static zend_always_inline zend_function *zend_get_user_call_function(zend_class_
}
/* }}} */
-static union _zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
+ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
{
zend_object *zobj = *obj_ptr;
zval *func;
@@ -1208,42 +1224,41 @@ static union _zend_function *zend_std_get_method(zend_object **obj_ptr, zend_str
fbc = Z_FUNC_P(func);
/* Check access level */
if (fbc->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- zend_function *updated_fbc;
-
/* Ensure that if we're calling a private function, we're allowed to do so.
* If we're not and __call() handler exists, invoke it, otherwise error out.
*/
- updated_fbc = zend_check_private_int(fbc, zobj->ce, lc_method_name);
- if (EXPECTED(updated_fbc != NULL)) {
- fbc = updated_fbc;
- } else {
- if (zobj->ce->__call) {
- fbc = zend_get_user_call_function(zobj->ce, method_name);
+ scope = zend_get_executed_scope();
+ if (fbc->common.scope != scope || zobj->ce != scope) {
+ zend_function *updated_fbc = zend_get_parent_private(scope, zobj->ce, lc_method_name);
+ if (EXPECTED(updated_fbc != NULL)) {
+ fbc = updated_fbc;
} else {
- scope = zend_get_executed_scope();
- zend_throw_error(NULL, "Call to %s method %s::%s() from context '%s'", zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(method_name), scope ? ZSTR_VAL(scope->name) : "");
- fbc = NULL;
+ if (zobj->ce->__call) {
+ fbc = zend_get_user_call_function(zobj->ce, method_name);
+ } else {
+ scope = zend_get_executed_scope();
+ zend_throw_error(NULL, "Call to %s method %s::%s() from context '%s'", zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(method_name), scope ? ZSTR_VAL(scope->name) : "");
+ fbc = NULL;
+ }
}
}
- } else {
+ } else if (fbc->op_array.fn_flags & (ZEND_ACC_CHANGED|ZEND_ACC_PROTECTED)) {
/* Ensure that we haven't overridden a private function and end up calling
* the overriding public function...
*/
- if (fbc->op_array.fn_flags & (ZEND_ACC_CHANGED|ZEND_ACC_PROTECTED)) {
- scope = zend_get_executed_scope();
- }
- if (fbc->op_array.fn_flags & ZEND_ACC_CHANGED) {
- if (scope && is_derived_class(fbc->common.scope, scope)) {
- if ((func = zend_hash_find(&scope->function_table, lc_method_name)) != NULL) {
- zend_function *priv_fbc = Z_FUNC_P(func);
- if (priv_fbc->common.fn_flags & ZEND_ACC_PRIVATE
- && priv_fbc->common.scope == scope) {
- fbc = priv_fbc;
- }
+
+ scope = zend_get_executed_scope();
+ do {
+ if (fbc->op_array.fn_flags & ZEND_ACC_CHANGED) {
+ zend_function *priv_fbc = zend_get_parent_private(scope, fbc->common.scope, lc_method_name);
+ if (priv_fbc) {
+ fbc = priv_fbc;
+ break;
+ } else if (!(fbc->op_array.fn_flags & ZEND_ACC_PROTECTED)) {
+ break;
}
}
- }
- if (fbc->common.fn_flags & ZEND_ACC_PROTECTED) {
+
/* Ensure that if we're calling a protected function, we're allowed to do so.
* If we're not and __call() handler exists, invoke it, otherwise error out.
*/
@@ -1255,7 +1270,7 @@ static union _zend_function *zend_std_get_method(zend_object **obj_ptr, zend_str
fbc = NULL;
}
}
- }
+ } while (0);
}
if (UNEXPECTED(!key)) {
@@ -1299,7 +1314,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
fbc = ce->constructor;
} else {
if (UNEXPECTED(!key)) {
- zend_string_release(lc_function_name);
+ zend_string_release_ex(lc_function_name, 0);
}
if (ce->__call &&
(object = zend_get_this_object(EG(current_execute_data))) != NULL &&
@@ -1331,15 +1346,10 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
if (fbc->op_array.fn_flags & ZEND_ACC_PUBLIC) {
/* No further checks necessary, most common case */
} else if (fbc->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- zend_function *updated_fbc;
-
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
scope = zend_get_executed_scope();
- updated_fbc = zend_check_private_int(fbc, scope, lc_function_name);
- if (EXPECTED(updated_fbc != NULL)) {
- fbc = updated_fbc;
- } else {
+ if (UNEXPECTED(fbc->common.scope != scope)) {
if (ce->__callstatic) {
fbc = zend_get_user_callstatic_function(ce, function_name);
} else {
@@ -1362,13 +1372,41 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
}
if (UNEXPECTED(!key)) {
- zend_string_release(lc_function_name);
+ zend_string_release_ex(lc_function_name, 0);
}
return fbc;
}
/* }}} */
+ZEND_API void zend_class_init_statics(zend_class_entry *class_type) /* {{{ */
+{
+ int i;
+ zval *p;
+
+ if (!CE_STATIC_MEMBERS(class_type) && class_type->default_static_members_count) {
+ if (class_type->parent) {
+ zend_class_init_statics(class_type->parent);
+ }
+
+#if ZTS
+ CG(static_members_table)[(zend_intptr_t)(class_type->static_members_table)] = emalloc(sizeof(zval) * class_type->default_static_members_count);
+#else
+ class_type->static_members_table = emalloc(sizeof(zval) * class_type->default_static_members_count);
+#endif
+ for (i = 0; i < class_type->default_static_members_count; i++) {
+ p = &class_type->default_static_members_table[i];
+ if (Z_TYPE_P(p) == IS_INDIRECT) {
+ zval *q = &CE_STATIC_MEMBERS(class_type->parent)[i];
+ ZVAL_DEINDIRECT(q);
+ ZVAL_INDIRECT(&CE_STATIC_MEMBERS(class_type)[i], q);
+ } else {
+ ZVAL_COPY_OR_DUP(&CE_STATIC_MEMBERS(class_type)[i], p);
+ }
+ }
+ }
+} /* }}} */
+
ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent) /* {{{ */
{
zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name);
@@ -1394,17 +1432,22 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
return NULL;
}
}
- ret = CE_STATIC_MEMBERS(ce) + property_info->offset;
/* check if static properties were destoyed */
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ zend_class_init_statics(ce);
+ } else {
undeclared_property:
- if (!silent) {
- zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
+ if (!silent) {
+ zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
+ }
+ return NULL;
}
- ret = NULL;
}
+ ret = CE_STATIC_MEMBERS(ce) + property_info->offset;
+ ZVAL_DEINDIRECT(ret);
return ret;
}
/* }}} */
@@ -1416,7 +1459,7 @@ ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce
}
/* }}} */
-ZEND_API union _zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
+ZEND_API zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
{
zend_function *constructor = zobj->ce->constructor;
zend_class_entry *scope;
@@ -1467,59 +1510,69 @@ ZEND_API union _zend_function *zend_std_get_constructor(zend_object *zobj) /* {{
}
/* }}} */
-static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
+ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
{
zend_object *zobj1, *zobj2;
zobj1 = Z_OBJ_P(o1);
zobj2 = Z_OBJ_P(o2);
+ if (zobj1 == zobj2) {
+ return 0; /* the same object */
+ }
if (zobj1->ce != zobj2->ce) {
return 1; /* different classes */
}
if (!zobj1->properties && !zobj2->properties) {
- zval *p1, *p2, *end;
+ zend_property_info *info;
if (!zobj1->ce->default_properties_count) {
return 0;
}
- p1 = zobj1->properties_table;
- p2 = zobj2->properties_table;
- end = p1 + zobj1->ce->default_properties_count;
- Z_OBJ_PROTECT_RECURSION(o1);
- Z_OBJ_PROTECT_RECURSION(o2);
- do {
+
+ /* It's enough to protect only one of the objects.
+ * The second one may be referenced from the first and this may cause
+ * false recursion detection.
+ */
+ /* use bitwise OR to make only one conditional jump */
+ if (UNEXPECTED(Z_IS_RECURSIVE_P(o1))) {
+ zend_error_noreturn(E_ERROR, "Nesting level too deep - recursive dependency?");
+ }
+ Z_PROTECT_RECURSION_P(o1);
+
+ ZEND_HASH_FOREACH_PTR(&zobj1->ce->properties_info, info) {
+ zval *p1 = OBJ_PROP(zobj1, info->offset);
+ zval *p2 = OBJ_PROP(zobj2, info->offset);
+
+ if (info->flags & ZEND_ACC_STATIC) {
+ continue;
+ }
+
if (Z_TYPE_P(p1) != IS_UNDEF) {
if (Z_TYPE_P(p2) != IS_UNDEF) {
zval result;
if (compare_function(&result, p1, p2)==FAILURE) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
return 1;
}
if (Z_LVAL(result) != 0) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
return Z_LVAL(result);
}
} else {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
return 1;
}
} else {
if (Z_TYPE_P(p2) != IS_UNDEF) {
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ Z_UNPROTECT_RECURSION_P(o1);
return 1;
}
}
- p1++;
- p2++;
- } while (p1 != end);
- Z_OBJ_UNPROTECT_RECURSION(o1);
- Z_OBJ_UNPROTECT_RECURSION(o2);
+ } ZEND_HASH_FOREACH_END();
+
+ Z_UNPROTECT_RECURSION_P(o1);
return 0;
} else {
if (!zobj1->properties) {
@@ -1533,47 +1586,62 @@ static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
}
/* }}} */
-static int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
+ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
{
zend_object *zobj;
int result;
zval *value = NULL;
- zval tmp_member;
- uint32_t property_offset;
+ zend_string *name, *tmp_name;
+ uintptr_t property_offset;
zobj = Z_OBJ_P(object);
+ name = zval_get_tmp_string(member, &tmp_name);
- ZVAL_UNDEF(&tmp_member);
- if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
- ZVAL_STR(&tmp_member, zval_get_string(member));
- member = &tmp_member;
- cache_slot = NULL;
- }
-
- property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), 1, cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, 1, cache_slot);
- if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) {
- if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- value = OBJ_PROP(zobj, property_offset);
- if (Z_TYPE_P(value) != IS_UNDEF) {
- goto found;
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
+ value = OBJ_PROP(zobj, property_offset);
+ if (Z_TYPE_P(value) != IS_UNDEF) {
+ goto found;
+ }
+ } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(property_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(property_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == name) ||
+ (EXPECTED(p->h == ZSTR_H(name)) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, name))))) {
+ value = &p->val;
+ goto found;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
}
- } else if (EXPECTED(zobj->properties != NULL) &&
- (value = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) {
+ value = zend_hash_find(zobj->properties, name);
+ if (value) {
+ if (cache_slot) {
+ uintptr_t idx = (char*)value - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ }
found:
- switch (has_set_exists) {
- case 0:
+ if (has_set_exists == ZEND_PROPERTY_NOT_EMPTY) {
+ result = zend_is_true(value);
+ } else if (has_set_exists < ZEND_PROPERTY_NOT_EMPTY) {
+ ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_ISSET);
ZVAL_DEREF(value);
result = (Z_TYPE_P(value) != IS_NULL);
- break;
- default:
- result = zend_is_true(value);
- break;
- case 2:
+ } else {
+ ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_EXISTS);
result = 1;
- break;
+ }
+ goto exit;
}
- goto exit;
}
} else if (UNEXPECTED(EG(exception))) {
result = 0;
@@ -1581,54 +1649,44 @@ found:
}
result = 0;
- if ((has_set_exists != 2) && zobj->ce->__isset) {
- uint32_t *guard = zend_get_property_guard(zobj, Z_STR_P(member));
+ if ((has_set_exists != ZEND_PROPERTY_EXISTS) && zobj->ce->__isset) {
+ uint32_t *guard = zend_get_property_guard(zobj, name);
if (!((*guard) & IN_ISSET)) {
zval rv;
- zval tmp_object;
/* have issetter - try with it! */
- if (Z_TYPE(tmp_member) == IS_UNDEF) {
- ZVAL_COPY(&tmp_member, member);
- member = &tmp_member;
+ if (!tmp_name && !ZSTR_IS_INTERNED(name)) {
+ tmp_name = zend_string_copy(name);
}
- ZVAL_COPY(&tmp_object, object);
+ GC_ADDREF(zobj);
(*guard) |= IN_ISSET; /* prevent circular getting */
- zend_std_call_issetter(&tmp_object, member, &rv);
- if (Z_TYPE(rv) != IS_UNDEF) {
- result = zend_is_true(&rv);
- zval_ptr_dtor(&rv);
- if (has_set_exists && result) {
- if (EXPECTED(!EG(exception)) && zobj->ce->__get && !((*guard) & IN_GET)) {
- (*guard) |= IN_GET;
- zend_std_call_getter(&tmp_object, member, &rv);
- (*guard) &= ~IN_GET;
- if (Z_TYPE(rv) != IS_UNDEF) {
- result = i_zend_is_true(&rv);
- zval_ptr_dtor(&rv);
- } else {
- result = 0;
- }
- } else {
- result = 0;
- }
+ zend_std_call_issetter(zobj, name, &rv);
+ result = zend_is_true(&rv);
+ zval_ptr_dtor(&rv);
+ if (has_set_exists == ZEND_PROPERTY_NOT_EMPTY && result) {
+ if (EXPECTED(!EG(exception)) && zobj->ce->__get && !((*guard) & IN_GET)) {
+ (*guard) |= IN_GET;
+ zend_std_call_getter(zobj, name, &rv);
+ (*guard) &= ~IN_GET;
+ result = i_zend_is_true(&rv);
+ zval_ptr_dtor(&rv);
+ } else {
+ result = 0;
}
}
(*guard) &= ~IN_ISSET;
- zval_ptr_dtor(&tmp_object);
+ OBJ_RELEASE(zobj);
}
}
exit:
- if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) {
- zval_ptr_dtor(&tmp_member);
- }
+ zend_tmp_string_release(tmp_name);
return result;
}
/* }}} */
-zend_string *zend_std_object_get_class_name(const zend_object *zobj) /* {{{ */
+ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj) /* {{{ */
{
return zend_string_copy(zobj->ce->name);
}
@@ -1660,16 +1718,10 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
return FAILURE;
}
if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
- if (readobj == writeobj) {
- zval_ptr_dtor(readobj);
- }
ZVAL_COPY_VALUE(writeobj, &retval);
return SUCCESS;
} else {
zval_ptr_dtor(&retval);
- if (readobj == writeobj) {
- zval_ptr_dtor(readobj);
- }
ZVAL_EMPTY_STRING(writeobj);
zend_error(E_RECOVERABLE_ERROR, "Method %s::__toString() must return a string value", ZSTR_VAL(ce->name));
return SUCCESS;
@@ -1677,24 +1729,23 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
}
return FAILURE;
case _IS_BOOL:
- ZVAL_BOOL(writeobj, 1);
+ ZVAL_TRUE(writeobj);
return SUCCESS;
case IS_LONG:
ce = Z_OBJCE_P(readobj);
zend_error(E_NOTICE, "Object of class %s could not be converted to int", ZSTR_VAL(ce->name));
- if (readobj == writeobj) {
- zval_dtor(readobj);
- }
ZVAL_LONG(writeobj, 1);
return SUCCESS;
case IS_DOUBLE:
ce = Z_OBJCE_P(readobj);
zend_error(E_NOTICE, "Object of class %s could not be converted to float", ZSTR_VAL(ce->name));
- if (readobj == writeobj) {
- zval_dtor(readobj);
- }
ZVAL_DOUBLE(writeobj, 1);
return SUCCESS;
+ case _IS_NUMBER:
+ ce = Z_OBJCE_P(readobj);
+ zend_error(E_NOTICE, "Object of class %s could not be converted to number", ZSTR_VAL(ce->name));
+ ZVAL_LONG(writeobj, 1);
+ return SUCCESS;
default:
ZVAL_NULL(writeobj);
break;
@@ -1703,18 +1754,12 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
}
/* }}} */
-int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr) /* {{{ */
+ZEND_API int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr) /* {{{ */
{
zval *func;
- zend_class_entry *ce;
-
- if (Z_TYPE_P(obj) != IS_OBJECT) {
- return FAILURE;
- }
-
- ce = Z_OBJCE_P(obj);
+ zend_class_entry *ce = Z_OBJCE_P(obj);
- if ((func = zend_hash_find(&ce->function_table, ZSTR_KNOWN(ZEND_STR_MAGIC_INVOKE))) == NULL) {
+ if ((func = zend_hash_find_ex(&ce->function_table, ZSTR_KNOWN(ZEND_STR_MAGIC_INVOKE), 1)) == NULL) {
return FAILURE;
}
*fptr_ptr = Z_FUNC_P(func);
@@ -1733,7 +1778,7 @@ int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **f
}
/* }}} */
-ZEND_API zend_object_handlers std_object_handlers = {
+ZEND_API const zend_object_handlers std_object_handlers = {
0, /* offset */
zend_object_std_dtor, /* free_obj */
@@ -1755,7 +1800,7 @@ ZEND_API zend_object_handlers std_object_handlers = {
zend_std_get_method, /* get_method */
NULL, /* call_method */
zend_std_get_constructor, /* get_constructor */
- zend_std_object_get_class_name, /* get_class_name */
+ zend_std_get_class_name, /* get_class_name */
zend_std_compare_objects, /* compare_objects */
zend_std_cast_object_tostring, /* cast_object */
NULL, /* count_elements */
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 527aa70a1c..acc4b7575f 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -12,23 +12,29 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_OBJECT_HANDLERS_H
#define ZEND_OBJECT_HANDLERS_H
struct _zend_property_info;
#define ZEND_WRONG_PROPERTY_INFO \
- ((struct _zend_property_info*)((zend_intptr_t)-1))
+ ((struct _zend_property_info*)((intptr_t)-1))
+
+#define ZEND_DYNAMIC_PROPERTY_OFFSET ((uintptr_t)(intptr_t)(-1))
+
+#define IS_VALID_PROPERTY_OFFSET(offset) ((intptr_t)(offset) > 0)
+#define IS_WRONG_PROPERTY_OFFSET(offset) ((intptr_t)(offset) == 0)
+#define IS_DYNAMIC_PROPERTY_OFFSET(offset) ((intptr_t)(offset) < 0)
+
+#define IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(offset) (offset == ZEND_DYNAMIC_PROPERTY_OFFSET)
+#define ZEND_DECODE_DYN_PROP_OFFSET(offset) ((uintptr_t)(-(intptr_t)(offset) - 2))
+#define ZEND_ENCODE_DYN_PROP_OFFSET(offset) ((uintptr_t)(-((intptr_t)(offset) + 2)))
-#define ZEND_DYNAMIC_PROPERTY_OFFSET ((uint32_t)(-1))
-#define ZEND_WRONG_PROPERTY_OFFSET ((uint32_t)(-2))
/* The following rule applies to read_property() and read_dimension() implementations:
If you return a zval which is not otherwise referenced by the extension or the engine's
@@ -92,8 +98,8 @@ typedef HashTable *(*zend_object_get_debug_info_t)(zval *object, int *is_temp);
/* Andi - EX(fbc) (function being called) needs to be initialized already in the INIT fcall opcode so that the parameters can be parsed the right way. We need to add another callback for this.
*/
typedef int (*zend_object_call_method_t)(zend_string *method, zend_object *object, INTERNAL_FUNCTION_PARAMETERS);
-typedef union _zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
-typedef union _zend_function *(*zend_object_get_constructor_t)(zend_object *object);
+typedef zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
+typedef zend_function *(*zend_object_get_constructor_t)(zend_object *object);
/* Object maintenance/destruction */
typedef void (*zend_object_dtor_obj_t)(zend_object *object);
@@ -107,7 +113,8 @@ typedef zend_string *(*zend_object_get_class_name_t)(const zend_object *object);
typedef int (*zend_object_compare_t)(zval *object1, zval *object2);
typedef int (*zend_object_compare_zvals_t)(zval *resul, zval *op1, zval *op2);
-/* Cast an object to some other type
+/* Cast an object to some other type.
+ * readobj and retval must point to distinct zvals.
*/
typedef int (*zend_object_cast_t)(zval *readobj, zval *retval, int type);
@@ -115,7 +122,7 @@ typedef int (*zend_object_cast_t)(zval *readobj, zval *retval, int type);
* Returns FAILURE if the object does not have any sense of overloaded dimensions */
typedef int (*zend_object_count_elements_t)(zval *object, zend_long *count);
-typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zend_object **obj_ptr);
+typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr);
typedef HashTable *(*zend_object_get_gc_t)(zval *object, zval **table, int *n);
@@ -156,23 +163,44 @@ struct _zend_object_handlers {
};
BEGIN_EXTERN_C()
-extern ZEND_API zend_object_handlers std_object_handlers;
+extern const ZEND_API zend_object_handlers std_object_handlers;
+
+#define zend_get_std_object_handlers() \
+ (&std_object_handlers)
#define zend_get_function_root_class(fbc) \
((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope)
-ZEND_API union _zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
+#define ZEND_PROPERTY_ISSET 0x0 /* Property exists and is not NULL */
+#define ZEND_PROPERTY_NOT_EMPTY ZEND_ISEMPTY /* Property is not empty */
+#define ZEND_PROPERTY_EXISTS 0x2 /* Property exists */
+
+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 ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
-ZEND_API union _zend_function *zend_std_get_constructor(zend_object *object);
+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);
ZEND_API HashTable *zend_std_get_properties(zval *object);
+ZEND_API HashTable *zend_std_get_gc(zval *object, zval **table, int *n);
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 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);
+ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value);
+ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty);
+ZEND_API void zend_std_unset_dimension(zval *object, zval *offset);
+ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key);
+ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj);
+ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
+ZEND_API int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr);
ZEND_API void rebuild_object_properties(zend_object *zobj);
-ZEND_API int zend_check_private(union _zend_function *fbc, zend_class_entry *ce, zend_string *function_name);
+ZEND_API int zend_check_private(zend_function *fbc, zend_class_entry *ce, zend_string *function_name);
ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 7a93c1bdb1..b0a50df113 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_globals.h"
#include "zend_variables.h"
@@ -27,15 +25,14 @@
#include "zend_interfaces.h"
#include "zend_exceptions.h"
-ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce)
+ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
{
- GC_REFCOUNT(object) = 1;
+ GC_SET_REFCOUNT(object, 1);
GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
object->ce = ce;
object->properties = NULL;
zend_objects_store_put(object);
if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
- GC_FLAGS(object) |= IS_OBJ_USE_GUARDS;
ZVAL_UNDEF(object->properties_table + object->ce->default_properties_count);
}
}
@@ -46,7 +43,7 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
if (object->properties) {
if (EXPECTED(!(GC_FLAGS(object->properties) & IS_ARRAY_IMMUTABLE))) {
- if (EXPECTED(--GC_REFCOUNT(object->properties) == 0)
+ if (EXPECTED(GC_DELREF(object->properties) == 0)
&& EXPECTED(GC_TYPE(object->properties) != IS_NULL)) {
zend_array_destroy(object->properties);
}
@@ -60,13 +57,12 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
p++;
} while (p != end);
}
- if (UNEXPECTED(GC_FLAGS(object) & IS_OBJ_HAS_GUARDS)) {
+ if (UNEXPECTED(object->ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
if (EXPECTED(Z_TYPE_P(p) == IS_STRING)) {
- zend_string_release(Z_STR_P(p));
- } else {
+ zval_ptr_dtor_str(p);
+ } else if (Z_TYPE_P(p) == IS_ARRAY) {
HashTable *guards;
- ZEND_ASSERT(Z_TYPE_P(p) == IS_ARRAY);
guards = Z_ARRVAL_P(p);
ZEND_ASSERT(guards != NULL);
zend_hash_destroy(guards);
@@ -81,8 +77,10 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
if (destructor) {
zend_object *old_exception;
- zval obj;
zend_class_entry *orig_fake_scope;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval ret;
if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
@@ -126,8 +124,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
}
}
- GC_REFCOUNT(object)++;
- ZVAL_OBJ(&obj, object);
+ GC_ADDREF(object);
/* Make sure that destructors are protected from previously thrown exceptions.
* For example, if an exception was thrown in a function and when the function's
@@ -144,7 +141,24 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
}
orig_fake_scope = EG(fake_scope);
EG(fake_scope) = NULL;
- zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
+
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = object;
+ fci.retval = &ret;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = destructor;
+ fcic.called_scope = object->ce;
+ fcic.object = object;
+
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
+
if (old_exception) {
if (EG(exception)) {
zend_exception_set_previous(EG(exception), old_exception);
@@ -152,12 +166,12 @@ ZEND_API void zend_objects_destroy_object(zend_object *object)
EG(exception) = old_exception;
}
}
- zval_ptr_dtor(&obj);
+ OBJ_RELEASE(object);
EG(fake_scope) = orig_fake_scope;
}
}
-ZEND_API zend_object *zend_objects_new(zend_class_entry *ce)
+ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce)
{
zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce));
@@ -166,7 +180,7 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce)
return object;
}
-ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *old_object)
+ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object)
{
if (old_object->ce->default_properties_count) {
zval *src = old_object->properties_table;
@@ -184,7 +198,7 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
/* fast copy */
if (EXPECTED(old_object->handlers == &std_object_handlers)) {
if (EXPECTED(!(GC_FLAGS(old_object->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(old_object->properties)++;
+ GC_ADDREF(old_object->properties);
}
new_object->properties = old_object->properties;
return;
@@ -198,15 +212,14 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
zend_string *key;
if (!new_object->properties) {
- ALLOC_HASHTABLE(new_object->properties);
- zend_hash_init(new_object->properties, zend_hash_num_elements(old_object->properties), NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_real_init(new_object->properties, 0);
+ new_object->properties = zend_new_array(zend_hash_num_elements(old_object->properties));
+ zend_hash_real_init_mixed(new_object->properties);
} else {
zend_hash_extend(new_object->properties, new_object->properties->nNumUsed + zend_hash_num_elements(old_object->properties), 0);
}
- new_object->properties->u.v.flags |=
- old_object->properties->u.v.flags & HASH_FLAG_HAS_EMPTY_IND;
+ HT_FLAGS(new_object->properties) |=
+ HT_FLAGS(old_object->properties) & HASH_FLAG_HAS_EMPTY_IND;
ZEND_HASH_FOREACH_KEY_VAL(old_object->properties, num_key, key, prop) {
if (Z_TYPE_P(prop) == IS_INDIRECT) {
@@ -224,12 +237,29 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
}
if (old_object->ce->clone) {
- zval new_obj;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcic;
+ zval ret;
+
+ GC_ADDREF(new_object);
+
+ ZVAL_UNDEF(&ret);
+
+ fci.size = sizeof(fci);
+ fci.object = new_object;
+ fci.retval = &ret;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 1;
+ ZVAL_UNDEF(&fci.function_name); /* Unused */
+
+ fcic.function_handler = new_object->ce->clone;
+ fcic.called_scope = new_object->ce;
+ fcic.object = new_object;
- ZVAL_OBJ(&new_obj, new_object);
- Z_ADDREF(new_obj);
- zend_call_method_with_0_params(&new_obj, old_object->ce, &old_object->ce->clone, ZEND_CLONE_FUNC_NAME, NULL);
- zval_ptr_dtor(&new_obj);
+ zend_call_function(&fci, &fcic);
+ zval_ptr_dtor(&ret);
+ OBJ_RELEASE(new_object);
}
}
diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h
index 9aee205bd5..6857765525 100644
--- a/Zend/zend_objects.h
+++ b/Zend/zend_objects.h
@@ -12,24 +12,23 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_OBJECTS_H
#define ZEND_OBJECTS_H
#include "zend.h"
BEGIN_EXTERN_C()
-ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce);
+ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce);
+ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce);
+ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object);
+
ZEND_API void zend_object_std_dtor(zend_object *object);
-ZEND_API zend_object *zend_objects_new(zend_class_entry *ce);
ZEND_API void zend_objects_destroy_object(zend_object *object);
-ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *old_object);
ZEND_API zend_object *zend_objects_clone_obj(zval *object);
END_EXTERN_C()
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index 3e3c8a8005..c5ac9708e5 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -12,21 +12,19 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_globals.h"
#include "zend_variables.h"
#include "zend_API.h"
#include "zend_objects_API.h"
-ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init_size)
+ZEND_API void ZEND_FASTCALL zend_objects_store_init(zend_objects_store *objects, uint32_t init_size)
{
objects->object_buckets = (zend_object **) emalloc(init_size * sizeof(zend_object*));
objects->top = 1; /* Skip 0 so that handles are true */
@@ -35,13 +33,13 @@ ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init
memset(&objects->object_buckets[0], 0, sizeof(zend_object*));
}
-ZEND_API void zend_objects_store_destroy(zend_objects_store *objects)
+ZEND_API void ZEND_FASTCALL zend_objects_store_destroy(zend_objects_store *objects)
{
efree(objects->object_buckets);
objects->object_buckets = NULL;
}
-ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects)
+ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_store *objects)
{
EG(flags) |= EG_FLAGS_OBJECT_STORE_NO_REUSE;
if (objects->top > 1) {
@@ -49,15 +47,15 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects)
for (i = 1; i < objects->top; i++) {
zend_object *obj = objects->object_buckets[i];
if (IS_OBJ_VALID(obj)) {
- if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
- GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
+ if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
if (obj->handlers->dtor_obj
&& (obj->handlers->dtor_obj != zend_objects_destroy_object
|| obj->ce->destructor)) {
- GC_REFCOUNT(obj)++;
+ GC_ADDREF(obj);
obj->handlers->dtor_obj(obj);
- GC_REFCOUNT(obj)--;
+ GC_DELREF(obj);
}
}
}
@@ -65,7 +63,7 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects)
}
}
-ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects)
+ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_store *objects)
{
if (objects->object_buckets && objects->top > 1) {
zend_object **obj_ptr = objects->object_buckets + 1;
@@ -75,14 +73,14 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects)
zend_object *obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) {
- GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
}
obj_ptr++;
} while (obj_ptr != end);
}
}
-ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown)
+ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown)
{
zend_object **obj_ptr, **end, *obj;
@@ -99,12 +97,12 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
obj_ptr--;
obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) {
- if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
- GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
+ if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
+ GC_ADD_FLAGS(obj, IS_OBJ_FREE_CALLED);
if (obj->handlers->free_obj && obj->handlers->free_obj != zend_object_std_dtor) {
- GC_REFCOUNT(obj)++;
+ GC_ADDREF(obj);
obj->handlers->free_obj(obj);
- GC_REFCOUNT(obj)--;
+ GC_DELREF(obj);
}
}
}
@@ -114,12 +112,12 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
obj_ptr--;
obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) {
- if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
- GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
+ if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
+ GC_ADD_FLAGS(obj, IS_OBJ_FREE_CALLED);
if (obj->handlers->free_obj) {
- GC_REFCOUNT(obj)++;
+ GC_ADDREF(obj);
obj->handlers->free_obj(obj);
- GC_REFCOUNT(obj)--;
+ GC_DELREF(obj);
}
}
}
@@ -130,7 +128,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
/* Store objects API */
-ZEND_API void zend_objects_store_put(zend_object *object)
+ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object)
{
int handle;
@@ -153,61 +151,54 @@ ZEND_API void zend_objects_store_put(zend_object *object)
EG(objects_store).object_buckets[handle] = object;
}
-#define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle) \
- SET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \
- EG(objects_store).free_list_head = handle;
-
-ZEND_API void zend_objects_store_del(zend_object *object) /* {{{ */
+ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ */
{
+ ZEND_ASSERT(GC_REFCOUNT(object) == 0);
+
+ /* GC might have released this object already. */
+ if (UNEXPECTED(GC_TYPE(object) == IS_NULL)) {
+ return;
+ }
+
/* Make sure we hold a reference count during the destructor call
otherwise, when the destructor ends the storage might be freed
when the refcount reaches 0 a second time
*/
- if (EG(objects_store).object_buckets &&
- IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle])) {
- if (GC_REFCOUNT(object) == 0) {
- if (!(GC_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) {
- GC_FLAGS(object) |= IS_OBJ_DESTRUCTOR_CALLED;
-
- if (object->handlers->dtor_obj
- && (object->handlers->dtor_obj != zend_objects_destroy_object
- || object->ce->destructor)) {
- GC_REFCOUNT(object)++;
- object->handlers->dtor_obj(object);
- GC_REFCOUNT(object)--;
- }
- }
+ if (!(OBJ_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ GC_ADD_FLAGS(object, IS_OBJ_DESTRUCTOR_CALLED);
+
+ if (object->handlers->dtor_obj
+ && (object->handlers->dtor_obj != zend_objects_destroy_object
+ || object->ce->destructor)) {
+ GC_ADDREF(object);
+ object->handlers->dtor_obj(object);
+ GC_DELREF(object);
+ }
+ }
- if (GC_REFCOUNT(object) == 0) {
- uint32_t handle = object->handle;
- void *ptr;
-
- EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object);
- if (!(GC_FLAGS(object) & IS_OBJ_FREE_CALLED)) {
- GC_FLAGS(object) |= IS_OBJ_FREE_CALLED;
- if (object->handlers->free_obj) {
- GC_REFCOUNT(object)++;
- object->handlers->free_obj(object);
- GC_REFCOUNT(object)--;
- }
- }
- ptr = ((char*)object) - object->handlers->offset;
- GC_REMOVE_FROM_BUFFER(object);
- efree(ptr);
- ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle);
+ if (GC_REFCOUNT(object) == 0) {
+ uint32_t handle = object->handle;
+ void *ptr;
+
+ ZEND_ASSERT(EG(objects_store).object_buckets != NULL);
+ ZEND_ASSERT(IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle]));
+ EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object);
+ if (!(OBJ_FLAGS(object) & IS_OBJ_FREE_CALLED)) {
+ GC_ADD_FLAGS(object, IS_OBJ_FREE_CALLED);
+ if (object->handlers->free_obj) {
+ GC_ADDREF(object);
+ object->handlers->free_obj(object);
+ GC_DELREF(object);
}
- } else {
- GC_REFCOUNT(object)--;
}
+ ptr = ((char*)object) - object->handlers->offset;
+ GC_REMOVE_FROM_BUFFER(object);
+ efree(ptr);
+ ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle);
}
}
/* }}} */
-ZEND_API zend_object_handlers *zend_get_std_object_handlers(void)
-{
- return &std_object_handlers;
-}
-
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 0bb51c162d..25c263863c 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_OBJECTS_API_H
#define ZEND_OBJECTS_API_H
@@ -37,6 +35,10 @@
(o) = (zend_object*)((((zend_uintptr_t)(n)) << 1) | OBJ_BUCKET_INVALID); \
} while (0)
+#define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(h) do { \
+ SET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[(h)], EG(objects_store).free_list_head); \
+ EG(objects_store).free_list_head = (h); \
+ } while (0)
#define OBJ_RELEASE(obj) zend_object_release(obj)
@@ -49,30 +51,29 @@ typedef struct _zend_objects_store {
/* Global store handling functions */
BEGIN_EXTERN_C()
-ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init_size);
-ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects);
-ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects);
-ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown);
-ZEND_API void zend_objects_store_destroy(zend_objects_store *objects);
+ZEND_API void ZEND_FASTCALL zend_objects_store_init(zend_objects_store *objects, uint32_t init_size);
+ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_store *objects);
+ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_store *objects);
+ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown);
+ZEND_API void ZEND_FASTCALL zend_objects_store_destroy(zend_objects_store *objects);
/* Store API functions */
-ZEND_API void zend_objects_store_put(zend_object *object);
-ZEND_API void zend_objects_store_del(zend_object *object);
+ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object);
+ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object);
/* Called when the ctor was terminated by an exception */
static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj)
{
- GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
}
#define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj
-ZEND_API zend_object_handlers *zend_get_std_object_handlers(void);
END_EXTERN_C()
static zend_always_inline void zend_object_release(zend_object *obj)
{
- if (--GC_REFCOUNT(obj) == 0) {
+ if (GC_DELREF(obj) == 0) {
zend_objects_store_del(obj);
} else if (UNEXPECTED(GC_MAY_LEAK((zend_refcounted*)obj))) {
gc_possible_root((zend_refcounted*)obj);
@@ -86,6 +87,17 @@ static zend_always_inline size_t zend_object_properties_size(zend_class_entry *c
((ce->ce_flags & ZEND_ACC_USE_GUARDS) ? 0 : 1));
}
+/* Allocates object type and zeros it, but not the properties.
+ * Properties MUST be initialized using object_properties_init(). */
+static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_entry *ce) {
+ void *obj = emalloc(obj_size + zend_object_properties_size(ce));
+ /* Subtraction of sizeof(zval) is necessary, because zend_object_properties_size() may be
+ * -sizeof(zval), if the object has no properties. */
+ memset(obj, 0, obj_size - sizeof(zval));
+ return obj;
+}
+
+
#endif /* ZEND_OBJECTS_H */
/*
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 0972742dde..a7f32de379 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <stdio.h>
#include "zend.h"
@@ -27,6 +25,7 @@
#include "zend_compile.h"
#include "zend_extensions.h"
#include "zend_API.h"
+#include "zend_sort.h"
#include "zend_vm.h"
@@ -44,11 +43,6 @@ static void zend_extension_op_array_dtor_handler(zend_extension *extension, zend
}
}
-static void op_array_alloc_ops(zend_op_array *op_array, uint32_t size)
-{
- op_array->opcodes = erealloc(op_array->opcodes, size * sizeof(zend_op));
-}
-
void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size)
{
op_array->type = type;
@@ -59,8 +53,7 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->refcount = (uint32_t *) emalloc(sizeof(uint32_t));
*op_array->refcount = 1;
op_array->last = 0;
- op_array->opcodes = NULL;
- op_array_alloc_ops(op_array, initial_ops_size);
+ op_array->opcodes = emalloc(initial_ops_size * sizeof(zend_op));
op_array->last_var = 0;
op_array->vars = NULL;
@@ -87,8 +80,6 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->fn_flags = 0;
- op_array->early_binding = -1;
-
op_array->last_literal = 0;
op_array->literals = NULL;
@@ -104,30 +95,10 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
ZEND_API void destroy_zend_function(zend_function *function)
{
- if (function->type == ZEND_USER_FUNCTION) {
- destroy_op_array(&function->op_array);
- } else {
- ZEND_ASSERT(function->type == ZEND_INTERNAL_FUNCTION);
- ZEND_ASSERT(function->common.function_name);
- zend_string_release(function->common.function_name);
+ zval tmp;
- if (function->common.arg_info &&
- (function->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS))) {
- uint32_t i;
- uint32_t num_args = function->common.num_args + 1;
- zend_arg_info *arg_info = function->common.arg_info - 1;
-
- if (function->common.fn_flags & ZEND_ACC_VARIADIC) {
- num_args++;
- }
- for (i = 0 ; i < num_args; i++) {
- if (ZEND_TYPE_IS_CLASS(arg_info[i].type)) {
- zend_string_release(ZEND_TYPE_NAME(arg_info[i].type));
- }
- }
- free(arg_info);
- }
- }
+ ZVAL_PTR(&tmp, function);
+ zend_function_dtor(&tmp);
}
ZEND_API void zend_function_dtor(zval *zv)
@@ -141,8 +112,8 @@ ZEND_API void zend_function_dtor(zval *zv)
} else {
ZEND_ASSERT(function->type == ZEND_INTERNAL_FUNCTION);
ZEND_ASSERT(function->common.function_name);
- zend_string_release(function->common.function_name);
-#ifndef ZTS
+ zend_string_release_ex(function->common.function_name, 1);
+
if ((function->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) &&
!function->common.scope && function->common.arg_info) {
@@ -155,12 +126,12 @@ ZEND_API void zend_function_dtor(zval *zv)
}
for (i = 0 ; i < num_args; i++) {
if (ZEND_TYPE_IS_CLASS(arg_info[i].type)) {
- zend_string_release(ZEND_TYPE_NAME(arg_info[i].type));
+ zend_string_release_ex(ZEND_TYPE_NAME(arg_info[i].type), 1);
}
}
free(arg_info);
}
-#endif
+
if (!(function->common.fn_flags & ZEND_ACC_ARENA_ALLOCATED)) {
pefree(function, 1);
}
@@ -179,7 +150,6 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce)
#else
ce->static_members_table = NULL;
#endif
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
while (p != end) {
i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
p++;
@@ -197,18 +167,15 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce)
if (ce->trait_aliases) {
size_t i = 0;
while (ce->trait_aliases[i]) {
- if (ce->trait_aliases[i]->trait_method) {
- if (ce->trait_aliases[i]->trait_method->method_name) {
- zend_string_release(ce->trait_aliases[i]->trait_method->method_name);
- }
- if (ce->trait_aliases[i]->trait_method->class_name) {
- zend_string_release(ce->trait_aliases[i]->trait_method->class_name);
- }
- efree(ce->trait_aliases[i]->trait_method);
+ if (ce->trait_aliases[i]->trait_method.method_name) {
+ zend_string_release_ex(ce->trait_aliases[i]->trait_method.method_name, 0);
+ }
+ if (ce->trait_aliases[i]->trait_method.class_name) {
+ zend_string_release_ex(ce->trait_aliases[i]->trait_method.class_name, 0);
}
if (ce->trait_aliases[i]->alias) {
- zend_string_release(ce->trait_aliases[i]->alias);
+ zend_string_release_ex(ce->trait_aliases[i]->alias, 0);
}
efree(ce->trait_aliases[i]);
@@ -219,21 +186,15 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce)
}
if (ce->trait_precedences) {
- size_t i = 0;
+ int i = 0;
+ int j;
while (ce->trait_precedences[i]) {
- zend_string_release(ce->trait_precedences[i]->trait_method->method_name);
- zend_string_release(ce->trait_precedences[i]->trait_method->class_name);
- efree(ce->trait_precedences[i]->trait_method);
-
- if (ce->trait_precedences[i]->exclude_from_classes) {
- size_t j = 0;
- zend_trait_precedence *cur_precedence = ce->trait_precedences[i];
- while (cur_precedence->exclude_from_classes[j].class_name) {
- zend_string_release(cur_precedence->exclude_from_classes[j].class_name);
- j++;
- }
- efree(ce->trait_precedences[i]->exclude_from_classes);
+ zend_string_release_ex(ce->trait_precedences[i]->trait_method.method_name, 0);
+ zend_string_release_ex(ce->trait_precedences[i]->trait_method.class_name, 0);
+
+ for (j = 0; j < ce->trait_precedences[i]->num_excludes; j++) {
+ zend_string_release_ex(ce->trait_precedences[i]->exclude_class_names[j], 0);
}
efree(ce->trait_precedences[i]);
i++;
@@ -246,9 +207,7 @@ ZEND_API void destroy_zend_class(zval *zv)
{
zend_property_info *prop_info;
zend_class_entry *ce = Z_PTR_P(zv);
-#ifndef ZTS
zend_function *fn;
-#endif
if (--ce->refcount > 0) {
return;
@@ -276,24 +235,25 @@ ZEND_API void destroy_zend_class(zval *zv)
efree(ce->default_static_members_table);
}
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (prop_info->ce == ce || (prop_info->flags & ZEND_ACC_SHADOW)) {
- zend_string_release(prop_info->name);
+ if (prop_info->ce == ce ||
+ ((prop_info->flags & ZEND_ACC_SHADOW) && prop_info->ce == ce->parent)) {
+ zend_string_release_ex(prop_info->name, 0);
if (prop_info->doc_comment) {
- zend_string_release(prop_info->doc_comment);
+ zend_string_release_ex(prop_info->doc_comment, 0);
}
}
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(&ce->properties_info);
- zend_string_release(ce->name);
+ zend_string_release_ex(ce->name, 0);
zend_hash_destroy(&ce->function_table);
if (zend_hash_num_elements(&ce->constants_table)) {
zend_class_constant *c;
ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) {
if (c->ce == ce) {
- zval_ptr_dtor(&c->value);
+ zval_ptr_dtor_nogc(&c->value);
if (c->doc_comment) {
- zend_string_release(c->doc_comment);
+ zend_string_release_ex(c->doc_comment, 0);
}
}
} ZEND_HASH_FOREACH_END();
@@ -303,7 +263,7 @@ ZEND_API void destroy_zend_class(zval *zv)
efree(ce->interfaces);
}
if (ce->info.user.doc_comment) {
- zend_string_release(ce->info.user.doc_comment);
+ zend_string_release_ex(ce->info.user.doc_comment, 0);
}
_destroy_zend_class_traits_info(ce);
@@ -331,8 +291,9 @@ ZEND_API void destroy_zend_class(zval *zv)
free(ce->default_static_members_table);
}
zend_hash_destroy(&ce->properties_info);
- zend_string_release(ce->name);
-#ifndef ZTS
+ zend_string_release_ex(ce->name, 1);
+
+ /* TODO: eliminate this loop for classes without functions with arg_info */
ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) {
if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) &&
fn->common.scope == ce) {
@@ -340,19 +301,25 @@ ZEND_API void destroy_zend_class(zval *zv)
fn->common.scope = NULL;
}
} ZEND_HASH_FOREACH_END();
-#endif
+
zend_hash_destroy(&ce->function_table);
if (zend_hash_num_elements(&ce->constants_table)) {
zend_class_constant *c;
ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) {
- zval_internal_ptr_dtor(&c->value);
- if (c->doc_comment && c->ce == ce) {
- zend_string_release(c->doc_comment);
+ if (c->ce == ce) {
+ zval_internal_ptr_dtor(&c->value);
+ if (c->doc_comment) {
+ zend_string_release_ex(c->doc_comment, 1);
+ }
}
+ free(c);
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(&ce->constants_table);
}
+ if (ce->iterator_funcs_ptr) {
+ free(ce->iterator_funcs_ptr);
+ }
if (ce->num_interfaces > 0) {
free(ce->interfaces);
}
@@ -370,13 +337,11 @@ void zend_class_add_ref(zval *zv)
ZEND_API void destroy_op_array(zend_op_array *op_array)
{
- zval *literal = op_array->literals;
- zval *end;
uint32_t i;
if (op_array->static_variables &&
!(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
- if (--GC_REFCOUNT(op_array->static_variables) == 0) {
+ if (GC_DELREF(op_array->static_variables) == 0) {
zend_array_destroy(op_array->static_variables);
}
}
@@ -396,26 +361,30 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
i = op_array->last_var;
while (i > 0) {
i--;
- zend_string_release(op_array->vars[i]);
+ zend_string_release_ex(op_array->vars[i], 0);
}
efree(op_array->vars);
}
- if (literal) {
- end = literal + op_array->last_literal;
+ if (op_array->literals) {
+ zval *literal = op_array->literals;
+ zval *end = literal + op_array->last_literal;
while (literal < end) {
zval_ptr_dtor_nogc(literal);
literal++;
}
- efree(op_array->literals);
+ if (ZEND_USE_ABS_CONST_ADDR
+ || !(op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO)) {
+ efree(op_array->literals);
+ }
}
efree(op_array->opcodes);
if (op_array->function_name) {
- zend_string_release(op_array->function_name);
+ zend_string_release_ex(op_array->function_name, 0);
}
if (op_array->doc_comment) {
- zend_string_release(op_array->doc_comment);
+ zend_string_release_ex(op_array->doc_comment, 0);
}
if (op_array->live_range) {
efree(op_array->live_range);
@@ -441,52 +410,16 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
}
for (i = 0 ; i < num_args; i++) {
if (arg_info[i].name) {
- zend_string_release(arg_info[i].name);
+ zend_string_release_ex(arg_info[i].name, 0);
}
if (ZEND_TYPE_IS_CLASS(arg_info[i].type)) {
- zend_string_release(ZEND_TYPE_NAME(arg_info[i].type));
+ zend_string_release_ex(ZEND_TYPE_NAME(arg_info[i].type), 0);
}
}
efree(arg_info);
}
}
-void init_op(zend_op *op)
-{
- memset(op, 0, sizeof(zend_op));
- op->lineno = CG(zend_lineno);
- SET_UNUSED(op->result);
-}
-
-zend_op *get_next_op(zend_op_array *op_array)
-{
- uint32_t next_op_num = op_array->last++;
- zend_op *next_op;
-
- if (next_op_num >= CG(context).opcodes_size) {
- CG(context).opcodes_size *= 4;
- op_array_alloc_ops(op_array, CG(context).opcodes_size);
- }
-
- next_op = &(op_array->opcodes[next_op_num]);
-
- init_op(next_op);
-
- return next_op;
-}
-
-uint32_t get_next_op_number(zend_op_array *op_array)
-{
- return op_array->last;
-}
-
-zend_brk_cont_element *get_next_brk_cont_element(void)
-{
- CG(context).last_brk_cont++;
- CG(context).brk_cont_array = erealloc(CG(context).brk_cont_array, sizeof(zend_brk_cont_element) * CG(context).last_brk_cont);
- return &CG(context).brk_cont_array[CG(context).last_brk_cont-1];
-}
-
static void zend_update_extended_info(zend_op_array *op_array)
{
zend_op *opline = op_array->opcodes, *end=opline+op_array->last;
@@ -556,6 +489,20 @@ static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const ze
return opline->opcode == ZEND_BRK ? jmp_to->brk : jmp_to->cont;
}
+/* Live ranges must be sorted by increasing start opline */
+static int cmp_live_range(const zend_live_range *a, const zend_live_range *b) {
+ return a->start - b->start;
+}
+static void swap_live_range(zend_live_range *a, zend_live_range *b) {
+ zend_live_range tmp = *a;
+ *a = *b;
+ *b = tmp;
+}
+static void zend_sort_live_ranges(zend_op_array *op_array) {
+ zend_sort(op_array->live_range, op_array->last_live_range, sizeof(zend_live_range),
+ (compare_func_t) cmp_live_range, (swap_func_t) swap_live_range);
+}
+
ZEND_API int pass_two(zend_op_array *op_array)
{
zend_op *opline, *end;
@@ -576,6 +523,8 @@ ZEND_API int pass_two(zend_op_array *op_array)
op_array->vars = (zend_string**) erealloc(op_array->vars, sizeof(zend_string*)*op_array->last_var);
CG(context).vars_size = op_array->last_var;
}
+
+#if ZEND_USE_ABS_CONST_ADDR
if (CG(context).opcodes_size != op_array->last) {
op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, sizeof(zend_op)*op_array->last);
CG(context).opcodes_size = op_array->last;
@@ -584,10 +533,38 @@ ZEND_API int pass_two(zend_op_array *op_array)
op_array->literals = (zval*)erealloc(op_array->literals, sizeof(zval) * op_array->last_literal);
CG(context).literals_size = op_array->last_literal;
}
+#else
+ op_array->opcodes = (zend_op *) erealloc(op_array->opcodes,
+ ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16) +
+ sizeof(zval) * op_array->last_literal);
+ if (op_array->literals) {
+ memcpy(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16),
+ op_array->literals, sizeof(zval) * op_array->last_literal);
+ efree(op_array->literals);
+ op_array->literals = (zval*)(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16));
+ }
+ CG(context).opcodes_size = op_array->last;
+ CG(context).literals_size = op_array->last_literal;
+#endif
+
+ /* Needs to be set directly after the opcode/literal reallocation, to ensure destruction
+ * happens correctly if any of the following fixups generate a fatal error. */
+ op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO;
+
opline = op_array->opcodes;
end = opline + op_array->last;
while (opline < end) {
switch (opline->opcode) {
+ case ZEND_RECV_INIT:
+ {
+ zval *val = CT_CONSTANT(opline->op2);
+ if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
+ uint32_t slot = ZEND_MM_ALIGNED_SIZE_EX(op_array->cache_size, 8);
+ Z_CACHE_SLOT_P(val) = slot;
+ op_array->cache_size += sizeof(zval);
+ }
+ }
+ break;
case ZEND_FAST_CALL:
opline->op1.opline_num = op_array->try_catch_array[opline->op1.num].finally_op;
ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1);
@@ -644,12 +621,16 @@ ZEND_API int pass_two(zend_op_array *op_array)
}
case ZEND_DECLARE_ANON_CLASS:
case ZEND_DECLARE_ANON_INHERITED_CLASS:
- case ZEND_CATCH:
case ZEND_FE_FETCH_R:
case ZEND_FE_FETCH_RW:
/* absolute index to relative offset */
opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value);
break;
+ case ZEND_CATCH:
+ if (!(opline->extended_value & ZEND_LAST_CATCH)) {
+ ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2);
+ }
+ break;
case ZEND_RETURN:
case ZEND_RETURN_BY_REF:
if (op_array->fn_flags & ZEND_ACC_GENERATOR) {
@@ -671,12 +652,12 @@ ZEND_API int pass_two(zend_op_array *op_array)
}
}
if (opline->op1_type == IS_CONST) {
- ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1);
+ ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op1);
} else if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
opline->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op1.var);
}
if (opline->op2_type == IS_CONST) {
- ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op2);
+ ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op2);
} else if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) {
opline->op2.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op2.var);
}
@@ -690,6 +671,7 @@ ZEND_API int pass_two(zend_op_array *op_array)
if (op_array->live_range) {
int i;
+ zend_sort_live_ranges(op_array);
for (i = 0; i < op_array->last_live_range; i++) {
op_array->live_range[i].var =
(uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + (op_array->live_range[i].var / sizeof(zval))) |
@@ -697,7 +679,6 @@ ZEND_API int pass_two(zend_op_array *op_array)
}
}
- op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO;
return 0;
}
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 7f1e426e83..cd857ee217 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <ctype.h>
#include "zend.h"
@@ -80,12 +78,12 @@ static const unsigned char tolower_map[256] = {
zend_binary_strncasecmp
*/
-ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, int str_len) /* {{{ */
+ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len) /* {{{ */
{
int retval;
if (!str_len) {
- str_len = (int)strlen(str);
+ str_len = strlen(str);
}
retval = ZEND_STRTOL(str, NULL, 0);
if (str_len>0) {
@@ -108,12 +106,12 @@ ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, int str_len) /* {{{ */
}
/* }}} */
-ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, int str_len) /* {{{ */
+ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len) /* {{{ */
{
zend_long retval;
if (!str_len) {
- str_len = (int)strlen(str);
+ str_len = strlen(str);
}
retval = ZEND_STRTOL(str, NULL, 0);
if (str_len>0) {
@@ -136,7 +134,27 @@ ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, int str_len) /* {{{
}
/* }}} */
-void ZEND_FASTCALL _convert_scalar_to_number(zval *op, zend_bool silent) /* {{{ */
+/* {{{ convert_object_to_type: dst will be either ctype or UNDEF */
+#define convert_object_to_type(op, dst, ctype, conv_func) \
+ ZVAL_UNDEF(dst); \
+ if (Z_OBJ_HT_P(op)->cast_object) { \
+ if (Z_OBJ_HT_P(op)->cast_object(op, dst, ctype) == FAILURE) { \
+ zend_error(E_RECOVERABLE_ERROR, \
+ "Object of class %s could not be converted to %s", ZSTR_VAL(Z_OBJCE_P(op)->name),\
+ zend_get_type_by_const(ctype)); \
+ } \
+ } else if (Z_OBJ_HT_P(op)->get) { \
+ zval *newop = Z_OBJ_HT_P(op)->get(op, dst); \
+ if (Z_TYPE_P(newop) != IS_OBJECT) { \
+ /* for safety - avoid loop */ \
+ ZVAL_COPY_VALUE(dst, newop); \
+ conv_func(dst); \
+ } \
+ }
+
+/* }}} */
+
+static void ZEND_FASTCALL _convert_scalar_to_number(zval *op, zend_bool silent, zend_bool check) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -154,7 +172,7 @@ try_again:
zend_error(E_WARNING, "A non-numeric value encountered");
}
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
break;
}
case IS_NULL:
@@ -172,7 +190,21 @@ try_again:
}
break;
case IS_OBJECT:
- convert_to_long_base(op, 10);
+ {
+ zval dst;
+
+ convert_object_to_type(op, &dst, _IS_NUMBER, convert_scalar_to_number);
+ if (check && UNEXPECTED(EG(exception))) {
+ return;
+ }
+ zval_ptr_dtor(op);
+
+ if (Z_TYPE(dst) == IS_LONG || Z_TYPE(dst) == IS_DOUBLE) {
+ ZVAL_COPY_VALUE(op, &dst);
+ } else {
+ ZVAL_LONG(op, 1);
+ }
+ }
break;
}
}
@@ -180,83 +212,67 @@ try_again:
ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
{
- _convert_scalar_to_number(op, 1);
-}
-/* }}} */
-
-/* {{{ zendi_convert_scalar_to_number */
-#define zendi_convert_scalar_to_number(op, holder, result, silent) \
- if (Z_TYPE_P(op) != IS_LONG) { \
- if (op==result && Z_TYPE_P(op) != IS_OBJECT) { \
- _convert_scalar_to_number(op, silent); \
- } else { \
- switch (Z_TYPE_P(op)) { \
- case IS_STRING: \
- if ((Z_TYPE_INFO(holder)=is_numeric_string(Z_STRVAL_P(op), Z_STRLEN_P(op), &Z_LVAL(holder), &Z_DVAL(holder), silent ? 1 : -1)) == 0) { \
- ZVAL_LONG(&(holder), 0); \
- if (!silent) { \
- zend_error(E_WARNING, "A non-numeric value encountered"); \
- } \
- } \
- (op) = &(holder); \
- break; \
- case IS_NULL: \
- case IS_FALSE: \
- ZVAL_LONG(&(holder), 0); \
- (op) = &(holder); \
- break; \
- case IS_TRUE: \
- ZVAL_LONG(&(holder), 1); \
- (op) = &(holder); \
- break; \
- case IS_RESOURCE: \
- ZVAL_LONG(&(holder), Z_RES_HANDLE_P(op)); \
- (op) = &(holder); \
- break; \
- case IS_OBJECT: \
- ZVAL_COPY(&(holder), op); \
- convert_to_long_base(&(holder), 10); \
- if (UNEXPECTED(EG(exception))) { \
- if (result != op1) { \
- ZVAL_UNDEF(result); \
- } \
- return FAILURE; \
- } \
- if (Z_TYPE(holder) == IS_LONG) { \
- if (op == result) { \
- zval_ptr_dtor(op); \
- ZVAL_LONG(op, Z_LVAL(holder)); \
- } else { \
- (op) = &(holder); \
- } \
- } \
- break; \
- } \
- } \
- }
-
+ _convert_scalar_to_number(op, 1, 0);
+}
/* }}} */
-/* {{{ convert_object_to_type: dst will be either ctype or UNDEF */
-#define convert_object_to_type(op, dst, ctype, conv_func) \
- ZVAL_UNDEF(dst); \
- if (Z_OBJ_HT_P(op)->cast_object) { \
- if (Z_OBJ_HT_P(op)->cast_object(op, dst, ctype) == FAILURE) { \
- zend_error(E_RECOVERABLE_ERROR, \
- "Object of class %s could not be converted to %s", ZSTR_VAL(Z_OBJCE_P(op)->name),\
- zend_get_type_by_const(ctype)); \
- } \
- } else if (Z_OBJ_HT_P(op)->get) { \
- zval *newop = Z_OBJ_HT_P(op)->get(op, dst); \
- if (Z_TYPE_P(newop) != IS_OBJECT) { \
- /* for safety - avoid loop */ \
- ZVAL_COPY_VALUE(dst, newop); \
- conv_func(dst); \
- } \
+/* {{{ _zendi_convert_scalar_to_number_ex */
+static zend_always_inline zval* _zendi_convert_scalar_to_number_ex(zval *op, zval *holder, zend_bool silent) /* {{{ */
+{
+ switch (Z_TYPE_P(op)) {
+ case IS_NULL:
+ case IS_FALSE:
+ ZVAL_LONG(holder, 0);
+ return holder;
+ case IS_TRUE:
+ ZVAL_LONG(holder, 1);
+ return holder;
+ case IS_STRING:
+ if ((Z_TYPE_INFO_P(holder) = is_numeric_string(Z_STRVAL_P(op), Z_STRLEN_P(op), &Z_LVAL_P(holder), &Z_DVAL_P(holder), silent ? 1 : -1)) == 0) {
+ ZVAL_LONG(holder, 0);
+ if (!silent) {
+ zend_error(E_WARNING, "A non-numeric value encountered");
+ }
+ }
+ return holder;
+ case IS_RESOURCE:
+ ZVAL_LONG(holder, Z_RES_HANDLE_P(op));
+ return holder;
+ case IS_OBJECT:
+ convert_object_to_type(op, holder, _IS_NUMBER, convert_scalar_to_number);
+ if (UNEXPECTED(EG(exception)) ||
+ UNEXPECTED(Z_TYPE_P(holder) != IS_LONG && Z_TYPE_P(holder) != IS_DOUBLE)) {
+ ZVAL_LONG(holder, 1);
+ }
+ return holder;
+ case IS_LONG:
+ case IS_DOUBLE:
+ default:
+ return op;
}
+}
+/* }}} */
+/* {{{ _zendi_convert_scalar_to_number */
+static zend_never_inline zval* ZEND_FASTCALL _zendi_convert_scalar_to_number(zval *op, zval *holder) /* {{{ */
+{
+ return _zendi_convert_scalar_to_number_ex(op, holder, 1);
+}
/* }}} */
+/* {{{ _zendi_convert_scalar_to_number_noisy */
+static zend_never_inline zval* ZEND_FASTCALL _zendi_convert_scalar_to_number_noisy(zval *op, zval *holder) /* {{{ */
+{
+ return _zendi_convert_scalar_to_number_ex(op, holder, 0);
+}
+/* }}} */
+
+#define zendi_convert_scalar_to_number(op, holder, result, silent) \
+ ((Z_TYPE_P(op) == IS_LONG || Z_TYPE_P(op) == IS_DOUBLE) ? (op) : \
+ (((op) == result) ? (_convert_scalar_to_number((op), silent, 1), (op)) : \
+ (silent ? _zendi_convert_scalar_to_number((op), holder) : \
+ _zendi_convert_scalar_to_number_noisy((op), holder))))
+
#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, op, op_func) \
do { \
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) { \
@@ -340,7 +356,7 @@ try_again:
} else {
ZVAL_LONG(op, ZEND_STRTOL(ZSTR_VAL(str), NULL, base));
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
break;
case IS_ARRAY:
@@ -353,12 +369,11 @@ try_again:
zval dst;
convert_object_to_type(op, &dst, IS_LONG, convert_to_long);
- zval_dtor(op);
+ zval_ptr_dtor(op);
if (Z_TYPE(dst) == IS_LONG) {
- ZVAL_COPY_VALUE(op, &dst);
+ ZVAL_LONG(op, Z_LVAL(dst));
} else {
-
ZVAL_LONG(op, 1);
}
return;
@@ -400,7 +415,7 @@ try_again:
zend_string *str = Z_STR_P(op);
ZVAL_DOUBLE(op, zend_strtod(ZSTR_VAL(str), NULL));
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
break;
case IS_ARRAY:
@@ -413,10 +428,10 @@ try_again:
zval dst;
convert_object_to_type(op, &dst, IS_DOUBLE, convert_to_double);
- zval_dtor(op);
+ zval_ptr_dtor(op);
if (Z_TYPE(dst) == IS_DOUBLE) {
- ZVAL_COPY_VALUE(op, &dst);
+ ZVAL_DOUBLE(op, Z_DVAL(dst));
} else {
ZVAL_DOUBLE(op, 1.0);
}
@@ -472,7 +487,7 @@ try_again:
} else {
ZVAL_TRUE(op);
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
break;
case IS_ARRAY:
@@ -485,10 +500,10 @@ try_again:
zval dst;
convert_object_to_type(op, &dst, _IS_BOOL, convert_to_boolean);
- zval_dtor(op);
+ zval_ptr_dtor(op);
- if (Z_TYPE(dst) == IS_FALSE || Z_TYPE(dst) == IS_TRUE) {
- ZVAL_COPY_VALUE(op, &dst);
+ if (Z_TYPE_INFO(dst) == IS_FALSE || Z_TYPE_INFO(dst) == IS_TRUE) {
+ Z_TYPE_INFO_P(op) = Z_TYPE_INFO(dst);
} else {
ZVAL_TRUE(op);
}
@@ -502,21 +517,21 @@ try_again:
}
/* }}} */
-ZEND_API void ZEND_FASTCALL _convert_to_cstring(zval *op ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API void ZEND_FASTCALL _convert_to_cstring(zval *op) /* {{{ */
{
if (Z_TYPE_P(op) == IS_DOUBLE) {
zend_string *str;
double dval = Z_DVAL_P(op);
- str = zend_strpprintf(0, "%.*H", (int) EG(precision), dval);
+ str = zend_strpprintf_unchecked(0, "%.*H", (int) EG(precision), dval);
ZVAL_NEW_STR(op, str);
} else {
- _convert_to_string(op ZEND_FILE_LINE_CC);
+ _convert_to_string(op);
}
}
/* }}} */
-ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
+ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -532,10 +547,9 @@ try_again:
case IS_STRING:
break;
case IS_RESOURCE: {
- char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
- int len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
+ zend_string *str = zend_strpprintf(0, "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
zval_ptr_dtor(op);
- ZVAL_NEW_STR(op, zend_string_init(buf, len, 0));
+ ZVAL_NEW_STR(op, str);
break;
}
case IS_LONG: {
@@ -560,7 +574,7 @@ try_again:
zval dst;
convert_object_to_type(op, &dst, IS_STRING, convert_to_string);
- zval_dtor(op);
+ zval_ptr_dtor(op);
if (Z_TYPE(dst) == IS_STRING) {
ZVAL_COPY_VALUE(op, &dst);
@@ -579,13 +593,9 @@ try_again:
static void convert_scalar_to_array(zval *op) /* {{{ */
{
- zval entry;
-
- ZVAL_COPY_VALUE(&entry, op);
-
- ZVAL_NEW_ARR(op);
- zend_hash_init(Z_ARRVAL_P(op), 8, NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_index_add_new(Z_ARRVAL_P(op), 0, &entry);
+ HashTable *ht = zend_new_array(1);
+ zend_hash_index_add_new(ht, 0, op);
+ ZVAL_ARR(op, ht);
}
/* }}} */
@@ -603,19 +613,13 @@ try_again:
if (Z_OBJ_HT_P(op)->get_properties) {
HashTable *obj_ht = Z_OBJ_HT_P(op)->get_properties(op);
if (obj_ht) {
- zend_array *arr;
-
/* fast copy */
- if (!Z_OBJCE_P(op)->default_properties_count &&
- obj_ht == Z_OBJ_P(op)->properties &&
- !ZEND_HASH_GET_APPLY_COUNT(Z_OBJ_P(op)->properties) &&
- EXPECTED(Z_OBJ_P(op)->handlers == &std_object_handlers)) {
- arr = zend_proptable_to_symtable(obj_ht, 0);
- } else {
- arr = zend_proptable_to_symtable(obj_ht, 1);
- }
- zval_dtor(op);
- ZVAL_ARR(op, arr);
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(op)->default_properties_count ||
+ Z_OBJ_P(op)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ zval_ptr_dtor(op);
+ ZVAL_ARR(op, obj_ht);
return;
}
} else {
@@ -623,19 +627,20 @@ try_again:
convert_object_to_type(op, &dst, IS_ARRAY, convert_to_array);
if (Z_TYPE(dst) == IS_ARRAY) {
- zval_dtor(op);
+ zval_ptr_dtor(op);
ZVAL_COPY_VALUE(op, &dst);
return;
}
}
- zval_dtor(op);
+ zval_ptr_dtor(op);
+ /*ZVAL_EMPTY_ARRAY(op);*/
array_init(op);
}
break;
case IS_NULL:
- ZVAL_NEW_ARR(op);
- zend_hash_init(Z_ARRVAL_P(op), 8, NULL, ZVAL_PTR_DTOR, 0);
+ /*ZVAL_EMPTY_ARRAY(op);*/
+ array_init(op);
break;
case IS_REFERENCE:
zend_unwrap_reference(op);
@@ -653,14 +658,20 @@ try_again:
switch (Z_TYPE_P(op)) {
case IS_ARRAY:
{
- HashTable *ht = Z_ARR_P(op);
- ht = zend_symtable_to_proptable(ht);
+ HashTable *ht = zend_symtable_to_proptable(Z_ARR_P(op));
+ zend_object *obj;
+
if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
/* TODO: try not to duplicate immutable arrays as well ??? */
ht = zend_array_dup(ht);
+ } else if (ht != Z_ARR_P(op)) {
+ zval_ptr_dtor(op);
+ } else {
+ GC_DELREF(ht);
}
- zval_dtor(op);
- object_and_properties_init(op, zend_standard_class_def, ht);
+ obj = zend_objects_new(zend_standard_class_def);
+ obj->properties = ht;
+ ZVAL_OBJ(op, obj);
break;
}
case IS_OBJECT:
@@ -788,7 +799,7 @@ try_again:
}
/* }}} */
-ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op) /* {{{ */
+ZEND_API zend_long ZEND_FASTCALL zval_get_long_func(zval *op) /* {{{ */
{
return _zval_get_long_func_ex(op, 1);
}
@@ -800,7 +811,7 @@ static zend_long ZEND_FASTCALL _zval_get_long_func_noisy(zval *op) /* {{{ */
}
/* }}} */
-ZEND_API double ZEND_FASTCALL _zval_get_double_func(zval *op) /* {{{ */
+ZEND_API double ZEND_FASTCALL zval_get_double_func(zval *op) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -839,7 +850,7 @@ try_again:
}
/* }}} */
-ZEND_API zend_string* ZEND_FASTCALL _zval_get_string_func(zval *op) /* {{{ */
+ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -850,11 +861,7 @@ try_again:
case IS_TRUE:
return ZSTR_CHAR('1');
case IS_RESOURCE: {
- char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
- int len;
-
- len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
- return zend_string_init(buf, len, 0);
+ return zend_strpprintf(0, "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
}
case IS_LONG: {
return zend_long_to_str(Z_LVAL_P(op));
@@ -894,114 +901,165 @@ try_again:
}
/* }}} */
-ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2) /* {{{ */
+static zend_never_inline void ZEND_FASTCALL add_function_array(zval *result, zval *op1, zval *op2) /* {{{ */
{
- zval op1_copy, op2_copy;
- int converted = 0;
+ if ((result == op1) && (result == op2)) {
+ /* $a += $a */
+ return;
+ }
+ if (result != op1) {
+ ZVAL_ARR(result, zend_array_dup(Z_ARR_P(op1)));
+ } else {
+ SEPARATE_ARRAY(result);
+ }
+ zend_hash_merge(Z_ARRVAL_P(result), Z_ARRVAL_P(op2), zval_add_ref, 0);
+}
+/* }}} */
- while (1) {
- switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
- case TYPE_PAIR(IS_LONG, IS_LONG):
- fast_long_add_function(result, op1, op2);
- return SUCCESS;
- case TYPE_PAIR(IS_LONG, IS_DOUBLE):
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
- return SUCCESS;
+static zend_always_inline int add_function_fast(zval *result, zval *op1, zval *op2) /* {{{ */
+{
+ zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
- case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
- return SUCCESS;
+ if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_LONG))) {
+ fast_long_add_function(result, op1, op2);
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_ARRAY, IS_ARRAY))) {
+ add_function_array(result, op1, op2);
+ return SUCCESS;
+ } else {
+ return FAILURE;
+ }
+} /* }}} */
- case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- return SUCCESS;
+static zend_never_inline int ZEND_FASTCALL add_function_slow(zval *result, zval *op1, zval *op2) /* {{{ */
+{
+ zval op1_copy, op2_copy;
+ int converted = 0;
- case TYPE_PAIR(IS_ARRAY, IS_ARRAY):
- if ((result == op1) && (result == op2)) {
- /* $a += $a */
- return SUCCESS;
- }
+ while (1) {
+ if (Z_ISREF_P(op1)) {
+ op1 = Z_REFVAL_P(op1);
+ } else if (Z_ISREF_P(op2)) {
+ op2 = Z_REFVAL_P(op2);
+ } else if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
+
+ if (EXPECTED(op1 != op2)) {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
+ } else {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = op1;
+ }
+ if (EG(exception)) {
if (result != op1) {
- ZVAL_DUP(result, op1);
+ ZVAL_UNDEF(result);
}
- zend_hash_merge(Z_ARRVAL_P(result), Z_ARRVAL_P(op2), zval_add_ref, 0);
- return SUCCESS;
+ return FAILURE;
+ }
+ converted = 1;
+ } else {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE; /* unknown datatype */
+ }
+ if (add_function_fast(result, op1, op2) == SUCCESS) {
+ return SUCCESS;
+ }
+ }
+} /* }}} */
- default:
- if (Z_ISREF_P(op1)) {
- op1 = Z_REFVAL_P(op1);
- } else if (Z_ISREF_P(op2)) {
- op2 = Z_REFVAL_P(op2);
- } else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
+ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2) /* {{{ */
+{
+ if (add_function_fast(result, op1, op2) == SUCCESS) {
+ return SUCCESS;
+ } else {
+ return add_function_slow(result, op1, op2);
+ }
+}
+/* }}} */
- if (EXPECTED(op1 != op2)) {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- op2 = op1;
- }
- converted = 1;
- } else {
- if (result != op1) {
- ZVAL_UNDEF(result);
- }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
- }
- }
+static zend_always_inline int sub_function_fast(zval *result, zval *op1, zval *op2) /* {{{ */
+{
+ zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
+
+ if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_LONG))) {
+ fast_long_sub_function(result, op1, op2);
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
+ return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
+ return SUCCESS;
+ } else {
+ return FAILURE;
}
}
/* }}} */
-ZEND_API int ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2) /* {{{ */
+static zend_never_inline int ZEND_FASTCALL sub_function_slow(zval *result, zval *op1, zval *op2) /* {{{ */
{
zval op1_copy, op2_copy;
int converted = 0;
-
while (1) {
- switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
- case TYPE_PAIR(IS_LONG, IS_LONG):
- fast_long_sub_function(result, op1, op2);
- return SUCCESS;
- case TYPE_PAIR(IS_LONG, IS_DOUBLE):
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
- return SUCCESS;
-
- case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
- return SUCCESS;
-
- case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- return SUCCESS;
-
- default:
- if (Z_ISREF_P(op1)) {
- op1 = Z_REFVAL_P(op1);
- } else if (Z_ISREF_P(op2)) {
- op2 = Z_REFVAL_P(op2);
- } else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
-
- if (EXPECTED(op1 != op2)) {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- op2 = op1;
- }
- converted = 1;
- } else {
- if (result != op1) {
- ZVAL_UNDEF(result);
- }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
+ if (Z_ISREF_P(op1)) {
+ op1 = Z_REFVAL_P(op1);
+ } else if (Z_ISREF_P(op2)) {
+ op2 = Z_REFVAL_P(op2);
+ } else if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
+
+ if (EXPECTED(op1 != op2)) {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
+ } else {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = op1;
+ }
+ if (EG(exception)) {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
}
+ return FAILURE;
+ }
+ converted = 1;
+ } else {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE; /* unknown datatype */
+ }
+ if (sub_function_fast(result, op1, op2) == SUCCESS) {
+ return SUCCESS;
}
}
+
+}
+/* }}} */
+
+ZEND_API int ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2) /* {{{ */
+{
+ if (sub_function_fast(result, op1, op2) == SUCCESS) {
+ return SUCCESS;
+ } else {
+ return sub_function_slow(result, op1, op2);
+ }
}
/* }}} */
@@ -1011,50 +1069,56 @@ ZEND_API int ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2) /* {
int converted = 0;
while (1) {
- switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
- case TYPE_PAIR(IS_LONG, IS_LONG): {
- zend_long overflow;
+ zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1),Z_LVAL_P(op2), Z_LVAL_P(result),Z_DVAL_P(result),overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- return SUCCESS;
+ if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_LONG))) {
+ zend_long overflow;
- }
- case TYPE_PAIR(IS_LONG, IS_DOUBLE):
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- return SUCCESS;
+ ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1),Z_LVAL_P(op2), Z_LVAL_P(result),Z_DVAL_P(result),overflow);
+ Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
+ return SUCCESS;
- case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ return SUCCESS;
- case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE):
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
+ return SUCCESS;
- default:
- if (Z_ISREF_P(op1)) {
- op1 = Z_REFVAL_P(op1);
- } else if (Z_ISREF_P(op2)) {
- op2 = Z_REFVAL_P(op2);
- } else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
+ return SUCCESS;
- if (EXPECTED(op1 != op2)) {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- op2 = op1;
- }
- converted = 1;
+ } else {
+ if (Z_ISREF_P(op1)) {
+ op1 = Z_REFVAL_P(op1);
+ } else if (Z_ISREF_P(op2)) {
+ op2 = Z_REFVAL_P(op2);
+ } else if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
+
+ if (EXPECTED(op1 != op2)) {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
} else {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = op1;
+ }
+ if (EG(exception)) {
if (result != op1) {
ZVAL_UNDEF(result);
}
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
+ return FAILURE;
}
+ converted = 1;
+ } else {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE; /* unknown datatype */
+ }
}
}
}
@@ -1066,96 +1130,103 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
int converted = 0;
while (1) {
- switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
- case TYPE_PAIR(IS_LONG, IS_LONG):
- if (Z_LVAL_P(op2) >= 0) {
- zend_long l1 = 1, l2 = Z_LVAL_P(op1), i = Z_LVAL_P(op2);
+ zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
- if (i == 0) {
- ZVAL_LONG(result, 1L);
- return SUCCESS;
- } else if (l2 == 0) {
- ZVAL_LONG(result, 0);
- return SUCCESS;
- }
+ if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_LONG))) {
+ if (Z_LVAL_P(op2) >= 0) {
+ zend_long l1 = 1, l2 = Z_LVAL_P(op1), i = Z_LVAL_P(op2);
- while (i >= 1) {
- zend_long overflow;
- double dval = 0.0;
+ if (i == 0) {
+ ZVAL_LONG(result, 1L);
+ return SUCCESS;
+ } else if (l2 == 0) {
+ ZVAL_LONG(result, 0);
+ return SUCCESS;
+ }
- if (i % 2) {
- --i;
- ZEND_SIGNED_MULTIPLY_LONG(l1, l2, l1, dval, overflow);
- if (overflow) {
- ZVAL_DOUBLE(result, dval * pow(l2, i));
- return SUCCESS;
- }
- } else {
- i /= 2;
- ZEND_SIGNED_MULTIPLY_LONG(l2, l2, l2, dval, overflow);
- if (overflow) {
- ZVAL_DOUBLE(result, (double)l1 * pow(dval, i));
- return SUCCESS;
- }
+ while (i >= 1) {
+ zend_long overflow;
+ double dval = 0.0;
+
+ if (i % 2) {
+ --i;
+ ZEND_SIGNED_MULTIPLY_LONG(l1, l2, l1, dval, overflow);
+ if (overflow) {
+ ZVAL_DOUBLE(result, dval * pow(l2, i));
+ return SUCCESS;
+ }
+ } else {
+ i /= 2;
+ ZEND_SIGNED_MULTIPLY_LONG(l2, l2, l2, dval, overflow);
+ if (overflow) {
+ ZVAL_DOUBLE(result, (double)l1 * pow(dval, i));
+ return SUCCESS;
}
}
- /* i == 0 */
- ZVAL_LONG(result, l1);
- } else {
- ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2)));
}
- return SUCCESS;
+ /* i == 0 */
+ ZVAL_LONG(result, l1);
+ } else {
+ ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2)));
+ }
+ return SUCCESS;
- case TYPE_PAIR(IS_LONG, IS_DOUBLE):
- ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), Z_DVAL_P(op2)));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), Z_DVAL_P(op2)));
+ return SUCCESS;
- case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), (double)Z_LVAL_P(op2)));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
+ ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), Z_DVAL_P(op2)));
+ return SUCCESS;
- case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE):
- ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), Z_DVAL_P(op2)));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
+ ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), (double)Z_LVAL_P(op2)));
+ return SUCCESS;
- default:
- if (Z_ISREF_P(op1)) {
- op1 = Z_REFVAL_P(op1);
- } else if (Z_ISREF_P(op2)) {
- op2 = Z_REFVAL_P(op2);
- } else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
+ } else {
+ if (Z_ISREF_P(op1)) {
+ op1 = Z_REFVAL_P(op1);
+ } else if (Z_ISREF_P(op2)) {
+ op2 = Z_REFVAL_P(op2);
+ } else if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
- if (EXPECTED(op1 != op2)) {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- ZVAL_LONG(result, 0);
- return SUCCESS;
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- }
- if (Z_TYPE_P(op2) == IS_ARRAY) {
- ZVAL_LONG(result, 1L);
- return SUCCESS;
- } else {
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- }
+ if (EXPECTED(op1 != op2)) {
+ if (Z_TYPE_P(op1) == IS_ARRAY) {
+ ZVAL_LONG(result, 0);
+ return SUCCESS;
} else {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- ZVAL_LONG(result, 0);
- return SUCCESS;
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- }
- op2 = op1;
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ }
+ if (Z_TYPE_P(op2) == IS_ARRAY) {
+ ZVAL_LONG(result, 1L);
+ return SUCCESS;
+ } else {
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
}
- converted = 1;
} else {
+ if (Z_TYPE_P(op1) == IS_ARRAY) {
+ ZVAL_LONG(result, 0);
+ return SUCCESS;
+ } else {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ }
+ op2 = op1;
+ }
+ if (EG(exception)) {
if (result != op1) {
ZVAL_UNDEF(result);
}
- zend_throw_error(NULL, "Unsupported operand types");
return FAILURE;
}
+ converted = 1;
+ } else {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE;
+ }
}
}
}
@@ -1167,68 +1238,75 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* {
int converted = 0;
while (1) {
- switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
- case TYPE_PAIR(IS_LONG, IS_LONG):
- if (Z_LVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
- ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1) / (double) Z_LVAL_P(op2)));
- return SUCCESS;
- } else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) {
- /* Prevent overflow error/crash */
- ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1);
- return SUCCESS;
- }
- if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
- ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
- } else {
- ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
- }
- return SUCCESS;
+ zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
- case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- if (Z_LVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
- }
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2));
+ if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_LONG))) {
+ if (Z_LVAL_P(op2) == 0) {
+ zend_error(E_WARNING, "Division by zero");
+ ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1) / (double) Z_LVAL_P(op2)));
return SUCCESS;
-
- case TYPE_PAIR(IS_LONG, IS_DOUBLE):
- if (Z_DVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
- }
- ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2));
+ } else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) {
+ /* Prevent overflow error/crash */
+ ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1);
return SUCCESS;
+ }
+ if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
+ ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
+ } else {
+ ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
+ }
+ return SUCCESS;
- case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE):
- if (Z_DVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
- }
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2));
- return SUCCESS;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
+ if (Z_DVAL_P(op2) == 0) {
+ zend_error(E_WARNING, "Division by zero");
+ }
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2));
+ return SUCCESS;
- default:
- if (Z_ISREF_P(op1)) {
- op1 = Z_REFVAL_P(op1);
- } else if (Z_ISREF_P(op2)) {
- op2 = Z_REFVAL_P(op2);
- } else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
+ if (Z_LVAL_P(op2) == 0) {
+ zend_error(E_WARNING, "Division by zero");
+ }
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2));
+ return SUCCESS;
- if (EXPECTED(op1 != op2)) {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- } else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
- op2 = op1;
- }
- converted = 1;
+ } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
+ if (Z_DVAL_P(op2) == 0) {
+ zend_error(E_WARNING, "Division by zero");
+ }
+ ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2));
+ return SUCCESS;
+
+ } else {
+ if (Z_ISREF_P(op1)) {
+ op1 = Z_REFVAL_P(op1);
+ } else if (Z_ISREF_P(op2)) {
+ op2 = Z_REFVAL_P(op2);
+ } else if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
+
+ if (EXPECTED(op1 != op2)) {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
} else {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = op1;
+ }
+ if (EG(exception)) {
if (result != op1) {
ZVAL_UNDEF(result);
}
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
+ return FAILURE;
+ }
+ converted = 1;
+ } else {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
}
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE; /* unknown datatype */
+ }
}
}
}
@@ -1254,7 +1332,7 @@ ZEND_API int ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2) /* {
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
if (op2_lval == -1) {
@@ -1404,7 +1482,7 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
if (EXPECTED(Z_STRLEN_P(op1) == Z_STRLEN_P(op2)) && Z_STRLEN_P(op1) == 1) {
zend_uchar or = (zend_uchar) (*Z_STRVAL_P(op1) | *Z_STRVAL_P(op2));
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_INTERNED_STR(result, ZSTR_CHAR(or));
return SUCCESS;
@@ -1422,7 +1500,7 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
}
memcpy(ZSTR_VAL(str) + i, Z_STRVAL_P(longer) + i, Z_STRLEN_P(longer) - i + 1);
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_NEW_STR(result, str);
return SUCCESS;
@@ -1454,7 +1532,7 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, op1_lval | op2_lval);
return SUCCESS;
@@ -1482,7 +1560,7 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
if (EXPECTED(Z_STRLEN_P(op1) == Z_STRLEN_P(op2)) && Z_STRLEN_P(op1) == 1) {
zend_uchar and = (zend_uchar) (*Z_STRVAL_P(op1) & *Z_STRVAL_P(op2));
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_INTERNED_STR(result, ZSTR_CHAR(and));
return SUCCESS;
@@ -1500,7 +1578,7 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
}
ZSTR_VAL(str)[i] = 0;
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_NEW_STR(result, str);
return SUCCESS;
@@ -1532,7 +1610,7 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, op1_lval & op2_lval);
return SUCCESS;
@@ -1560,7 +1638,7 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
if (EXPECTED(Z_STRLEN_P(op1) == Z_STRLEN_P(op2)) && Z_STRLEN_P(op1) == 1) {
zend_uchar xor = (zend_uchar) (*Z_STRVAL_P(op1) ^ *Z_STRVAL_P(op2));
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_INTERNED_STR(result, ZSTR_CHAR(xor));
return SUCCESS;
@@ -1578,7 +1656,7 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
}
ZSTR_VAL(str)[i] = 0;
if (result==op1) {
- zend_string_release(Z_STR_P(result));
+ zval_ptr_dtor_str(result);
}
ZVAL_NEW_STR(result, str);
return SUCCESS;
@@ -1610,7 +1688,7 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, op1_lval ^ op2_lval);
return SUCCESS;
@@ -1627,7 +1705,7 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
if (EXPECTED(op2_lval > 0)) {
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, 0);
return SUCCESS;
@@ -1645,7 +1723,7 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, op1_lval << op2_lval);
@@ -1663,7 +1741,7 @@ ZEND_API int ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *o
if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
if (EXPECTED(op2_lval > 0)) {
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, (op1_lval < 0) ? -1 : 0);
return SUCCESS;
@@ -1681,7 +1759,7 @@ ZEND_API int ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *o
}
if (op1 == result) {
- zval_dtor(result);
+ zval_ptr_dtor(result);
}
ZVAL_LONG(result, op1_lval >> op2_lval);
@@ -1693,7 +1771,9 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
{
zval *orig_op1 = op1;
zval op1_copy, op2_copy;
- int use_copy1 = 0, use_copy2 = 0;
+
+ ZVAL_UNDEF(&op1_copy);
+ ZVAL_UNDEF(&op2_copy);
do {
if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING)) {
@@ -1702,22 +1782,20 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (Z_TYPE_P(op1) == IS_STRING) break;
}
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
- use_copy1 = zend_make_printable_zval(op1, &op1_copy);
- if (use_copy1) {
- if (UNEXPECTED(EG(exception))) {
- zval_dtor(&op1_copy);
- if (orig_op1 != result) {
- ZVAL_UNDEF(result);
- }
- return FAILURE;
+ ZVAL_STR(&op1_copy, zval_get_string_func(op1));
+ if (UNEXPECTED(EG(exception))) {
+ zval_ptr_dtor_str(&op1_copy);
+ if (orig_op1 != result) {
+ ZVAL_UNDEF(result);
}
- if (result == op1) {
- if (UNEXPECTED(op1 == op2)) {
- op2 = &op1_copy;
- }
+ return FAILURE;
+ }
+ if (result == op1) {
+ if (UNEXPECTED(op1 == op2)) {
+ op2 = &op1_copy;
}
- op1 = &op1_copy;
}
+ op1 = &op1_copy;
}
} while (0);
do {
@@ -1727,24 +1805,31 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (Z_TYPE_P(op2) == IS_STRING) break;
}
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
- use_copy2 = zend_make_printable_zval(op2, &op2_copy);
- if (use_copy2) {
- if (UNEXPECTED(EG(exception))) {
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- zval_dtor(&op2_copy);
- if (orig_op1 != result) {
- ZVAL_UNDEF(result);
- }
- return FAILURE;
+ ZVAL_STR(&op2_copy, zval_get_string_func(op2));
+ if (UNEXPECTED(EG(exception))) {
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
+ if (orig_op1 != result) {
+ ZVAL_UNDEF(result);
}
- op2 = &op2_copy;
+ return FAILURE;
}
+ op2 = &op2_copy;
}
} while (0);
- {
+ if (UNEXPECTED(Z_STRLEN_P(op1) == 0)) {
+ if (EXPECTED(result != op2)) {
+ if (result == orig_op1) {
+ i_zval_ptr_dtor(result ZEND_FILE_LINE_CC);
+ }
+ ZVAL_COPY(result, op2);
+ }
+ } else if (UNEXPECTED(Z_STRLEN_P(op2) == 0)) {
+ if (EXPECTED(result != op1)) {
+ ZVAL_COPY(result, op1);
+ }
+ } else {
size_t op1_len = Z_STRLEN_P(op1);
size_t op2_len = Z_STRLEN_P(op2);
size_t result_len = op1_len + op2_len;
@@ -1752,12 +1837,8 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (UNEXPECTED(op1_len > SIZE_MAX - op2_len)) {
zend_throw_error(NULL, "String size overflow");
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- if (UNEXPECTED(use_copy2)) {
- zval_dtor(op2);
- }
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
if (orig_op1 != result) {
ZVAL_UNDEF(result);
}
@@ -1771,7 +1852,7 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
result_str = zend_string_alloc(result_len, 0);
memcpy(ZSTR_VAL(result_str), Z_STRVAL_P(op1), op1_len);
if (result == orig_op1) {
- zval_dtor(orig_op1);
+ i_zval_ptr_dtor(result ZEND_FILE_LINE_CC);
}
}
@@ -1784,20 +1865,17 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
ZSTR_VAL(result_str)[result_len] = '\0';
}
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- if (UNEXPECTED(use_copy2)) {
- zval_dtor(op2);
- }
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
return SUCCESS;
}
/* }}} */
ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend_bool case_insensitive) /* {{{ */
{
- zend_string *str1 = zval_get_string(op1);
- zend_string *str2 = zval_get_string(op2);
+ zend_string *tmp_str1, *tmp_str2;
+ zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+ zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
int ret;
if (case_insensitive) {
@@ -1806,8 +1884,8 @@ ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend
ret = zend_binary_strcmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2));
}
- zend_string_release(str1);
- zend_string_release(str2);
+ zend_tmp_string_release(tmp_str1);
+ zend_tmp_string_release(tmp_str2);
return ret;
}
/* }}} */
@@ -1822,12 +1900,13 @@ ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2) /* {{{
return zend_binary_strcmp(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));
}
} else {
- zend_string *str1 = zval_get_string(op1);
- zend_string *str2 = zval_get_string(op2);
+ zend_string *tmp_str1, *tmp_str2;
+ zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+ zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
int ret = zend_binary_strcmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2));
- zend_string_release(str1);
- zend_string_release(str2);
+ zend_tmp_string_release(tmp_str1);
+ zend_tmp_string_release(tmp_str2);
return ret;
}
}
@@ -1843,12 +1922,13 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /*
return zend_binary_strcasecmp_l(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));
}
} else {
- zend_string *str1 = zval_get_string(op1);
- zend_string *str2 = zval_get_string(op2);
+ zend_string *tmp_str1, *tmp_str2;
+ zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+ zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
int ret = zend_binary_strcasecmp_l(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1));
- zend_string_release(str1);
- zend_string_release(str2);
+ zend_tmp_string_release(tmp_str1);
+ zend_tmp_string_release(tmp_str2);
return ret;
}
}
@@ -1857,12 +1937,13 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /*
#if HAVE_STRCOLL
ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2) /* {{{ */
{
- zend_string *str1 = zval_get_string(op1);
- zend_string *str2 = zval_get_string(op2);
+ zend_string *tmp_str1, *tmp_str2;
+ zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+ zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
int ret = strcoll(ZSTR_VAL(str1), ZSTR_VAL(str2));
- zend_string_release(str1);
- zend_string_release(str2);
+ zend_tmp_string_release(tmp_str1);
+ zend_tmp_string_release(tmp_str2);
return ret;
}
/* }}} */
@@ -1879,15 +1960,10 @@ ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2) /* {{{
}
/* }}} */
-static inline void zend_free_obj_get_result(zval *op) /* {{{ */
+static zend_always_inline void zend_free_obj_get_result(zval *op) /* {{{ */
{
- if (Z_REFCOUNTED_P(op)) {
- if (Z_REFCOUNT_P(op) == 0) {
- zval_dtor(op);
- } else {
- zval_ptr_dtor(op);
- }
- }
+ ZEND_ASSERT(!Z_REFCOUNTED_P(op) || Z_REFCOUNT_P(op) != 0);
+ zval_ptr_dtor(op);
}
/* }}} */
@@ -2066,8 +2142,14 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
ZVAL_LONG(result, zval_is_true(op1) ? 0 : -1);
return SUCCESS;
} else {
- zendi_convert_scalar_to_number(op1, op1_copy, result, 1);
- zendi_convert_scalar_to_number(op2, op2_copy, result, 1);
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 1);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 1);
+ if (EG(exception)) {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ return FAILURE;
+ }
converted = 1;
}
} else if (Z_TYPE_P(op1)==IS_ARRAY) {
@@ -2126,14 +2208,12 @@ ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
case IS_DOUBLE:
return (Z_DVAL_P(op1) == Z_DVAL_P(op2));
case IS_STRING:
- return (Z_STR_P(op1) == Z_STR_P(op2) ||
- (Z_STRLEN_P(op1) == Z_STRLEN_P(op2) &&
- memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0));
+ return zend_string_equals(Z_STR_P(op1), Z_STR_P(op2));
case IS_ARRAY:
return (Z_ARRVAL_P(op1) == Z_ARRVAL_P(op2) ||
zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1) == 0);
case IS_OBJECT:
- return (Z_OBJ_P(op1) == Z_OBJ_P(op2) && Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2));
+ return (Z_OBJ_P(op1) == Z_OBJ_P(op2));
default:
return 0;
}
@@ -2274,7 +2354,7 @@ static void ZEND_FASTCALL increment_string(zval *str) /* {{{ */
int ch;
if (Z_STRLEN_P(str) == 0) {
- zend_string_release(Z_STR_P(str));
+ zval_ptr_dtor_str(str);
ZVAL_INTERNED_STR(str, ZSTR_CHAR('1'));
return;
}
@@ -2368,7 +2448,7 @@ try_again:
switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
case IS_LONG:
- zend_string_release(Z_STR_P(op1));
+ zval_ptr_dtor_str(op1);
if (lval == ZEND_LONG_MAX) {
/* switch to double */
double d = (double)lval;
@@ -2378,7 +2458,7 @@ try_again:
}
break;
case IS_DOUBLE:
- zend_string_release(Z_STR_P(op1));
+ zval_ptr_dtor_str(op1);
ZVAL_DOUBLE(op1, dval+1);
break;
default:
@@ -2406,7 +2486,6 @@ try_again:
ZVAL_LONG(&op2, 1);
res = Z_OBJ_HANDLER_P(op1, do_operation)(ZEND_ADD, op1, op1, &op2);
- zval_ptr_dtor(&op2);
return res;
}
@@ -2436,13 +2515,13 @@ try_again:
break;
case IS_STRING: /* Like perl we only support string increment */
if (Z_STRLEN_P(op1) == 0) { /* consider as 0 */
- zend_string_release(Z_STR_P(op1));
+ zval_ptr_dtor_str(op1);
ZVAL_LONG(op1, -1);
break;
}
switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
case IS_LONG:
- zend_string_release(Z_STR_P(op1));
+ zval_ptr_dtor_str(op1);
if (lval == ZEND_LONG_MIN) {
double d = (double)lval;
ZVAL_DOUBLE(op1, d-1);
@@ -2451,7 +2530,7 @@ try_again:
}
break;
case IS_DOUBLE:
- zend_string_release(Z_STR_P(op1));
+ zval_ptr_dtor_str(op1);
ZVAL_DOUBLE(op1, dval - 1);
break;
}
@@ -2474,7 +2553,6 @@ try_again:
ZVAL_LONG(&op2, 1);
res = Z_OBJ_HANDLER_P(op1, do_operation)(ZEND_SUB, op1, op1, &op2);
- zval_ptr_dtor(&op2);
return res;
}
@@ -2503,7 +2581,7 @@ ZEND_API int ZEND_FASTCALL zend_object_is_true(zval *op) /* {{{ */
if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, _IS_BOOL) == SUCCESS) {
return Z_TYPE(tmp) == IS_TRUE;
}
- zend_error(E_RECOVERABLE_ERROR, "Object of class %s could not be converted to boolean", ZSTR_VAL(Z_OBJ_P(op)->ce->name));
+ zend_error(E_RECOVERABLE_ERROR, "Object of class %s could not be converted to bool", ZSTR_VAL(Z_OBJ_P(op)->ce->name));
} else if (Z_OBJ_HT_P(op)->get) {
int result;
zval rv;
@@ -2589,14 +2667,14 @@ ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t
}
/* }}} */
-ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower(zend_string *str) /* {{{ */
+ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, int persistent) /* {{{ */
{
register unsigned char *p = (unsigned char*)ZSTR_VAL(str);
register unsigned char *end = p + ZSTR_LEN(str);
while (p < end) {
if (*p != zend_tolower_ascii(*p)) {
- zend_string *res = zend_string_alloc(ZSTR_LEN(str), 0);
+ zend_string *res = zend_string_alloc(ZSTR_LEN(str), persistent);
register unsigned char *r;
if (p != (unsigned char*)ZSTR_VAL(str)) {
@@ -2759,7 +2837,55 @@ ZEND_API int ZEND_FASTCALL zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval
}
/* }}} */
-ZEND_API zend_long ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2) /* {{{ */
+ZEND_API int ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2) /* {{{ */
+{
+ int ret1, ret2;
+ int oflow1, oflow2;
+ zend_long lval1 = 0, lval2 = 0;
+ double dval1 = 0.0, dval2 = 0.0;
+
+ if ((ret1 = is_numeric_string_ex(s1->val, s1->len, &lval1, &dval1, 0, &oflow1)) &&
+ (ret2 = is_numeric_string_ex(s2->val, s2->len, &lval2, &dval2, 0, &oflow2))) {
+#if ZEND_ULONG_MAX == 0xFFFFFFFF
+ if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0. &&
+ ((oflow1 == 1 && dval1 > 9007199254740991. /*0x1FFFFFFFFFFFFF*/)
+ || (oflow1 == -1 && dval1 < -9007199254740991.))) {
+#else
+ if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0.) {
+#endif
+ /* both values are integers overflown to the same side, and the
+ * double comparison may have resulted in crucial accuracy lost */
+ goto string_cmp;
+ }
+ if ((ret1 == IS_DOUBLE) || (ret2 == IS_DOUBLE)) {
+ if (ret1 != IS_DOUBLE) {
+ if (oflow2) {
+ /* 2nd operand is integer > LONG_MAX (oflow2==1) or < LONG_MIN (-1) */
+ return 0;
+ }
+ dval1 = (double) lval1;
+ } else if (ret2 != IS_DOUBLE) {
+ if (oflow1) {
+ return 0;
+ }
+ dval2 = (double) lval2;
+ } else if (dval1 == dval2 && !zend_finite(dval1)) {
+ /* Both values overflowed and have the same sign,
+ * so a numeric comparison would be inaccurate */
+ goto string_cmp;
+ }
+ return dval1 == dval2;
+ } else { /* they both have to be long's */
+ return lval1 == lval2;
+ }
+ } else {
+string_cmp:
+ return zend_string_equal_content(s1, s2);
+ }
+}
+/* }}} */
+
+ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2) /* {{{ */
{
int ret1, ret2;
int oflow1, oflow2;
@@ -3032,7 +3158,7 @@ ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const c
register size_t i;
register const char *p;
- if (needle_len == 0 || (end - haystack) == 0) {
+ if (needle_len == 0 || (end - haystack) < needle_len) {
return NULL;
}
@@ -3066,7 +3192,7 @@ ZEND_API const char* ZEND_FASTCALL zend_memnrstr_ex(const char *haystack, const
register size_t i;
register const char *p;
- if (needle_len == 0 || (end - haystack) == 0) {
+ if (needle_len == 0 || (end - haystack) < needle_len) {
return NULL;
}
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index b7d9800abb..e7b94d16bc 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_OPERATORS_H
#define ZEND_OPERATORS_H
@@ -38,6 +36,7 @@
#include "zend_portability.h"
#include "zend_strtod.h"
#include "zend_multiply.h"
+#include "zend_object_handlers.h"
#define LONG_SIGN_MASK (((zend_long)1) << (8*sizeof(zend_long)-1))
@@ -172,7 +171,7 @@ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const
while (p <= end) {
if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
- if (!memcmp(needle, p, needle_len-1)) {
+ if (!memcmp(needle+1, p+1, needle_len-2)) {
return p;
}
}
@@ -193,7 +192,7 @@ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const
static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t n)
{
const unsigned char *e;
- if (n <= 0) {
+ if (0 == n) {
return NULL;
}
@@ -207,7 +206,7 @@ static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t
static zend_always_inline const char *
-zend_memnrstr(const char *haystack, const char *needle, size_t needle_len, char *end)
+zend_memnrstr(const char *haystack, const char *needle, size_t needle_len, const char *end)
{
const char *p = end;
const char ne = needle[needle_len-1];
@@ -230,7 +229,7 @@ zend_memnrstr(const char *haystack, const char *needle, size_t needle_len, char
do {
if ((p = (const char *)zend_memrchr(haystack, *needle, (p - haystack) + 1)) && ne == p[needle_len-1]) {
- if (!memcmp(needle, p, needle_len - 1)) {
+ if (!memcmp(needle + 1, p + 1, needle_len - 2)) {
return p;
}
}
@@ -246,8 +245,8 @@ ZEND_API int ZEND_FASTCALL increment_function(zval *op1);
ZEND_API int ZEND_FASTCALL decrement_function(zval *op2);
ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op);
-ZEND_API void ZEND_FASTCALL _convert_to_cstring(zval *op ZEND_FILE_LINE_DC);
-ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op ZEND_FILE_LINE_DC);
+ZEND_API void ZEND_FASTCALL _convert_to_cstring(zval *op);
+ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_long(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_double(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_long_base(zval *op, int base);
@@ -259,26 +258,44 @@ ZEND_API void multi_convert_to_long_ex(int argc, ...);
ZEND_API void multi_convert_to_double_ex(int argc, ...);
ZEND_API void multi_convert_to_string_ex(int argc, ...);
-ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op);
-ZEND_API double ZEND_FASTCALL _zval_get_double_func(zval *op);
-ZEND_API zend_string* ZEND_FASTCALL _zval_get_string_func(zval *op);
+ZEND_API zend_long ZEND_FASTCALL zval_get_long_func(zval *op);
+ZEND_API double ZEND_FASTCALL zval_get_double_func(zval *op);
+ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op);
-static zend_always_inline zend_long _zval_get_long(zval *op) {
- return Z_TYPE_P(op) == IS_LONG ? Z_LVAL_P(op) : _zval_get_long_func(op);
+static zend_always_inline zend_long zval_get_long(zval *op) {
+ return EXPECTED(Z_TYPE_P(op) == IS_LONG) ? Z_LVAL_P(op) : zval_get_long_func(op);
+}
+static zend_always_inline double zval_get_double(zval *op) {
+ return EXPECTED(Z_TYPE_P(op) == IS_DOUBLE) ? Z_DVAL_P(op) : zval_get_double_func(op);
+}
+static zend_always_inline zend_string *zval_get_string(zval *op) {
+ return EXPECTED(Z_TYPE_P(op) == IS_STRING) ? zend_string_copy(Z_STR_P(op)) : zval_get_string_func(op);
}
-static zend_always_inline double _zval_get_double(zval *op) {
- return Z_TYPE_P(op) == IS_DOUBLE ? Z_DVAL_P(op) : _zval_get_double_func(op);
+
+static zend_always_inline zend_string *zval_get_tmp_string(zval *op, zend_string **tmp) {
+ if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
+ *tmp = NULL;
+ return Z_STR_P(op);
+ } else {
+ return *tmp = zval_get_string_func(op);
+ }
}
-static zend_always_inline zend_string *_zval_get_string(zval *op) {
- return Z_TYPE_P(op) == IS_STRING ? zend_string_copy(Z_STR_P(op)) : _zval_get_string_func(op);
+static zend_always_inline void zend_tmp_string_release(zend_string *tmp) {
+ if (UNEXPECTED(tmp)) {
+ zend_string_release_ex(tmp, 0);
+ }
}
-#define zval_get_long(op) _zval_get_long((op))
-#define zval_get_double(op) _zval_get_double((op))
-#define zval_get_string(op) _zval_get_string((op))
+/* Compatibility macros for 7.2 and below */
+#define _zval_get_long(op) zval_get_long(op)
+#define _zval_get_double(op) zval_get_double(op)
+#define _zval_get_string(op) zval_get_string(op)
+#define _zval_get_long_func(op) zval_get_long_func(op)
+#define _zval_get_double_func(op) zval_get_double_func(op)
+#define _zval_get_string_func(op) zval_get_string_func(op)
-#define convert_to_cstring(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_cstring((op) ZEND_FILE_LINE_CC); }
-#define convert_to_string(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_string((op) ZEND_FILE_LINE_CC); }
+#define convert_to_cstring(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_cstring((op)); }
+#define convert_to_string(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_string((op)); }
ZEND_API int ZEND_FASTCALL zend_is_true(zval *op);
@@ -317,7 +334,11 @@ again:
}
break;
case IS_OBJECT:
- result = zend_object_is_true(op);
+ if (EXPECTED(Z_OBJ_HT_P(op)->cast_object == zend_std_cast_object_tostring)) {
+ result = 1;
+ } else {
+ result = zend_object_is_true(op);
+ }
break;
case IS_RESOURCE:
if (EXPECTED(Z_RES_HANDLE_P(op))) {
@@ -348,7 +369,9 @@ ZEND_API void ZEND_FASTCALL zend_str_tolower(char *str, size_t length);
ZEND_API char* ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *source, size_t length);
ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup(const char *source, size_t length);
ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t length);
-ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower(zend_string *str);
+ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, int persistent);
+
+#define zend_string_tolower(str) zend_string_tolower_ex(str, 0)
ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2);
ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3);
@@ -361,13 +384,14 @@ ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp(const char *s1, size_t len1,
ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp_l(const char *s1, size_t len1, const char *s2, size_t len2);
ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp_l(const char *s1, size_t len1, const char *s2, size_t len2, size_t length);
-ZEND_API zend_long ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2);
+ZEND_API int ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2);
+ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2);
ZEND_API int ZEND_FASTCALL zend_compare_symbol_tables(HashTable *ht1, HashTable *ht2);
ZEND_API int ZEND_FASTCALL zend_compare_arrays(zval *a1, zval *a2);
ZEND_API int ZEND_FASTCALL zend_compare_objects(zval *o1, zval *o2);
-ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, int str_len);
-ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, int str_len);
+ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len);
+ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len);
ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC);
@@ -411,7 +435,13 @@ ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_D
convert_to_explicit_type(pzv, str_type); \
}
-#define convert_to_boolean_ex(pzv) convert_to_ex_master(pzv, boolean, _IS_BOOL)
+#define convert_to_boolean_ex(pzv) do { \
+ if (Z_TYPE_INFO_P(pzv) > IS_TRUE) { \
+ convert_to_boolean(pzv); \
+ } else if (Z_TYPE_INFO_P(pzv) < IS_FALSE) { \
+ ZVAL_FALSE(pzv); \
+ } \
+ } while (0)
#define convert_to_long_ex(pzv) convert_to_ex_master(pzv, long, IS_LONG)
#define convert_to_double_ex(pzv) convert_to_ex_master(pzv, double, IS_DOUBLE)
#define convert_to_string_ex(pzv) convert_to_ex_master(pzv, string, IS_STRING)
@@ -441,7 +471,29 @@ ZEND_API void zend_update_current_locale(void);
static zend_always_inline void fast_long_increment_function(zval *op1)
{
-#if PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
+#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+ __asm__ goto(
+ "addl $1,(%0)\n\t"
+ "jo %l1\n"
+ :
+ : "r"(&op1->value)
+ : "cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0);
+#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+ __asm__ goto(
+ "addq $1,(%0)\n\t"
+ "jo %l1\n"
+ :
+ : "r"(&op1->value)
+ : "cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0);
+#elif PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
long lresult;
if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), 1, &lresult))) {
/* switch to double */
@@ -457,32 +509,6 @@ static zend_always_inline void fast_long_increment_function(zval *op1)
} else {
Z_LVAL_P(op1) = llresult;
}
-#elif defined(__GNUC__) && defined(__i386__)
- __asm__(
- "incl (%0)\n\t"
- "jno 0f\n\t"
- "movl $0x0, (%0)\n\t"
- "movl $0x41e00000, 0x4(%0)\n\t"
- "movl %1, %c2(%0)\n"
- "0:"
- :
- : "r"(&op1->value),
- "n"(IS_DOUBLE),
- "n"(ZVAL_OFFSETOF_TYPE)
- : "cc", "memory");
-#elif defined(__GNUC__) && defined(__x86_64__)
- __asm__(
- "incq (%0)\n\t"
- "jno 0f\n\t"
- "movl $0x0, (%0)\n\t"
- "movl $0x43e00000, 0x4(%0)\n\t"
- "movl %1, %c2(%0)\n"
- "0:"
- :
- : "r"(&op1->value),
- "n"(IS_DOUBLE),
- "n"(ZVAL_OFFSETOF_TYPE)
- : "cc", "memory");
#else
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MAX)) {
/* switch to double */
@@ -495,7 +521,29 @@ static zend_always_inline void fast_long_increment_function(zval *op1)
static zend_always_inline void fast_long_decrement_function(zval *op1)
{
-#if PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
+#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+ __asm__ goto(
+ "subl $1,(%0)\n\t"
+ "jo %l1\n"
+ :
+ : "r"(&op1->value)
+ : "cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0);
+#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+ __asm__ goto(
+ "subq $1,(%0)\n\t"
+ "jo %l1\n"
+ :
+ : "r"(&op1->value)
+ : "cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0);
+#elif PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
long lresult;
if (UNEXPECTED(__builtin_ssubl_overflow(Z_LVAL_P(op1), 1, &lresult))) {
/* switch to double */
@@ -511,32 +559,6 @@ static zend_always_inline void fast_long_decrement_function(zval *op1)
} else {
Z_LVAL_P(op1) = llresult;
}
-#elif defined(__GNUC__) && defined(__i386__)
- __asm__(
- "decl (%0)\n\t"
- "jno 0f\n\t"
- "movl $0x00200000, (%0)\n\t"
- "movl $0xc1e00000, 0x4(%0)\n\t"
- "movl %1,%c2(%0)\n"
- "0:"
- :
- : "r"(&op1->value),
- "n"(IS_DOUBLE),
- "n"(ZVAL_OFFSETOF_TYPE)
- : "cc", "memory");
-#elif defined(__GNUC__) && defined(__x86_64__)
- __asm__(
- "decq (%0)\n\t"
- "jno 0f\n\t"
- "movl $0x00000000, (%0)\n\t"
- "movl $0xc3e00000, 0x4(%0)\n\t"
- "movl %1,%c2(%0)\n"
- "0:"
- :
- : "r"(&op1->value),
- "n"(IS_DOUBLE),
- "n"(ZVAL_OFFSETOF_TYPE)
- : "cc", "memory");
#else
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MIN)) {
/* switch to double */
@@ -549,69 +571,56 @@ static zend_always_inline void fast_long_decrement_function(zval *op1)
static zend_always_inline void fast_long_add_function(zval *result, zval *op1, zval *op2)
{
-#if PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
- long lresult;
- if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
- ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
- } else {
- ZVAL_LONG(result, lresult);
- }
-#elif PHP_HAVE_BUILTIN_SADDLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
- long long llresult;
- if (UNEXPECTED(__builtin_saddll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
- ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
- } else {
- ZVAL_LONG(result, llresult);
- }
-#elif defined(__GNUC__) && defined(__i386__) \
- && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) \
- && !(4 == __GNUC__ && 9 == __GNUC_MINOR__ && (defined(__PIC__) || defined(__PIE__)))
- /* Position-independent builds fail with gcc-4.9.x */
- __asm__(
+#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+ __asm__ goto(
"movl (%1), %%eax\n\t"
"addl (%2), %%eax\n\t"
- "jo 0f\n\t"
+ "jo %l5\n\t"
"movl %%eax, (%0)\n\t"
- "movl %3, %c5(%0)\n\t"
- "jmp 1f\n"
- "0:\n\t"
- "fildl (%1)\n\t"
- "fildl (%2)\n\t"
- "faddp %%st, %%st(1)\n\t"
- "movl %4, %c5(%0)\n\t"
- "fstpl (%0)\n"
- "1:"
+ "movl %3, %c4(%0)\n"
:
: "r"(&result->value),
"r"(&op1->value),
"r"(&op2->value),
"n"(IS_LONG),
- "n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
- : "eax","cc", "memory");
-#elif defined(__GNUC__) && defined(__x86_64__)
- __asm__(
+ : "eax","cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
+#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+ __asm__ goto(
"movq (%1), %%rax\n\t"
"addq (%2), %%rax\n\t"
- "jo 0f\n\t"
+ "jo %l5\n\t"
"movq %%rax, (%0)\n\t"
- "movl %3, %c5(%0)\n\t"
- "jmp 1f\n"
- "0:\n\t"
- "fildq (%1)\n\t"
- "fildq (%2)\n\t"
- "faddp %%st, %%st(1)\n\t"
- "movl %4, %c5(%0)\n\t"
- "fstpl (%0)\n"
- "1:"
+ "movl %3, %c4(%0)\n"
:
: "r"(&result->value),
"r"(&op1->value),
"r"(&op2->value),
"n"(IS_LONG),
- "n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
- : "rax","cc", "memory");
+ : "rax","cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
+#elif PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
+ long lresult;
+ if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
+ } else {
+ ZVAL_LONG(result, lresult);
+ }
+#elif PHP_HAVE_BUILTIN_SADDLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
+ long long llresult;
+ if (UNEXPECTED(__builtin_saddll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
+ } else {
+ ZVAL_LONG(result, llresult);
+ }
#else
/*
* 'result' may alias with op1 or op2, so we need to
@@ -652,77 +661,56 @@ static zend_always_inline int fast_add_function(zval *result, zval *op1, zval *o
static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, zval *op2)
{
-#if PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
- long lresult;
- if (UNEXPECTED(__builtin_ssubl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
- ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
- } else {
- ZVAL_LONG(result, lresult);
- }
-#elif PHP_HAVE_BUILTIN_SSUBLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
- long long llresult;
- if (UNEXPECTED(__builtin_ssubll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
- ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
- } else {
- ZVAL_LONG(result, llresult);
- }
-#elif defined(__GNUC__) && defined(__i386__) && \
- !(4 == __GNUC__ && 8 == __GNUC_MINOR__) && \
- !(4 == __GNUC__ && 9 == __GNUC_MINOR__ && (defined(__PIC__) || defined(__PIE__)))
- /* Position-independent builds fail with gcc-4.9.x */
- __asm__(
+#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+ __asm__ goto(
"movl (%1), %%eax\n\t"
"subl (%2), %%eax\n\t"
- "jo 0f\n\t"
+ "jo %l5\n\t"
"movl %%eax, (%0)\n\t"
- "movl %3, %c5(%0)\n\t"
- "jmp 1f\n"
- "0:\n\t"
- "fildl (%2)\n\t"
- "fildl (%1)\n\t"
-#if defined(__clang__) && (__clang_major__ < 2 || (__clang_major__ == 2 && __clang_minor__ < 10))
- "fsubp %%st(1), %%st\n\t" /* LLVM bug #9164 */
-#else
- "fsubp %%st, %%st(1)\n\t"
-#endif
- "movl %4, %c5(%0)\n\t"
- "fstpl (%0)\n"
- "1:"
+ "movl %3, %c4(%0)\n"
:
: "r"(&result->value),
"r"(&op1->value),
"r"(&op2->value),
"n"(IS_LONG),
- "n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
- : "eax","cc", "memory");
-#elif defined(__GNUC__) && defined(__x86_64__)
- __asm__(
+ : "eax","cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+ __asm__ goto(
"movq (%1), %%rax\n\t"
"subq (%2), %%rax\n\t"
- "jo 0f\n\t"
+ "jo %l5\n\t"
"movq %%rax, (%0)\n\t"
- "movl %3, %c5(%0)\n\t"
- "jmp 1f\n"
- "0:\n\t"
- "fildq (%2)\n\t"
- "fildq (%1)\n\t"
-#if defined(__clang__) && (__clang_major__ < 2 || (__clang_major__ == 2 && __clang_minor__ < 10))
- "fsubp %%st(1), %%st\n\t" /* LLVM bug #9164 */
-#else
- "fsubp %%st, %%st(1)\n\t"
-#endif
- "movl %4, %c5(%0)\n\t"
- "fstpl (%0)\n"
- "1:"
+ "movl %3, %c4(%0)\n"
:
: "r"(&result->value),
"r"(&op1->value),
"r"(&op2->value),
"n"(IS_LONG),
- "n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
- : "rax","cc", "memory");
+ : "rax","cc", "memory"
+ : overflow);
+ return;
+overflow: ZEND_ATTRIBUTE_COLD_LABEL
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+#elif PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
+ long lresult;
+ if (UNEXPECTED(__builtin_ssubl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+ } else {
+ ZVAL_LONG(result, lresult);
+ }
+#elif PHP_HAVE_BUILTIN_SSUBLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
+ long long llresult;
+ if (UNEXPECTED(__builtin_ssubll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
+ ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+ } else {
+ ZVAL_LONG(result, llresult);
+ }
#else
ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
@@ -738,6 +726,17 @@ static zend_always_inline int fast_div_function(zval *result, zval *op1, zval *o
return div_function(result, op1, op2);
}
+static zend_always_inline int zend_fast_equal_strings(zend_string *s1, zend_string *s2)
+{
+ if (s1 == s2) {
+ return 1;
+ } else if (ZSTR_VAL(s1)[0] > '9' || ZSTR_VAL(s2)[0] > '9') {
+ return zend_string_equal_content(s1, s2);
+ } else {
+ return zendi_smart_streq(s1, s2);
+ }
+}
+
static zend_always_inline int fast_equal_check_function(zval *op1, zval *op2)
{
zval result;
@@ -755,17 +754,7 @@ static zend_always_inline int fast_equal_check_function(zval *op1, zval *op2)
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- return 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- return 0;
- } else {
- return memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0;
- }
- } else {
- return zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0;
- }
+ return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
}
}
compare_function(&result, op1, op2);
@@ -786,17 +775,7 @@ static zend_always_inline int fast_equal_check_string(zval *op1, zval *op2)
{
zval result;
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- return 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- return 0;
- } else {
- return memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0;
- }
- } else {
- return zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0;
- }
+ return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
}
compare_function(&result, op1, op2);
return Z_LVAL(result) == 0;
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 79632f656b..301032d8c3 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_PORTABILITY_H
#define ZEND_PORTABILITY_H
@@ -72,7 +70,7 @@
# include <alloca.h>
#endif
-#if defined(ZEND_WIN32)
+#if defined(ZEND_WIN32) && !defined(__clang__)
#include <intrin.h>
#endif
@@ -197,17 +195,13 @@ char *alloca();
# define ZEND_ATTRIBUTE_ALLOC_SIZE2(X,Y)
#endif
-/* Format string checks are disabled by default, because we use custom format modifiers (like %p),
- * which cause a large amount of false positives. You can enable format checks by adding
- * -DZEND_CHECK_FORMAT_STRINGS to CFLAGS. */
-
-#if defined(ZEND_CHECK_FORMAT_STRINGS) && (ZEND_GCC_VERSION >= 2007 || __has_attribute(format))
+#if ZEND_GCC_VERSION >= 2007 || __has_attribute(format)
# define ZEND_ATTRIBUTE_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
#else
# define ZEND_ATTRIBUTE_FORMAT(type, idx, first)
#endif
-#if defined(ZEND_CHECK_FORMAT_STRINGS) && ((ZEND_GCC_VERSION >= 3001 && !defined(__INTEL_COMPILER)) || __has_attribute(format))
+#if (ZEND_GCC_VERSION >= 3001 && !defined(__INTEL_COMPILER)) || __has_attribute(format)
# define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
#else
# define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first)
@@ -223,14 +217,31 @@ char *alloca();
#if defined(__GNUC__) && ZEND_GCC_VERSION >= 4003
# define ZEND_ATTRIBUTE_UNUSED __attribute__((unused))
-# define ZEND_ATTRIBUTE_UNUSED_LABEL __attribute__((cold, unused));
# define ZEND_COLD __attribute__((cold))
# define ZEND_HOT __attribute__((hot))
+# ifdef __OPTIMIZE__
+# define ZEND_OPT_SIZE __attribute__((optimize("Os")))
+# define ZEND_OPT_SPEED __attribute__((optimize("Ofast")))
+# else
+# define ZEND_OPT_SIZE
+# define ZEND_OPT_SPEED
+# endif
#else
# define ZEND_ATTRIBUTE_UNUSED
-# define ZEND_ATTRIBUTE_UNUSED_LABEL
# define ZEND_COLD
# define ZEND_HOT
+# define ZEND_OPT_SIZE
+# define ZEND_OPT_SPEED
+#endif
+
+#if defined(__GNUC__) && ZEND_GCC_VERSION >= 5000
+# define ZEND_ATTRIBUTE_UNUSED_LABEL __attribute__((cold, unused));
+# define ZEND_ATTRIBUTE_COLD_LABEL __attribute__((cold));
+# define ZEND_ATTRIBUTE_HOT_LABEL __attribute__((hot));
+#else
+# define ZEND_ATTRIBUTE_UNUSED_LABEL
+# define ZEND_ATTRIBUTE_COLD_LABEL
+# define ZEND_ATTRIBUTE_HOT_LABEL
#endif
#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__)
@@ -388,9 +399,9 @@ char *alloca();
# define ZEND_FILE_LINE_ORIG_RELAY_C __zend_orig_filename, __zend_orig_lineno
# define ZEND_FILE_LINE_ORIG_RELAY_CC , ZEND_FILE_LINE_ORIG_RELAY_C
#else
-# define ZEND_FILE_LINE_D
+# define ZEND_FILE_LINE_D void
# define ZEND_FILE_LINE_DC
-# define ZEND_FILE_LINE_ORIG_D
+# define ZEND_FILE_LINE_ORIG_D void
# define ZEND_FILE_LINE_ORIG_DC
# define ZEND_FILE_LINE_RELAY_C
# define ZEND_FILE_LINE_RELAY_CC
@@ -429,6 +440,9 @@ char *alloca();
#define MAX(a, b) (((a)>(b))?(a):(b))
#define MIN(a, b) (((a)<(b))?(a):(b))
+#define ZEND_BIT_TEST(bits, bit) \
+ (((bits)[(bit) / (sizeof((bits)[0])*8)] >> ((bit) & (sizeof((bits)[0])*8-1))) & 1)
+
/* We always define a function, even if there's a macro or expression we could
* alias, so that using it in contexts where we can't make function calls
* won't fail to compile on some machines and not others.
@@ -510,6 +524,121 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# endif
#endif
+/* Intrinsics macros start. */
+
+#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET)
+# define ZEND_INTRIN_HAVE_IFUNC_TARGET 1
+#endif
+
+#if (defined(__i386__) || defined(__x86_64__))
+# if PHP_HAVE_SSSE3_INSTRUCTIONS && defined(HAVE_TMMINTRIN_H)
+# define PHP_HAVE_SSSE3
+# endif
+
+# if PHP_HAVE_SSE4_2_INSTRUCTIONS && defined(HAVE_NMMINTRIN_H)
+# define PHP_HAVE_SSE4_2
+# endif
+
+/*
+ * AVX2 support was added in gcc 4.7, but AVX2 intrinsics don't work in
+ * __attribute__((target("avx2"))) functions until gcc 4.9.
+ */
+# if PHP_HAVE_AVX2_INSTRUCTIONS && defined(HAVE_IMMINTRIN_H) && \
+ (defined(__llvm__) || defined(__clang__) || (defined(__GNUC__) && ZEND_GCC_VERSION >= 4009))
+# define PHP_HAVE_AVX2
+# endif
+#endif
+
+#ifdef __SSSE3__
+/* Instructions compiled directly. */
+# define ZEND_INTRIN_SSSE3_NATIVE 1
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSSE3)) || defined(ZEND_WIN32)
+/* Function resolved by ifunc or MINIT. */
+# define ZEND_INTRIN_SSSE3_RESOLVER 1
+#endif
+
+#if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
+# define ZEND_INTRIN_SSSE3_FUNC_PROTO 1
+#elif ZEND_INTRIN_SSSE3_RESOLVER
+# define ZEND_INTRIN_SSSE3_FUNC_PTR 1
+#endif
+
+#if ZEND_INTRIN_SSSE3_RESOLVER
+# if defined(HAVE_FUNC_ATTRIBUTE_TARGET)
+# define ZEND_INTRIN_SSSE3_FUNC_DECL(func) ZEND_API func __attribute__((target("ssse3")))
+# else
+# define ZEND_INTRIN_SSSE3_FUNC_DECL(func) func
+# endif
+#else
+# define ZEND_INTRIN_SSSE3_FUNC_DECL(func)
+#endif
+
+#if defined(HAVE_SSE4_2_DEF) || (defined(ZEND_WIN32) && defined(__SSE4_2__))
+/* Instructions compiled directly. */
+# define ZEND_INTRIN_SSE4_2_NATIVE 1
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2)) || defined(ZEND_WIN32)
+/* Function resolved by ifunc or MINIT. */
+# define ZEND_INTRIN_SSE4_2_RESOLVER 1
+#endif
+
+#if ZEND_INTRIN_SSE4_2_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
+# define ZEND_INTRIN_SSE4_2_FUNC_PROTO 1
+#elif ZEND_INTRIN_SSE4_2_RESOLVER
+# define ZEND_INTRIN_SSE4_2_FUNC_PTR 1
+#endif
+
+#if ZEND_INTRIN_SSE4_2_RESOLVER
+# if defined(HAVE_FUNC_ATTRIBUTE_TARGET)
+# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) ZEND_API func __attribute__((target("sse4.2")))
+# else
+# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) func
+# endif
+#else
+# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func)
+#endif
+
+#ifdef __AVX2__
+# define ZEND_INTRIN_AVX2_NATIVE 1
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_AVX2)) || defined(ZEND_WIN32)
+# define ZEND_INTRIN_AVX2_RESOLVER 1
+#endif
+
+#if ZEND_INTRIN_AVX2_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
+# define ZEND_INTRIN_AVX2_FUNC_PROTO 1
+#elif ZEND_INTRIN_AVX2_RESOLVER
+# define ZEND_INTRIN_AVX2_FUNC_PTR 1
+#endif
+
+#if ZEND_INTRIN_AVX2_RESOLVER
+# if defined(HAVE_FUNC_ATTRIBUTE_TARGET)
+# define ZEND_INTRIN_AVX2_FUNC_DECL(func) ZEND_API func __attribute__((target("avx2")))
+# else
+# define ZEND_INTRIN_AVX2_FUNC_DECL(func) func
+# endif
+#else
+# define ZEND_INTRIN_AVX2_FUNC_DECL(func)
+#endif
+
+/* Intrinsics macros end. */
+
+#ifdef ZEND_WIN32
+# define ZEND_SET_ALIGNED(alignment, decl) __declspec(align(alignment)) decl
+#elif HAVE_ATTRIBUTE_ALIGNED
+# define ZEND_SET_ALIGNED(alignment, decl) decl __attribute__ ((__aligned__ (alignment)))
+#else
+# define ZEND_SET_ALIGNED(alignment, decl) decl
+#endif
+
+#define ZEND_SLIDE_TO_ALIGNED(alignment, ptr) (((zend_uintptr_t)(ptr) + ((alignment)-1)) & ~((alignment)-1))
+#define ZEND_SLIDE_TO_ALIGNED16(ptr) ZEND_SLIDE_TO_ALIGNED(Z_UL(16), ptr)
+
+#ifdef ZEND_WIN32
+# define _ZEND_EXPAND_VA(a) a
+# define ZEND_EXPAND_VA(code) _ZEND_EXPAND_VA(code)
+#else
+# define ZEND_EXPAND_VA(code) code
+#endif
+
#endif /* ZEND_PORTABILITY_H */
/*
diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c
index 97643dc47d..082caed7fb 100644
--- a/Zend/zend_ptr_stack.c
+++ b/Zend/zend_ptr_stack.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_ptr_stack.h"
#ifdef HAVE_STDARG_H
@@ -90,6 +88,15 @@ ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *))
}
}
+ZEND_API void zend_ptr_stack_reverse_apply(zend_ptr_stack *stack, void (*func)(void *))
+{
+ int i = 0;
+
+ while (i < stack->top) {
+ func(stack->elements[i++]);
+ }
+}
+
ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), zend_bool free_elements)
{
diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h
index 80aa8bb252..4ec00bf255 100644
--- a/Zend/zend_ptr_stack.h
+++ b/Zend/zend_ptr_stack.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_PTR_STACK_H
#define ZEND_PTR_STACK_H
@@ -39,6 +37,7 @@ ZEND_API void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count, ...);
ZEND_API void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count, ...);
ZEND_API void zend_ptr_stack_destroy(zend_ptr_stack *stack);
ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *));
+ZEND_API void zend_ptr_stack_reverse_apply(zend_ptr_stack *stack, void (*func)(void *));
ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), zend_bool free_elements);
ZEND_API int zend_ptr_stack_num_elements(zend_ptr_stack *stack);
END_EXTERN_C()
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c
index f43de50b64..45c6335285 100644
--- a/Zend/zend_signal.c
+++ b/Zend/zend_signal.c
@@ -25,8 +25,6 @@
All other licensing and usage conditions are those of the PHP Group.
*/
- /* $Id$ */
-
#define _GNU_SOURCE
#include <string.h>
diff --git a/Zend/zend_signal.h b/Zend/zend_signal.h
index 59176f2334..37bb0139d5 100644
--- a/Zend/zend_signal.h
+++ b/Zend/zend_signal.h
@@ -18,8 +18,6 @@
*/
-/* $Id$ */
-
#ifndef ZEND_SIGNAL_H
#define ZEND_SIGNAL_H
diff --git a/Zend/zend_smart_str.c b/Zend/zend_smart_str.c
index e9d43854b3..e13741f72e 100644
--- a/Zend/zend_smart_str.c
+++ b/Zend/zend_smart_str.c
@@ -12,51 +12,47 @@
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Author: Dmitry Stogov <dmitry@zend.com> |
+ | Author: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
#include <zend.h>
#include "zend_smart_str.h"
+#include "zend_smart_string.h"
-#define SMART_STR_OVERHEAD (ZEND_MM_OVERHEAD + _ZSTR_HEADER_SIZE)
+#define SMART_STR_OVERHEAD (ZEND_MM_OVERHEAD + _ZSTR_HEADER_SIZE + 1)
+#define SMART_STR_START_SIZE 256
+#define SMART_STR_START_LEN (SMART_STR_START_SIZE - SMART_STR_OVERHEAD)
+#define SMART_STR_PAGE 4096
-#ifndef SMART_STR_PAGE
-# define SMART_STR_PAGE 4096
-#endif
-
-#ifndef SMART_STR_START_SIZE
-# define SMART_STR_START_SIZE (256 - SMART_STR_OVERHEAD - 1)
-#endif
-
-#define SMART_STR_NEW_SIZE(len) \
- (((len + SMART_STR_OVERHEAD + SMART_STR_PAGE) & ~(SMART_STR_PAGE - 1)) - SMART_STR_OVERHEAD - 1)
+#define SMART_STR_NEW_LEN(len) \
+ (ZEND_MM_ALIGNED_SIZE_EX(len + SMART_STR_OVERHEAD, SMART_STR_PAGE) - SMART_STR_OVERHEAD)
ZEND_API void ZEND_FASTCALL smart_str_erealloc(smart_str *str, size_t len)
{
if (UNEXPECTED(!str->s)) {
- str->a = len < SMART_STR_START_SIZE
- ? SMART_STR_START_SIZE
- : SMART_STR_NEW_SIZE(len);
+ str->a = len <= SMART_STR_START_LEN
+ ? SMART_STR_START_LEN
+ : SMART_STR_NEW_LEN(len);
str->s = zend_string_alloc(str->a, 0);
ZSTR_LEN(str->s) = 0;
} else {
- str->a = SMART_STR_NEW_SIZE(len);
- str->s = (zend_string *) erealloc2(str->s, _ZSTR_HEADER_SIZE + str->a + 1, _ZSTR_HEADER_SIZE + ZSTR_LEN(str->s) + 1);
+ str->a = SMART_STR_NEW_LEN(len);
+ str->s = (zend_string *) erealloc2(str->s, str->a + _ZSTR_HEADER_SIZE + 1, _ZSTR_HEADER_SIZE + ZSTR_LEN(str->s));
}
}
ZEND_API void ZEND_FASTCALL smart_str_realloc(smart_str *str, size_t len)
{
if (UNEXPECTED(!str->s)) {
- str->a = len < SMART_STR_START_SIZE
- ? SMART_STR_START_SIZE
- : SMART_STR_NEW_SIZE(len);
+ str->a = len <= SMART_STR_START_SIZE
+ ? SMART_STR_START_LEN
+ : SMART_STR_NEW_LEN(len);
str->s = zend_string_alloc(str->a, 1);
ZSTR_LEN(str->s) = 0;
} else {
- str->a = SMART_STR_NEW_SIZE(len);
- str->s = (zend_string *) realloc(str->s, _ZSTR_HEADER_SIZE + str->a + 1);
+ str->a = SMART_STR_NEW_LEN(len);
+ str->s = (zend_string *) perealloc(str->s, str->a + _ZSTR_HEADER_SIZE + 1, 1);
}
}
@@ -118,13 +114,64 @@ ZEND_API void ZEND_FASTCALL smart_str_append_escaped(smart_str *str, const char
}
}
-ZEND_API void ZEND_FASTCALL smart_str_append_printf(smart_str *dest, const char *format, ...) {
+ZEND_API void smart_str_append_printf(smart_str *dest, const char *format, ...) {
va_list arg;
va_start(arg, format);
zend_printf_to_smart_str(dest, format, arg);
va_end(arg);
}
+#define SMART_STRING_OVERHEAD (ZEND_MM_OVERHEAD + 1)
+#define SMART_STRING_START_SIZE 256
+#define SMART_STRING_START_LEN (SMART_STRING_START_SIZE - SMART_STRING_OVERHEAD)
+#define SMART_STRING_PAGE 4096
+
+ZEND_API void ZEND_FASTCALL _smart_string_alloc_persistent(smart_string *str, size_t len)
+{
+ if (!str->c) {
+ str->len = 0;
+ if (len <= SMART_STRING_START_LEN) {
+ str->a = SMART_STRING_START_LEN;
+ } else {
+ str->a = ZEND_MM_ALIGNED_SIZE_EX(len + SMART_STRING_OVERHEAD, SMART_STRING_PAGE) - SMART_STRING_OVERHEAD;
+ }
+ str->c = pemalloc(str->a + 1, 1);
+ } else {
+ if (UNEXPECTED((size_t) len > SIZE_MAX - str->len)) {
+ zend_error(E_ERROR, "String size overflow");
+ }
+ len += str->len;
+ str->a = ZEND_MM_ALIGNED_SIZE_EX(len + SMART_STRING_OVERHEAD, SMART_STRING_PAGE) - SMART_STRING_OVERHEAD;
+ str->c = perealloc(str->c, str->a + 1, 1);
+ }
+}
+
+ZEND_API void ZEND_FASTCALL _smart_string_alloc(smart_string *str, size_t len)
+{
+ if (!str->c) {
+ str->len = 0;
+ if (len <= SMART_STRING_START_LEN) {
+ str->a = SMART_STRING_START_LEN;
+ str->c = emalloc(SMART_STRING_START_LEN + 1);
+ } else {
+ str->a = ZEND_MM_ALIGNED_SIZE_EX(len + SMART_STRING_OVERHEAD, SMART_STRING_PAGE) - SMART_STRING_OVERHEAD;
+ if (EXPECTED(str->a < (ZEND_MM_CHUNK_SIZE - SMART_STRING_OVERHEAD))) {
+ str->c = emalloc_large(str->a + 1);
+ } else {
+ /* allocate a huge chunk */
+ str->c = emalloc(str->a + 1);
+ }
+ }
+ } else {
+ if (UNEXPECTED((size_t) len > SIZE_MAX - str->len)) {
+ zend_error(E_ERROR, "String size overflow");
+ }
+ len += str->len;
+ str->a = ZEND_MM_ALIGNED_SIZE_EX(len + SMART_STRING_OVERHEAD, SMART_STRING_PAGE) - SMART_STRING_OVERHEAD;
+ str->c = erealloc2(str->c, str->a + 1, str->len);
+ }
+}
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index 411371ab10..aed87d773b 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -27,6 +27,8 @@
smart_str_appendl_ex((dest), (src), strlen(src), (what))
#define smart_str_appends(dest, src) \
smart_str_appendl((dest), (src), strlen(src))
+#define smart_str_extend(dest, len) \
+ smart_str_extend_ex((dest), (len), 0)
#define smart_str_appendc(dest, c) \
smart_str_appendc_ex((dest), (c), 0)
#define smart_str_appendl(dest, src, len) \
@@ -41,13 +43,15 @@
smart_str_append_long_ex((dest), (val), 0)
#define smart_str_append_unsigned(dest, val) \
smart_str_append_unsigned_ex((dest), (val), 0)
+#define smart_str_free(dest) \
+ smart_str_free_ex((dest), 0)
BEGIN_EXTERN_C()
ZEND_API void ZEND_FASTCALL smart_str_erealloc(smart_str *str, size_t len);
ZEND_API void ZEND_FASTCALL smart_str_realloc(smart_str *str, size_t len);
ZEND_API void ZEND_FASTCALL smart_str_append_escaped(smart_str *str, const char *s, size_t l);
-ZEND_API void ZEND_FASTCALL smart_str_append_printf(smart_str *dest, const char *format, ...)
+ZEND_API void smart_str_append_printf(smart_str *dest, const char *format, ...)
ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
END_EXTERN_C()
@@ -69,9 +73,16 @@ do_smart_str_realloc:
return len;
}
-static zend_always_inline void smart_str_free(smart_str *str) {
+static zend_always_inline char* smart_str_extend_ex(smart_str *dest, size_t len, zend_bool persistent) {
+ size_t new_len = smart_str_alloc(dest, len, persistent);
+ char *ret = ZSTR_VAL(dest->s) + ZSTR_LEN(dest->s);
+ ZSTR_LEN(dest->s) = new_len;
+ return ret;
+}
+
+static zend_always_inline void smart_str_free_ex(smart_str *str, zend_bool persistent) {
if (str->s) {
- zend_string_release(str->s);
+ zend_string_release_ex(str->s, persistent);
str->s = NULL;
}
str->a = 0;
diff --git a/Zend/zend_smart_string.h b/Zend/zend_smart_string.h
index 0ad7c18a51..f162bf2163 100644
--- a/Zend/zend_smart_string.h
+++ b/Zend/zend_smart_string.h
@@ -17,34 +17,13 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef PHP_SMART_STRING_H
#define PHP_SMART_STRING_H
#include "zend_smart_string_public.h"
#include <stdlib.h>
-#ifndef SMART_STR_USE_REALLOC
#include <zend.h>
-#endif
-
-#ifndef SMART_STRING_PREALLOC
-#define SMART_STRING_PREALLOC 128
-#endif
-
-#ifndef SMART_STRING_START_SIZE
-#define SMART_STRING_START_SIZE 78
-#endif
-
-#ifdef SMART_STRING_USE_REALLOC
-#define SMART_STRING_REALLOC(a,b,c) realloc((a),(b))
-#else
-#define SMART_STRING_REALLOC(a,b,c) perealloc((a),(b),(c))
-#endif
-
-#define SMART_STRING_DO_REALLOC(d, what) \
- (d)->c = (char *) SMART_STRING_REALLOC((d)->c, (d)->a + 1, (what))
/* wrapper */
@@ -71,25 +50,18 @@
#define smart_string_append_unsigned(str, val) \
smart_string_append_unsigned_ex((str), (val), 0)
+ZEND_API void ZEND_FASTCALL _smart_string_alloc_persistent(smart_string *str, size_t len);
+ZEND_API void ZEND_FASTCALL _smart_string_alloc(smart_string *str, size_t len);
+
static zend_always_inline size_t smart_string_alloc(smart_string *str, size_t len, zend_bool persistent) {
- if (!str->c) {
- str->len = 0;
- str->a = len < SMART_STRING_START_SIZE
- ? SMART_STRING_START_SIZE
- : len + SMART_STRING_PREALLOC;
- SMART_STRING_DO_REALLOC(str, persistent);
- return len;
- } else {
- if (UNEXPECTED((size_t) len > SIZE_MAX - str->len)) {
- zend_error(E_ERROR, "String size overflow");
- }
- len += str->len;
- if (UNEXPECTED(len >= str->a)) {
- str->a = len + SMART_STRING_PREALLOC;
- SMART_STRING_DO_REALLOC(str, persistent);
+ if (UNEXPECTED(!str->c) || UNEXPECTED(len >= str->a - str->len)) {
+ if (persistent) {
+ _smart_string_alloc_persistent(str, len);
+ } else {
+ _smart_string_alloc(str, len);
}
}
- return len;
+ return str->len + len;
}
static zend_always_inline void smart_string_free_ex(smart_string *str, zend_bool persistent) {
@@ -136,6 +108,10 @@ static zend_always_inline void smart_string_setl(smart_string *dest, char *src,
dest->c = src;
}
+static zend_always_inline void smart_string_reset(smart_string *str) {
+ str->len = 0;
+}
+
#endif
/*
diff --git a/Zend/zend_smart_string_public.h b/Zend/zend_smart_string_public.h
index 8a0d81837f..ea0f3ddf4f 100644
--- a/Zend/zend_smart_string_public.h
+++ b/Zend/zend_smart_string_public.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef PHP_SMART_STRING_PUBLIC_H
#define PHP_SMART_STRING_PUBLIC_H
diff --git a/Zend/zend_sort.c b/Zend/zend_sort.c
index f9932abecd..3127586097 100644
--- a/Zend/zend_sort.c
+++ b/Zend/zend_sort.c
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_sort.h"
#include <limits.h>
diff --git a/Zend/zend_sort.h b/Zend/zend_sort.h
index 58d906321c..a19cd44123 100644
--- a/Zend/zend_sort.h
+++ b/Zend/zend_sort.h
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_SORT_H
#define ZEND_SORT_H
diff --git a/Zend/zend_sprintf.c b/Zend/zend_sprintf.c
index bfb90da687..efe0897195 100644
--- a/Zend/zend_sprintf.c
+++ b/Zend/zend_sprintf.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <stdio.h>
#include "zend.h"
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index 77df7e4423..1bb3aa0c55 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_stack.h"
diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h
index 371a068bba..889cdd3c94 100644
--- a/Zend/zend_stack.h
+++ b/Zend/zend_stack.h
@@ -12,13 +12,11 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_STACK_H
#define ZEND_STACK_H
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index e14dc68edd..22726f0812 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -19,9 +19,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
-
#include "zend.h"
#include "zend_compile.h"
#include "zend_stream.h"
@@ -313,7 +310,7 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
break;
}
if (fh->opened_path) {
- zend_string_release(fh->opened_path);
+ zend_string_release_ex(fh->opened_path, 0);
fh->opened_path = NULL;
}
if (fh->free_filename && fh->filename) {
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 109d7a1263..8279d69c4d 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -19,8 +19,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_STREAM_H
#define ZEND_STREAM_H
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index 2fdc51dfa8..61e5f51b7f 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -12,19 +12,24 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id: $ */
-
#include "zend.h"
#include "zend_globals.h"
-ZEND_API zend_string *(*zend_new_interned_string)(zend_string *str);
+#ifdef HAVE_VALGRIND
+# include "valgrind/callgrind.h"
+#endif
+
+ZEND_API zend_new_interned_string_func_t zend_new_interned_string;
+ZEND_API zend_string_init_interned_func_t zend_string_init_interned;
-static zend_string *zend_new_interned_string_permanent(zend_string *str);
-static zend_string *zend_new_interned_string_request(zend_string *str);
+static zend_string* ZEND_FASTCALL zend_new_interned_string_permanent(zend_string *str);
+static zend_string* ZEND_FASTCALL zend_new_interned_string_request(zend_string *str);
+static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, int permanent);
+static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, int permanent);
/* Any strings interned in the startup phase. Common to all the threads,
won't be free'd until process exit. If we want an ability to
@@ -33,13 +38,20 @@ static zend_string *zend_new_interned_string_request(zend_string *str);
static HashTable interned_strings_permanent;
static zend_new_interned_string_func_t interned_string_request_handler = zend_new_interned_string_request;
+static zend_string_init_interned_func_t interned_string_init_request_handler = zend_string_init_interned_request;
static zend_string_copy_storage_func_t interned_string_copy_storage = NULL;
+static zend_string_copy_storage_func_t interned_string_restore_storage = NULL;
ZEND_API zend_string *zend_empty_string = NULL;
ZEND_API zend_string *zend_one_char_string[256];
ZEND_API zend_string **zend_known_strings = NULL;
-ZEND_API zend_ulong zend_hash_func(const char *str, size_t len)
+ZEND_API zend_ulong ZEND_FASTCALL zend_string_hash_func(zend_string *str)
+{
+ return ZSTR_H(str) = zend_hash_func(ZSTR_VAL(str), ZSTR_LEN(str));
+}
+
+ZEND_API zend_ulong ZEND_FASTCALL zend_hash_func(const char *str, size_t len)
{
return zend_inline_hash_func(str, len);
}
@@ -60,7 +72,7 @@ ZEND_KNOWN_STRINGS(_ZEND_STR_DSC)
static void zend_init_interned_strings_ht(HashTable *interned_strings, int permanent)
{
zend_hash_init(interned_strings, 1024, NULL, _str_dtor, permanent);
- zend_hash_real_init(interned_strings, 0);
+ zend_hash_real_init_mixed(interned_strings);
}
ZEND_API void zend_interned_strings_init(void)
@@ -70,7 +82,9 @@ ZEND_API void zend_interned_strings_init(void)
zend_string *str;
interned_string_request_handler = zend_new_interned_string_request;
+ interned_string_init_request_handler = zend_string_init_interned_request;
interned_string_copy_storage = NULL;
+ interned_string_restore_storage = NULL;
zend_empty_string = NULL;
zend_known_strings = NULL;
@@ -78,6 +92,7 @@ ZEND_API void zend_interned_strings_init(void)
zend_init_interned_strings_ht(&interned_strings_permanent, 1);
zend_new_interned_string = zend_new_interned_string_permanent;
+ zend_string_init_interned = zend_string_init_interned_permanent;
/* interned empty string */
str = zend_string_alloc(sizeof("")-1, 1);
@@ -106,20 +121,18 @@ ZEND_API void zend_interned_strings_dtor(void)
zend_known_strings = NULL;
}
-static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_string *str, HashTable *interned_strings)
+static zend_always_inline zend_string *zend_interned_string_ht_lookup_ex(zend_ulong h, const char *str, size_t size, HashTable *interned_strings)
{
- zend_ulong h;
uint32_t nIndex;
uint32_t idx;
Bucket *p;
- h = zend_string_hash_val(str);
nIndex = h | interned_strings->nTableMask;
idx = HT_HASH(interned_strings, nIndex);
while (idx != HT_INVALID_IDX) {
p = HT_HASH_TO_BUCKET(interned_strings, idx);
- if ((p->h == h) && (ZSTR_LEN(p->key) == ZSTR_LEN(str))) {
- if (!memcmp(ZSTR_VAL(p->key), ZSTR_VAL(str), ZSTR_LEN(str))) {
+ if ((p->h == h) && (ZSTR_LEN(p->key) == size)) {
+ if (!memcmp(ZSTR_VAL(p->key), str, size)) {
return p->key;
}
}
@@ -129,14 +142,34 @@ static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_strin
return NULL;
}
+static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_string *str, HashTable *interned_strings)
+{
+ zend_ulong h = ZSTR_H(str);
+ uint32_t nIndex;
+ uint32_t idx;
+ Bucket *p;
+
+ nIndex = h | interned_strings->nTableMask;
+ idx = HT_HASH(interned_strings, nIndex);
+ while (idx != HT_INVALID_IDX) {
+ p = HT_HASH_TO_BUCKET(interned_strings, idx);
+ if ((p->h == h) && zend_string_equal_content(p->key, str)) {
+ return p->key;
+ }
+ idx = Z_NEXT(p->val);
+ }
+
+ return NULL;
+}
+
/* This function might be not thread safe at least because it would update the
hash val in the passed string. Be sure it is called in the appropriate context. */
static zend_always_inline zend_string *zend_add_interned_string(zend_string *str, HashTable *interned_strings, uint32_t flags)
{
zval val;
- GC_REFCOUNT(str) = 1;
- GC_FLAGS(str) |= IS_STR_INTERNED | flags;
+ GC_SET_REFCOUNT(str, 1);
+ GC_ADD_FLAGS(str, IS_STR_INTERNED | flags);
ZVAL_INTERNED_STR(&val, str);
@@ -145,13 +178,13 @@ static zend_always_inline zend_string *zend_add_interned_string(zend_string *str
return str;
}
-ZEND_API zend_string *zend_interned_string_find_permanent(zend_string *str)
+ZEND_API zend_string* ZEND_FASTCALL zend_interned_string_find_permanent(zend_string *str)
{
+ zend_string_hash_val(str);
return zend_interned_string_ht_lookup(str, &interned_strings_permanent);
}
-
-static zend_string *zend_new_interned_string_permanent(zend_string *str)
+static zend_string* ZEND_FASTCALL zend_new_interned_string_permanent(zend_string *str)
{
zend_string *ret;
@@ -159,16 +192,25 @@ static zend_string *zend_new_interned_string_permanent(zend_string *str)
return str;
}
+ zend_string_hash_val(str);
ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
if (ret) {
zend_string_release(str);
return ret;
}
+ ZEND_ASSERT(GC_FLAGS(str) & GC_PERSISTENT);
+ if (GC_REFCOUNT(str) > 1) {
+ zend_ulong h = ZSTR_H(str);
+ zend_string_delref(str);
+ str = zend_string_init(ZSTR_VAL(str), ZSTR_LEN(str), 1);
+ ZSTR_H(str) = h;
+ }
+
return zend_add_interned_string(str, &interned_strings_permanent, IS_STR_PERMANENT);
}
-static zend_string *zend_new_interned_string_request(zend_string *str)
+static zend_string* ZEND_FASTCALL zend_new_interned_string_request(zend_string *str)
{
zend_string *ret;
@@ -176,6 +218,8 @@ static zend_string *zend_new_interned_string_request(zend_string *str)
return str;
}
+ zend_string_hash_val(str);
+
/* Check for permanent strings, the table is readonly at this point. */
ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
if (ret) {
@@ -190,11 +234,71 @@ static zend_string *zend_new_interned_string_request(zend_string *str)
}
/* Create a short living interned, freed after the request. */
+#if ZEND_RC_DEBUG
+ if (zend_rc_debug) {
+ /* PHP shouldn't create persistent interned string during request,
+ * but at least dl() may do this */
+ ZEND_ASSERT(!(GC_FLAGS(str) & GC_PERSISTENT));
+ }
+#endif
+ if (GC_REFCOUNT(str) > 1) {
+ zend_ulong h = ZSTR_H(str);
+ zend_string_delref(str);
+ str = zend_string_init(ZSTR_VAL(str), ZSTR_LEN(str), 0);
+ ZSTR_H(str) = h;
+ }
+
ret = zend_add_interned_string(str, &CG(interned_strings), 0);
return ret;
}
+static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, int permanent)
+{
+ zend_string *ret;
+ zend_ulong h = zend_inline_hash_func(str, size);
+
+ ret = zend_interned_string_ht_lookup_ex(h, str, size, &interned_strings_permanent);
+ if (ret) {
+ return ret;
+ }
+
+ ZEND_ASSERT(permanent);
+ ret = zend_string_init(str, size, permanent);
+ ZSTR_H(ret) = h;
+ return zend_add_interned_string(ret, &interned_strings_permanent, IS_STR_PERMANENT);
+}
+
+static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, int permanent)
+{
+ zend_string *ret;
+ zend_ulong h = zend_inline_hash_func(str, size);
+
+ /* Check for permanent strings, the table is readonly at this point. */
+ ret = zend_interned_string_ht_lookup_ex(h, str, size, &interned_strings_permanent);
+ if (ret) {
+ return ret;
+ }
+
+ ret = zend_interned_string_ht_lookup_ex(h, str, size, &CG(interned_strings));
+ if (ret) {
+ return ret;
+ }
+
+#if ZEND_RC_DEBUG
+ if (zend_rc_debug) {
+ /* PHP shouldn't create persistent interned string during request,
+ * but at least dl() may do this */
+ ZEND_ASSERT(!permanent);
+ }
+#endif
+ ret = zend_string_init(str, size, permanent);
+ ZSTR_H(ret) = h;
+
+ /* Create a short living interned, freed after the request. */
+ return zend_add_interned_string(ret, &CG(interned_strings), 0);
+}
+
ZEND_API void zend_interned_strings_activate(void)
{
zend_init_interned_strings_ht(&CG(interned_strings), 0);
@@ -205,24 +309,173 @@ ZEND_API void zend_interned_strings_deactivate(void)
zend_hash_destroy(&CG(interned_strings));
}
-ZEND_API void zend_interned_strings_set_request_storage_handler(zend_new_interned_string_func_t handler)
+ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler)
{
interned_string_request_handler = handler;
+ interned_string_init_request_handler = init_handler;
}
-ZEND_API void zend_interned_strings_set_permanent_storage_copy_handler(zend_string_copy_storage_func_t handler)
+ZEND_API void zend_interned_strings_set_permanent_storage_copy_handlers(zend_string_copy_storage_func_t copy_handler, zend_string_copy_storage_func_t restore_handler)
{
- interned_string_copy_storage = handler;
+ interned_string_copy_storage = copy_handler;
+ interned_string_restore_storage = restore_handler;
}
-ZEND_API void zend_interned_strings_switch_storage(void)
+ZEND_API void zend_interned_strings_switch_storage(zend_bool request)
{
- if (interned_string_copy_storage) {
- interned_string_copy_storage();
+ if (request) {
+ if (interned_string_copy_storage) {
+ interned_string_copy_storage();
+ }
+ zend_new_interned_string = interned_string_request_handler;
+ zend_string_init_interned = interned_string_init_request_handler;
+ } else {
+ zend_new_interned_string = zend_new_interned_string_permanent;
+ zend_string_init_interned = zend_string_init_interned_permanent;
+ if (interned_string_restore_storage) {
+ interned_string_restore_storage();
+ }
}
- zend_new_interned_string = interned_string_request_handler;
}
+#if defined(__GNUC__) && defined(__i386__)
+ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
+{
+ char *ptr = ZSTR_VAL(s1);
+ size_t delta = (char*)s2 - (char*)s1;
+ size_t len = ZSTR_LEN(s1);
+ zend_ulong ret;
+
+ __asm__ (
+ ".LL0%=:\n\t"
+ "movl (%2,%3), %0\n\t"
+ "xorl (%2), %0\n\t"
+ "jne .LL1%=\n\t"
+ "addl $0x4, %2\n\t"
+ "subl $0x4, %1\n\t"
+ "ja .LL0%=\n\t"
+ "movl $0x1, %0\n\t"
+ "jmp .LL3%=\n\t"
+ ".LL1%=:\n\t"
+ "cmpl $0x4,%1\n\t"
+ "jb .LL2%=\n\t"
+ "xorl %0, %0\n\t"
+ "jmp .LL3%=\n\t"
+ ".LL2%=:\n\t"
+ "negl %1\n\t"
+ "lea 0x20(,%1,8), %1\n\t"
+ "shll %b1, %0\n\t"
+ "sete %b0\n\t"
+ "movzbl %b0, %0\n\t"
+ ".LL3%=:\n"
+ : "=&a"(ret),
+ "+c"(len),
+ "+r"(ptr)
+ : "r"(delta)
+ : "cc");
+ return ret;
+}
+
+#ifdef HAVE_VALGRIND
+ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
+{
+ size_t len = ZSTR_LEN(s1);
+ char *ptr1 = ZSTR_VAL(s1);
+ char *ptr2 = ZSTR_VAL(s2);
+ zend_ulong ret;
+
+ __asm__ (
+ "test %1, %1\n\t"
+ "jnz .LL1%=\n\t"
+ "movl $0x1, %0\n\t"
+ "jmp .LL2%=\n\t"
+ ".LL1%=:\n\t"
+ "cld\n\t"
+ "rep\n\t"
+ "cmpsb\n\t"
+ "sete %b0\n\t"
+ "movzbl %b0, %0\n\t"
+ ".LL2%=:\n"
+ : "=a"(ret),
+ "+c"(len),
+ "+D"(ptr1),
+ "+S"(ptr2)
+ :
+ : "cc");
+ return ret;
+}
+#endif
+
+#elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
+ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
+{
+ char *ptr = ZSTR_VAL(s1);
+ size_t delta = (char*)s2 - (char*)s1;
+ size_t len = ZSTR_LEN(s1);
+ zend_ulong ret;
+
+ __asm__ (
+ ".LL0%=:\n\t"
+ "movq (%2,%3), %0\n\t"
+ "xorq (%2), %0\n\t"
+ "jne .LL1%=\n\t"
+ "addq $0x8, %2\n\t"
+ "subq $0x8, %1\n\t"
+ "ja .LL0%=\n\t"
+ "movq $0x1, %0\n\t"
+ "jmp .LL3%=\n\t"
+ ".LL1%=:\n\t"
+ "cmpq $0x8,%1\n\t"
+ "jb .LL2%=\n\t"
+ "xorq %0, %0\n\t"
+ "jmp .LL3%=\n\t"
+ ".LL2%=:\n\t"
+ "negq %1\n\t"
+ "lea 0x40(,%1,8), %1\n\t"
+ "shlq %b1, %0\n\t"
+ "sete %b0\n\t"
+ "movzbq %b0, %0\n\t"
+ ".LL3%=:\n"
+ : "=&a"(ret),
+ "+c"(len),
+ "+r"(ptr)
+ : "r"(delta)
+ : "cc");
+ return ret;
+}
+
+#ifdef HAVE_VALGRIND
+ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
+{
+ size_t len = ZSTR_LEN(s1);
+ char *ptr1 = ZSTR_VAL(s1);
+ char *ptr2 = ZSTR_VAL(s2);
+ zend_ulong ret;
+
+ __asm__ (
+ "test %1, %1\n\t"
+ "jnz .LL1%=\n\t"
+ "movq $0x1, %0\n\t"
+ "jmp .LL2%=\n\t"
+ ".LL1%=:\n\t"
+ "cld\n\t"
+ "rep\n\t"
+ "cmpsb\n\t"
+ "sete %b0\n\t"
+ "movzbq %b0, %0\n\t"
+ ".LL2%=:\n"
+ : "=a"(ret),
+ "+c"(len),
+ "+D"(ptr1),
+ "+S"(ptr2)
+ :
+ : "cc");
+ return ret;
+}
+#endif
+
+#endif
+
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index 784b88ea6a..c95578d4a5 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id: $ */
-
#ifndef ZEND_STRING_H
#define ZEND_STRING_H
@@ -26,19 +24,23 @@
BEGIN_EXTERN_C()
typedef void (*zend_string_copy_storage_func_t)(void);
-typedef zend_string *(*zend_new_interned_string_func_t)(zend_string *str);
+typedef zend_string *(ZEND_FASTCALL *zend_new_interned_string_func_t)(zend_string *str);
+typedef zend_string *(ZEND_FASTCALL *zend_string_init_interned_func_t)(const char *str, size_t size, int permanent);
ZEND_API extern zend_new_interned_string_func_t zend_new_interned_string;
+ZEND_API extern zend_string_init_interned_func_t zend_string_init_interned;
+
+ZEND_API zend_ulong ZEND_FASTCALL zend_string_hash_func(zend_string *str);
+ZEND_API zend_ulong ZEND_FASTCALL zend_hash_func(const char *str, size_t len);
+ZEND_API zend_string* ZEND_FASTCALL zend_interned_string_find_permanent(zend_string *str);
-ZEND_API zend_ulong zend_hash_func(const char *str, size_t len);
ZEND_API void zend_interned_strings_init(void);
ZEND_API void zend_interned_strings_dtor(void);
ZEND_API void zend_interned_strings_activate(void);
ZEND_API void zend_interned_strings_deactivate(void);
-ZEND_API zend_string *zend_interned_string_find_permanent(zend_string *str);
-ZEND_API void zend_interned_strings_set_request_storage_handler(zend_new_interned_string_func_t handler);
-ZEND_API void zend_interned_strings_set_permanent_storage_copy_handler(zend_string_copy_storage_func_t handler);
-ZEND_API void zend_interned_strings_switch_storage(void);
+ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler);
+ZEND_API void zend_interned_strings_set_permanent_storage_copy_handlers(zend_string_copy_storage_func_t copy_handler, zend_string_copy_storage_func_t restore_handler);
+ZEND_API void zend_interned_strings_switch_storage(zend_bool request);
ZEND_API extern zend_string *zend_empty_string;
ZEND_API extern zend_string *zend_one_char_string[256];
@@ -76,7 +78,7 @@ END_EXTERN_C()
#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \
(str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \
- GC_REFCOUNT(str) = 1; \
+ GC_SET_REFCOUNT(str, 1); \
GC_TYPE_INFO(str) = IS_STRING; \
zend_string_forget_hash_val(str); \
ZSTR_LEN(str) = _len; \
@@ -94,10 +96,7 @@ END_EXTERN_C()
static zend_always_inline zend_ulong zend_string_hash_val(zend_string *s)
{
- if (!ZSTR_H(s)) {
- ZSTR_H(s) = zend_hash_func(ZSTR_VAL(s), ZSTR_LEN(s));
- }
- return ZSTR_H(s);
+ return ZSTR_H(s) ? ZSTR_H(s) : zend_string_hash_func(s);
}
static zend_always_inline void zend_string_forget_hash_val(zend_string *s)
@@ -116,7 +115,7 @@ static zend_always_inline uint32_t zend_string_refcount(const zend_string *s)
static zend_always_inline uint32_t zend_string_addref(zend_string *s)
{
if (!ZSTR_IS_INTERNED(s)) {
- return ++GC_REFCOUNT(s);
+ return GC_ADDREF(s);
}
return 1;
}
@@ -124,7 +123,7 @@ static zend_always_inline uint32_t zend_string_addref(zend_string *s)
static zend_always_inline uint32_t zend_string_delref(zend_string *s)
{
if (!ZSTR_IS_INTERNED(s)) {
- return --GC_REFCOUNT(s);
+ return GC_DELREF(s);
}
return 1;
}
@@ -133,15 +132,8 @@ static zend_always_inline zend_string *zend_string_alloc(size_t len, int persist
{
zend_string *ret = (zend_string *)pemalloc(ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent);
- GC_REFCOUNT(ret) = 1;
-#if 1
- /* optimized single assignment */
- GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << 8);
-#else
- GC_TYPE(ret) = IS_STRING;
- GC_FLAGS(ret) = (persistent ? IS_STR_PERSISTENT : 0);
- GC_INFO(ret) = 0;
-#endif
+ GC_SET_REFCOUNT(ret, 1);
+ GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
zend_string_forget_hash_val(ret);
ZSTR_LEN(ret) = len;
return ret;
@@ -151,15 +143,8 @@ static zend_always_inline zend_string *zend_string_safe_alloc(size_t n, size_t m
{
zend_string *ret = (zend_string *)safe_pemalloc(n, m, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(l)), persistent);
- GC_REFCOUNT(ret) = 1;
-#if 1
- /* optimized single assignment */
- GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << 8);
-#else
- GC_TYPE(ret) = IS_STRING;
- GC_FLAGS(ret) = (persistent ? IS_STR_PERSISTENT : 0);
- GC_INFO(ret) = 0;
-#endif
+ GC_SET_REFCOUNT(ret, 1);
+ GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
zend_string_forget_hash_val(ret);
ZSTR_LEN(ret) = (n * m) + l;
return ret;
@@ -174,17 +159,10 @@ static zend_always_inline zend_string *zend_string_init(const char *str, size_t
return ret;
}
-static zend_always_inline zend_string *zend_string_init_interned(const char *str, size_t len, int persistent)
-{
- zend_string *ret = zend_string_init(str, len, persistent);
-
- return zend_new_interned_string(ret);
-}
-
static zend_always_inline zend_string *zend_string_copy(zend_string *s)
{
if (!ZSTR_IS_INTERNED(s)) {
- GC_REFCOUNT(s)++;
+ GC_ADDREF(s);
}
return s;
}
@@ -209,7 +187,7 @@ static zend_always_inline zend_string *zend_string_realloc(zend_string *s, size_
zend_string_forget_hash_val(ret);
return ret;
} else {
- GC_REFCOUNT(s)--;
+ GC_DELREF(s);
}
}
ret = zend_string_alloc(len, persistent);
@@ -229,7 +207,7 @@ static zend_always_inline zend_string *zend_string_extend(zend_string *s, size_t
zend_string_forget_hash_val(ret);
return ret;
} else {
- GC_REFCOUNT(s)--;
+ GC_DELREF(s);
}
}
ret = zend_string_alloc(len, persistent);
@@ -249,7 +227,7 @@ static zend_always_inline zend_string *zend_string_truncate(zend_string *s, size
zend_string_forget_hash_val(ret);
return ret;
} else {
- GC_REFCOUNT(s)--;
+ GC_DELREF(s);
}
}
ret = zend_string_alloc(len, persistent);
@@ -268,7 +246,7 @@ static zend_always_inline zend_string *zend_string_safe_realloc(zend_string *s,
zend_string_forget_hash_val(ret);
return ret;
} else {
- GC_REFCOUNT(s)--;
+ GC_DELREF(s);
}
}
ret = zend_string_safe_alloc(n, m, l, persistent);
@@ -284,19 +262,57 @@ static zend_always_inline void zend_string_free(zend_string *s)
}
}
+static zend_always_inline void zend_string_efree(zend_string *s)
+{
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(s));
+ ZEND_ASSERT(GC_REFCOUNT(s) <= 1);
+ ZEND_ASSERT(!(GC_FLAGS(s) & IS_STR_PERSISTENT));
+ efree(s);
+}
+
static zend_always_inline void zend_string_release(zend_string *s)
{
if (!ZSTR_IS_INTERNED(s)) {
- if (--GC_REFCOUNT(s) == 0) {
+ if (GC_DELREF(s) == 0) {
pefree(s, GC_FLAGS(s) & IS_STR_PERSISTENT);
}
}
}
+static zend_always_inline void zend_string_release_ex(zend_string *s, int persistent)
+{
+ if (!ZSTR_IS_INTERNED(s)) {
+ if (GC_DELREF(s) == 0) {
+ if (persistent) {
+ ZEND_ASSERT(GC_FLAGS(s) & IS_STR_PERSISTENT);
+ free(s);
+ } else {
+ ZEND_ASSERT(!(GC_FLAGS(s) & IS_STR_PERSISTENT));
+ efree(s);
+ }
+ }
+ }
+}
+
+#if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
+BEGIN_EXTERN_C()
+ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2);
+END_EXTERN_C()
+#else
+static zend_always_inline zend_bool zend_string_equal_val(zend_string *s1, zend_string *s2)
+{
+ return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1));
+}
+#endif
+
+static zend_always_inline zend_bool zend_string_equal_content(zend_string *s1, zend_string *s2)
+{
+ return ZSTR_LEN(s1) == ZSTR_LEN(s2) && zend_string_equal_val(s1, s2);
+}
static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2)
{
- return s1 == s2 || (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)));
+ return s1 == s2 || zend_string_equal_content(s1, s2);
}
#define zend_string_equals_ci(s1, s2) \
@@ -423,6 +439,9 @@ EMPTY_SWITCH_DEFAULT_CASE()
_(ZEND_STR_ARRAY, "array") \
_(ZEND_STR_RESOURCE, "resource") \
_(ZEND_STR_CLOSED_RESOURCE, "resource (closed)") \
+ _(ZEND_STR_NAME, "name") \
+ _(ZEND_STR_ARGV, "argv") \
+ _(ZEND_STR_ARGC, "argc") \
typedef enum _zend_known_string_id {
diff --git a/Zend/zend_strtod.h b/Zend/zend_strtod.h
index 3c5cc03cec..aec1bfe777 100644
--- a/Zend/zend_strtod.h
+++ b/Zend/zend_strtod.h
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/* This is a header file for the strtod implementation by David M. Gay which
* can be found in zend_strtod.c */
#ifndef ZEND_STRTOD_H
diff --git a/Zend/zend_ts_hash.c b/Zend/zend_ts_hash.c
index e0971d18d1..9ed1306479 100644
--- a/Zend/zend_ts_hash.c
+++ b/Zend/zend_ts_hash.c
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include "zend.h"
#include "zend_ts_hash.h"
@@ -59,24 +57,14 @@ static void end_write(TsHashTable *ht)
}
/* delegates */
-ZEND_API void _zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
-{
-#ifdef ZTS
- ht->mx_reader = tsrm_mutex_alloc();
- ht->mx_writer = tsrm_mutex_alloc();
- ht->reader = 0;
-#endif
- _zend_hash_init(TS_HASH(ht), nSize, pDestructor, persistent ZEND_FILE_LINE_RELAY_CC);
-}
-
-ZEND_API void _zend_ts_hash_init_ex(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC)
+ZEND_API void _zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
{
#ifdef ZTS
ht->mx_reader = tsrm_mutex_alloc();
ht->mx_writer = tsrm_mutex_alloc();
ht->reader = 0;
#endif
- _zend_hash_init_ex(TS_HASH(ht), nSize, pDestructor, persistent, bApplyProtection ZEND_FILE_LINE_RELAY_CC);
+ _zend_hash_init(TS_HASH(ht), nSize, pDestructor, persistent);
}
ZEND_API void zend_ts_hash_destroy(TsHashTable *ht)
@@ -99,23 +87,45 @@ ZEND_API void zend_ts_hash_clean(TsHashTable *ht)
end_write(ht);
}
-ZEND_API zval *_zend_ts_hash_add_or_update(TsHashTable *ht, zend_string *key, zval *pData, int flag ZEND_FILE_LINE_DC)
+ZEND_API zval *zend_ts_hash_add(TsHashTable *ht, zend_string *key, zval *pData)
+{
+ zval *retval;
+
+ begin_write(ht);
+ retval = zend_hash_add(TS_HASH(ht), key, pData);
+ end_write(ht);
+
+ return retval;
+}
+
+ZEND_API zval *zend_ts_hash_update(TsHashTable *ht, zend_string *key, zval *pData)
+{
+ zval *retval;
+
+ begin_write(ht);
+ retval = zend_hash_update(TS_HASH(ht), key, pData);
+ end_write(ht);
+
+ return retval;
+}
+
+ZEND_API zval *zend_ts_hash_next_index_insert(TsHashTable *ht, zval *pData)
{
zval *retval;
begin_write(ht);
- retval = _zend_hash_add_or_update(TS_HASH(ht), key, pData, flag ZEND_FILE_LINE_RELAY_CC);
+ retval = zend_hash_next_index_insert(TS_HASH(ht), pData);
end_write(ht);
return retval;
}
-ZEND_API zval *_zend_ts_hash_index_add_or_update(TsHashTable *ht, zend_ulong h, zval *pData, int flag ZEND_FILE_LINE_DC)
+ZEND_API zval *zend_ts_hash_index_update(TsHashTable *ht, zend_ulong h, zval *pData)
{
zval *retval;
begin_write(ht);
- retval = _zend_hash_index_add_or_update(TS_HASH(ht), h, pData, flag ZEND_FILE_LINE_RELAY_CC);
+ retval = zend_hash_index_update(TS_HASH(ht), h, pData);
end_write(ht);
return retval;
@@ -344,7 +354,7 @@ ZEND_API zval *zend_ts_hash_str_find(TsHashTable *ht, const char *key, size_t le
return retval;
}
-ZEND_API zval *_zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval *zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData)
{
zval *retval;
@@ -355,7 +365,7 @@ ZEND_API zval *_zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t
return retval;
}
-ZEND_API zval *_zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC)
+ZEND_API zval *zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData)
{
zval *retval;
diff --git a/Zend/zend_ts_hash.h b/Zend/zend_ts_hash.h
index bf06e1c561..91840f203f 100644
--- a/Zend/zend_ts_hash.h
+++ b/Zend/zend_ts_hash.h
@@ -16,8 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_TS_HASH_H
#define ZEND_TS_HASH_H
@@ -37,30 +35,21 @@ BEGIN_EXTERN_C()
#define TS_HASH(table) (&(table->hash))
/* startup/shutdown */
-ZEND_API void _zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC);
-ZEND_API void _zend_ts_hash_init_ex(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC);
+ZEND_API void _zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent);
ZEND_API void zend_ts_hash_destroy(TsHashTable *ht);
ZEND_API void zend_ts_hash_clean(TsHashTable *ht);
#define zend_ts_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \
- _zend_ts_hash_init(ht, nSize, pDestructor, persistent ZEND_FILE_LINE_CC)
+ _zend_ts_hash_init(ht, nSize, pDestructor, persistent)
#define zend_ts_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) \
- _zend_ts_hash_init_ex(ht, nSize, pDestructor, persistent, bApplyProtection ZEND_FILE_LINE_CC)
+ _zend_ts_hash_init(ht, nSize, pDestructor, persistent)
/* additions/updates/changes */
-ZEND_API zval *_zend_ts_hash_add_or_update(TsHashTable *ht, zend_string *key, zval *pData, int flag ZEND_FILE_LINE_DC);
-#define zend_ts_hash_update(ht, key, pData) \
- _zend_ts_hash_add_or_update(ht, key, pData, HASH_UPDATE ZEND_FILE_LINE_CC)
-#define zend_ts_hash_add(ht, key, pData) \
- _zend_ts_hash_add_or_update(ht, key, pData, HASH_ADD ZEND_FILE_LINE_CC)
-
-ZEND_API zval *_zend_ts_hash_index_add_or_update(TsHashTable *ht, zend_ulong h, zval *pData, int flag ZEND_FILE_LINE_DC);
-#define zend_ts_hash_index_update(ht, h, pData) \
- _zend_ts_hash_index_add_or_update(ht, h, pData, HASH_UPDATE ZEND_FILE_LINE_CC)
-#define zend_ts_hash_next_index_insert(ht, pData) \
- _zend_ts_hash_index_add_or_update(ht, ht->nNextFreeElement, pData, HASH_ADD ZEND_FILE_LINE_CC)
-
+ZEND_API zval *zend_ts_hash_update(TsHashTable *ht, zend_string *key, zval *pData);
+ZEND_API zval *zend_ts_hash_add(TsHashTable *ht, zend_string *key, zval *pData);
+ZEND_API zval *zend_ts_hash_index_update(TsHashTable *ht, zend_ulong h, zval *pData);
+ZEND_API zval *zend_ts_hash_next_index_insert(TsHashTable *ht, zval *pData);
ZEND_API zval* zend_ts_hash_add_empty_element(TsHashTable *ht, zend_string *key);
ZEND_API void zend_ts_hash_graceful_destroy(TsHashTable *ht);
@@ -103,13 +92,8 @@ void zend_ts_hash_display(TsHashTable *ht);
#endif
ZEND_API zval *zend_ts_hash_str_find(TsHashTable *ht, const char *key, size_t len);
-ZEND_API zval *_zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-ZEND_API zval *_zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData ZEND_FILE_LINE_DC);
-
-#define zend_ts_hash_str_update(ht, key, len, pData) \
- _zend_ts_hash_str_update(ht, key, len, pData ZEND_FILE_LINE_CC)
-#define zend_ts_hash_str_add(ht, key, len, pData) \
- _zend_ts_hash_str_add(ht, key, len, pData ZEND_FILE_LINE_CC)
+ZEND_API zval *zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData);
+ZEND_API zval *zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData);
static zend_always_inline void *zend_ts_hash_str_find_ptr(TsHashTable *ht, const char *str, size_t len)
{
diff --git a/Zend/zend_type_info.h b/Zend/zend_type_info.h
index 9bdbc98260..7273892dd7 100644
--- a/Zend/zend_type_info.h
+++ b/Zend/zend_type_info.h
@@ -12,12 +12,10 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_TYPE_INFO_H
#define ZEND_TYPE_INFO_H
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index fd4b71e9a8..4250aabd1f 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -12,21 +12,24 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
| Xinchen Hui <xinchen.h@zend.com> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_TYPES_H
#define ZEND_TYPES_H
#include "zend_portability.h"
#include "zend_long.h"
+#ifdef __SSE2__
+# include <mmintrin.h>
+# include <emmintrin.h>
+#endif
+
#ifdef WORDS_BIGENDIAN
# define ZEND_ENDIAN_LOHI(lo, hi) hi; lo;
# define ZEND_ENDIAN_LOHI_3(lo, mi, hi) hi; mi; lo;
@@ -180,23 +183,27 @@ struct _zval_struct {
zend_value value; /* value */
union {
struct {
- ZEND_ENDIAN_LOHI_4(
+ ZEND_ENDIAN_LOHI_3(
zend_uchar type, /* active type */
zend_uchar type_flags,
- zend_uchar const_flags,
- zend_uchar reserved) /* call info for EX(This) */
+ union {
+ uint16_t call_info; /* call info for EX(This) */
+ uint16_t extra; /* not further specified */
+ } u)
} v;
uint32_t type_info;
} u1;
union {
uint32_t next; /* hash collision chain */
- uint32_t cache_slot; /* literal cache slot */
+ uint32_t cache_slot; /* cache slot (for RECV_INIT) */
+ uint32_t opline_num; /* opline number (for FAST_CALL) */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags */
uint32_t property_guard; /* single property guard */
+ uint32_t constant_flags; /* constant flags */
uint32_t extra; /* not further specified */
} u2;
};
@@ -204,12 +211,6 @@ struct _zval_struct {
typedef struct _zend_refcounted_h {
uint32_t refcount; /* reference counter 32-bit */
union {
- struct {
- ZEND_ENDIAN_LOHI_3(
- zend_uchar type,
- zend_uchar flags, /* used for strings & objects */
- uint16_t gc_info) /* keeps GC root number (or 0) and color */
- } v;
uint32_t type_info;
} u;
} zend_refcounted_h;
@@ -239,9 +240,9 @@ struct _zend_array {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar flags,
- zend_uchar nApplyCount,
+ zend_uchar _unused,
zend_uchar nIteratorsCount,
- zend_uchar consistency)
+ zend_uchar _unused2)
} v;
uint32_t flags;
} u;
@@ -300,6 +301,8 @@ struct _zend_array {
#define HT_HASH(ht, idx) \
HT_HASH_EX((ht)->arData, idx)
+#define HT_SIZE_TO_MASK(nTableSize) \
+ ((uint32_t)(-((nTableSize) + (nTableSize))))
#define HT_HASH_SIZE(nTableMask) \
(((size_t)(uint32_t)-(int32_t)(nTableMask)) * sizeof(uint32_t))
#define HT_DATA_SIZE(nTableSize) \
@@ -310,8 +313,26 @@ struct _zend_array {
HT_SIZE_EX((ht)->nTableSize, (ht)->nTableMask)
#define HT_USED_SIZE(ht) \
(HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(Bucket)))
-#define HT_HASH_RESET(ht) \
+#ifdef __SSE2__
+# define HT_HASH_RESET(ht) do { \
+ char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
+ size_t size = HT_HASH_SIZE((ht)->nTableMask); \
+ __m128i xmm0 = _mm_setzero_si128(); \
+ xmm0 = _mm_cmpeq_epi8(xmm0, xmm0); \
+ ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
+ do { \
+ _mm_storeu_si128((__m128i*)p, xmm0); \
+ _mm_storeu_si128((__m128i*)(p+16), xmm0); \
+ _mm_storeu_si128((__m128i*)(p+32), xmm0); \
+ _mm_storeu_si128((__m128i*)(p+48), xmm0); \
+ p += 64; \
+ size -= 64; \
+ } while (size != 0); \
+ } while (0)
+#else
+# define HT_HASH_RESET(ht) \
memset(&HT_HASH(ht, (ht)->nTableMask), HT_INVALID_IDX, HT_HASH_SIZE((ht)->nTableMask))
+#endif
#define HT_HASH_RESET_PACKED(ht) do { \
HT_HASH(ht, -2) = HT_INVALID_IDX; \
HT_HASH(ht, -1) = HT_INVALID_IDX; \
@@ -355,7 +376,7 @@ struct _zend_reference {
struct _zend_ast_ref {
zend_refcounted_h gc;
- zend_ast *ast;
+ /*zend_ast ast; zend_ast follows the zend_ast_ref structure */
};
/* regular data types */
@@ -372,19 +393,19 @@ struct _zend_ast_ref {
#define IS_REFERENCE 10
/* constant expressions */
-#define IS_CONSTANT 11
-#define IS_CONSTANT_AST 12
-
-/* fake types */
-#define _IS_BOOL 13
-#define IS_CALLABLE 14
-#define IS_ITERABLE 19
-#define IS_VOID 18
+#define IS_CONSTANT_AST 11
/* internal types */
-#define IS_INDIRECT 15
-#define IS_PTR 17
-#define _IS_ERROR 20
+#define IS_INDIRECT 13
+#define IS_PTR 14
+#define _IS_ERROR 15
+
+/* fake types used only for type hinting (Z_TYPE(zv) can not use them) */
+#define _IS_BOOL 16
+#define IS_CALLABLE 17
+#define IS_ITERABLE 18
+#define IS_VOID 19
+#define _IS_NUMBER 20
static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
return pz->u1.v.type;
@@ -402,9 +423,6 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_TYPE_FLAGS(zval) (zval).u1.v.type_flags
#define Z_TYPE_FLAGS_P(zval_p) Z_TYPE_FLAGS(*(zval_p))
-#define Z_CONST_FLAGS(zval) (zval).u1.v.const_flags
-#define Z_CONST_FLAGS_P(zval_p) Z_CONST_FLAGS(*(zval_p))
-
#define Z_TYPE_INFO(zval) (zval).u1.type_info
#define Z_TYPE_INFO_P(zval_p) Z_TYPE_INFO(*(zval_p))
@@ -414,6 +432,12 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_CACHE_SLOT(zval) (zval).u2.cache_slot
#define Z_CACHE_SLOT_P(zval_p) Z_CACHE_SLOT(*(zval_p))
+#define Z_LINENO(zval) (zval).u2.lineno
+#define Z_LINENO_P(zval_p) Z_LINENO(*(zval_p))
+
+#define Z_OPLINE_NUM(zval) (zval).u2.opline_num
+#define Z_OPLINE_NUM_P(zval_p) Z_OPLINE_NUM(*(zval_p))
+
#define Z_FE_POS(zval) (zval).u2.fe_pos
#define Z_FE_POS_P(zval_p) Z_FE_POS(*(zval_p))
@@ -423,6 +447,12 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_ACCESS_FLAGS(zval) (zval).u2.access_flags
#define Z_ACCESS_FLAGS_P(zval_p) Z_ACCESS_FLAGS(*(zval_p))
+#define Z_PROPERTY_GUARD(zval) (zval).u2.property_guard
+#define Z_PROPERTY_GUARD_P(zval_p) Z_PROPERTY_GUARD(*(zval_p))
+
+#define Z_CONSTANT_FLAGS(zval) (zval).u2.constant_flags
+#define Z_CONSTANT_FLAGS_P(zval_p) Z_CONSTANT_FLAGS(*(zval_p))
+
#define Z_EXTRA(zval) (zval).u2.extra
#define Z_EXTRA_P(zval_p) Z_EXTRA(*(zval_p))
@@ -430,15 +460,46 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_COUNTED_P(zval_p) Z_COUNTED(*(zval_p))
#define Z_TYPE_MASK 0xff
+#define Z_TYPE_FLAGS_MASK 0xff00
#define Z_TYPE_FLAGS_SHIFT 8
-#define Z_CONST_FLAGS_SHIFT 16
-#define GC_REFCOUNT(p) (p)->gc.refcount
-#define GC_TYPE(p) (p)->gc.u.v.type
-#define GC_FLAGS(p) (p)->gc.u.v.flags
-#define GC_INFO(p) (p)->gc.u.v.gc_info
+#define GC_REFCOUNT(p) zend_gc_refcount(&(p)->gc)
+#define GC_SET_REFCOUNT(p, rc) zend_gc_set_refcount(&(p)->gc, rc)
+#define GC_ADDREF(p) zend_gc_addref(&(p)->gc)
+#define GC_DELREF(p) zend_gc_delref(&(p)->gc)
+#define GC_ADDREF_EX(p, rc) zend_gc_addref_ex(&(p)->gc, rc)
+#define GC_DELREF_EX(p, rc) zend_gc_delref_ex(&(p)->gc, rc)
+
+#define GC_TYPE_MASK 0x0000000f
+#define GC_FLAGS_MASK 0x000003f0
+#define GC_INFO_MASK 0xfffffc00
+#define GC_FLAGS_SHIFT 0
+#define GC_INFO_SHIFT 10
+
+static zend_always_inline zend_uchar zval_gc_type(uint32_t gc_type_info) {
+ return (gc_type_info & GC_TYPE_MASK);
+}
+
+static zend_always_inline uint32_t zval_gc_flags(uint32_t gc_type_info) {
+ return (gc_type_info >> GC_FLAGS_SHIFT) & (GC_FLAGS_MASK >> GC_FLAGS_SHIFT);
+}
+
+static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
+ return (gc_type_info >> GC_INFO_SHIFT);
+}
+
#define GC_TYPE_INFO(p) (p)->gc.u.type_info
+#define GC_TYPE(p) zval_gc_type(GC_TYPE_INFO(p))
+#define GC_FLAGS(p) zval_gc_flags(GC_TYPE_INFO(p))
+#define GC_INFO(p) zval_gc_info(GC_TYPE_INFO(p))
+
+#define GC_ADD_FLAGS(p, flags) do { \
+ GC_TYPE_INFO(p) |= (flags) << GC_FLAGS_SHIFT; \
+ } while (0)
+#define GC_DEL_FLAGS(p, flags) do { \
+ GC_TYPE_INFO(p) &= ~((flags) << GC_FLAGS_SHIFT); \
+ } while (0)
#define Z_GC_TYPE(zval) GC_TYPE(Z_COUNTED(zval))
#define Z_GC_TYPE_P(zval_p) Z_GC_TYPE(*(zval_p))
@@ -451,92 +512,97 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_GC_TYPE_INFO(zval) GC_TYPE_INFO(Z_COUNTED(zval))
#define Z_GC_TYPE_INFO_P(zval_p) Z_GC_TYPE_INFO(*(zval_p))
-#define GC_FLAGS_SHIFT 8
-#define GC_INFO_SHIFT 16
-#define GC_INFO_MASK 0xffff0000
-
-/* zval.value->gc.u.v.flags */
-#define GC_COLLECTABLE (1<<7)
+/* zval_gc_flags(zval.value->gc.u.type_info) (common flags) */
+#define GC_COLLECTABLE (1<<4)
+#define GC_PROTECTED (1<<5) /* used for recursion detection */
+#define GC_IMMUTABLE (1<<6) /* can't be canged in place */
+#define GC_PERSISTENT (1<<7) /* allocated using malloc */
+#define GC_PERSISTENT_LOCAL (1<<8) /* persistent, but thread-local */
#define GC_ARRAY (IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
#define GC_OBJECT (IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
/* zval.u1.v.type_flags */
-#define IS_TYPE_CONSTANT (1<<0)
-#define IS_TYPE_REFCOUNTED (1<<2)
-#define IS_TYPE_COPYABLE (1<<4)
+#define IS_TYPE_REFCOUNTED (1<<0)
+
+#if 1
+/* This optimized version assumes that we have a single "type_flag" */
+# define Z_TYPE_INFO_REFCOUNTED(t) (((t) & Z_TYPE_FLAGS_MASK) != 0)
+#else
+# define Z_TYPE_INFO_REFCOUNTED(t) (((t) & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0)
+#endif
/* extended types */
#define IS_INTERNED_STRING_EX IS_STRING
-#define IS_STRING_EX (IS_STRING | (( IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT))
-#define IS_ARRAY_EX (IS_ARRAY | (( IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT))
-#define IS_OBJECT_EX (IS_OBJECT | (( IS_TYPE_REFCOUNTED ) << Z_TYPE_FLAGS_SHIFT))
-#define IS_RESOURCE_EX (IS_RESOURCE | (( IS_TYPE_REFCOUNTED ) << Z_TYPE_FLAGS_SHIFT))
-#define IS_REFERENCE_EX (IS_REFERENCE | (( IS_TYPE_REFCOUNTED ) << Z_TYPE_FLAGS_SHIFT))
-
-#define IS_CONSTANT_EX (IS_CONSTANT | ((IS_TYPE_CONSTANT | IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT))
-#define IS_CONSTANT_AST_EX (IS_CONSTANT_AST | ((IS_TYPE_CONSTANT | IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT))
-
-/* zval.u1.v.const_flags */
-#define IS_CONSTANT_UNQUALIFIED 0x010
-#define IS_CONSTANT_VISITED_MARK 0x020
-#define IS_CONSTANT_CLASS 0x080 /* __CLASS__ in trait */
-#define IS_CONSTANT_IN_NAMESPACE 0x100 /* used only in opline->extended_value */
+#define IS_STRING_EX (IS_STRING | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
+#define IS_ARRAY_EX (IS_ARRAY | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
+#define IS_OBJECT_EX (IS_OBJECT | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
+#define IS_RESOURCE_EX (IS_RESOURCE | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
+#define IS_REFERENCE_EX (IS_REFERENCE | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
-#define IS_CONSTANT_VISITED(p) (Z_CONST_FLAGS_P(p) & IS_CONSTANT_VISITED_MARK)
-#define MARK_CONSTANT_VISITED(p) Z_CONST_FLAGS_P(p) |= IS_CONSTANT_VISITED_MARK
-#define RESET_CONSTANT_VISITED(p) Z_CONST_FLAGS_P(p) &= ~IS_CONSTANT_VISITED_MARK
+#define IS_CONSTANT_AST_EX (IS_CONSTANT_AST | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT))
/* string flags (zval.value->gc.u.flags) */
-#define IS_STR_PERSISTENT (1<<0) /* allocated using malloc */
-#define IS_STR_INTERNED (1<<1) /* interned string */
-#define IS_STR_PERMANENT (1<<2) /* relives request boundary */
-
-#define IS_STR_CONSTANT (1<<3) /* constant index */
-#define IS_STR_CONSTANT_UNQUALIFIED (1<<4) /* the same as IS_CONSTANT_UNQUALIFIED */
+#define IS_STR_INTERNED GC_IMMUTABLE /* interned string */
+#define IS_STR_PERSISTENT GC_PERSISTENT /* allocated using malloc */
+#define IS_STR_PERMANENT (1<<8) /* relives request boundary */
/* array flags */
-#define IS_ARRAY_IMMUTABLE (1<<1)
+#define IS_ARRAY_IMMUTABLE GC_IMMUTABLE
+#define IS_ARRAY_PERSISTENT GC_PERSISTENT
/* object flags (zval.value->gc.u.flags) */
-#define IS_OBJ_APPLY_COUNT 0x07
-#define IS_OBJ_DESTRUCTOR_CALLED (1<<3)
-#define IS_OBJ_FREE_CALLED (1<<4)
-#define IS_OBJ_USE_GUARDS (1<<5)
-#define IS_OBJ_HAS_GUARDS (1<<6)
-
-#define Z_OBJ_APPLY_COUNT(zval) \
- (Z_GC_FLAGS(zval) & IS_OBJ_APPLY_COUNT)
-
-#define Z_OBJ_INC_APPLY_COUNT(zval) do { \
- Z_GC_FLAGS(zval) = \
- (Z_GC_FLAGS(zval) & ~IS_OBJ_APPLY_COUNT) | \
- ((Z_GC_FLAGS(zval) & IS_OBJ_APPLY_COUNT) + 1); \
+#define IS_OBJ_DESTRUCTOR_CALLED (1<<8)
+#define IS_OBJ_FREE_CALLED (1<<9)
+
+#define OBJ_FLAGS(obj) GC_FLAGS(obj)
+
+/* Recursion protection macros must be used only for arrays and objects */
+#define GC_IS_RECURSIVE(p) \
+ (GC_FLAGS(p) & GC_PROTECTED)
+
+#define GC_PROTECT_RECURSION(p) do { \
+ GC_ADD_FLAGS(p, GC_PROTECTED); \
+ } while (0)
+
+#define GC_UNPROTECT_RECURSION(p) do { \
+ GC_DEL_FLAGS(p, GC_PROTECTED); \
} while (0)
-#define Z_OBJ_DEC_APPLY_COUNT(zval) do { \
- Z_GC_FLAGS(zval) = \
- (Z_GC_FLAGS(zval) & ~IS_OBJ_APPLY_COUNT) | \
- ((Z_GC_FLAGS(zval) & IS_OBJ_APPLY_COUNT) - 1); \
+#define GC_TRY_PROTECT_RECURSION(p) do { \
+ if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_PROTECT_RECURSION(p); \
} while (0)
-#define Z_OBJ_APPLY_COUNT_P(zv) Z_OBJ_APPLY_COUNT(*(zv))
-#define Z_OBJ_INC_APPLY_COUNT_P(zv) Z_OBJ_INC_APPLY_COUNT(*(zv))
-#define Z_OBJ_DEC_APPLY_COUNT_P(zv) Z_OBJ_DEC_APPLY_COUNT(*(zv))
+#define GC_TRY_UNPROTECT_RECURSION(p) do { \
+ if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_UNPROTECT_RECURSION(p); \
+ } while (0)
+
+#define Z_IS_RECURSIVE(zval) GC_IS_RECURSIVE(Z_COUNTED(zval))
+#define Z_PROTECT_RECURSION(zval) GC_PROTECT_RECURSION(Z_COUNTED(zval))
+#define Z_UNPROTECT_RECURSION(zval) GC_UNPROTECT_RECURSION(Z_COUNTED(zval))
+#define Z_IS_RECURSIVE_P(zv) Z_IS_RECURSIVE(*(zv))
+#define Z_PROTECT_RECURSION_P(zv) Z_PROTECT_RECURSION(*(zv))
+#define Z_UNPROTECT_RECURSION_P(zv) Z_UNPROTECT_RECURSION(*(zv))
/* All data types < IS_STRING have their constructor/destructors skipped */
-#define Z_CONSTANT(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_CONSTANT) != 0)
+#define Z_CONSTANT(zval) (Z_TYPE(zval) == IS_CONSTANT_AST)
#define Z_CONSTANT_P(zval_p) Z_CONSTANT(*(zval_p))
+#if 1
+/* This optimized version assumes that we have a single "type_flag" */
+#define Z_REFCOUNTED(zval) (Z_TYPE_FLAGS(zval) != 0)
+#else
#define Z_REFCOUNTED(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_REFCOUNTED) != 0)
+#endif
#define Z_REFCOUNTED_P(zval_p) Z_REFCOUNTED(*(zval_p))
-#define Z_COPYABLE(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_COPYABLE) != 0)
+/* deprecated: (COPYABLE is the same as IS_ARRAY) */
+#define Z_COPYABLE(zval) (Z_TYPE(zval) == IS_ARRAY)
#define Z_COPYABLE_P(zval_p) Z_COPYABLE(*(zval_p))
-/* deprecated: (IMMUTABLE is the same as COPYABLE && !REFCOUED) */
-#define Z_IMMUTABLE(zval) ((Z_TYPE_FLAGS(zval) & (IS_TYPE_REFCOUNTED|IS_TYPE_COPYABLE)) == IS_TYPE_COPYABLE)
+/* deprecated: (IMMUTABLE is the same as IS_ARRAY && !REFCOUNTED) */
+#define Z_IMMUTABLE(zval) (Z_TYPE_INFO(zval) == IS_ARRAY)
#define Z_IMMUTABLE_P(zval_p) Z_IMMUTABLE(*(zval_p))
#define Z_OPT_IMMUTABLE(zval) Z_IMMUTABLE(zval_p)
#define Z_OPT_IMMUTABLE_P(zval_p) Z_IMMUTABLE(*(zval_p))
@@ -545,13 +611,14 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_OPT_TYPE(zval) (Z_TYPE_INFO(zval) & Z_TYPE_MASK)
#define Z_OPT_TYPE_P(zval_p) Z_OPT_TYPE(*(zval_p))
-#define Z_OPT_CONSTANT(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_CONSTANT << Z_TYPE_FLAGS_SHIFT)) != 0)
+#define Z_OPT_CONSTANT(zval) (Z_OPT_TYPE(zval) == IS_CONSTANT_AST)
#define Z_OPT_CONSTANT_P(zval_p) Z_OPT_CONSTANT(*(zval_p))
-#define Z_OPT_REFCOUNTED(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0)
+#define Z_OPT_REFCOUNTED(zval) Z_TYPE_INFO_REFCOUNTED(Z_TYPE_INFO(zval))
#define Z_OPT_REFCOUNTED_P(zval_p) Z_OPT_REFCOUNTED(*(zval_p))
-#define Z_OPT_COPYABLE(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_COPYABLE << Z_TYPE_FLAGS_SHIFT)) != 0)
+/* deprecated: (COPYABLE is the same as IS_ARRAY) */
+#define Z_OPT_COPYABLE(zval) (Z_OPT_TYPE(zval) == IS_ARRAY)
#define Z_OPT_COPYABLE_P(zval_p) Z_OPT_COPYABLE(*(zval_p))
#define Z_OPT_ISREF(zval) (Z_OPT_TYPE(zval) == IS_REFERENCE)
@@ -635,7 +702,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_AST(zval) (zval).value.ast
#define Z_AST_P(zval_p) Z_AST(*(zval_p))
-#define Z_ASTVAL(zval) (zval).value.ast->ast
+#define GC_AST(p) ((zend_ast*)(((char*)p) + sizeof(zend_ast_ref)))
+
+#define Z_ASTVAL(zval) GC_AST(Z_AST(zval))
#define Z_ASTVAL_P(zval_p) Z_ASTVAL(*(zval_p))
#define Z_INDIRECT(zval) (zval).value.zv
@@ -712,17 +781,18 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
zend_string *__s = (s); \
Z_STR_P(__z) = __s; \
/* interned strings support */ \
- if (ZSTR_IS_INTERNED(__s)) { \
+ if (ZSTR_IS_INTERNED(__s)) { \
Z_TYPE_INFO_P(__z) = IS_INTERNED_STRING_EX; \
} else { \
- GC_REFCOUNT(__s)++; \
+ GC_ADDREF(__s); \
Z_TYPE_INFO_P(__z) = IS_STRING_EX; \
} \
} while (0)
#define ZVAL_ARR(z, a) do { \
+ zend_array *__arr = (a); \
zval *__z = (z); \
- Z_ARR_P(__z) = (a); \
+ Z_ARR_P(__z) = __arr; \
Z_TYPE_INFO_P(__z) = IS_ARRAY_EX; \
} while (0)
@@ -758,7 +828,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
zend_resource *_res = \
(zend_resource *) emalloc(sizeof(zend_resource)); \
zval *__z; \
- GC_REFCOUNT(_res) = 1; \
+ GC_SET_REFCOUNT(_res, 1); \
GC_TYPE_INFO(_res) = IS_RESOURCE; \
_res->handle = (h); \
_res->type = (t); \
@@ -772,8 +842,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
zend_resource *_res = \
(zend_resource *) malloc(sizeof(zend_resource)); \
zval *__z; \
- GC_REFCOUNT(_res) = 1; \
- GC_TYPE_INFO(_res) = IS_RESOURCE; \
+ GC_SET_REFCOUNT(_res, 1); \
+ GC_TYPE_INFO(_res) = IS_RESOURCE | \
+ (GC_PERSISTENT << GC_FLAGS_SHIFT); \
_res->handle = (h); \
_res->type = (t); \
_res->ptr = (p); \
@@ -791,7 +862,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define ZVAL_NEW_EMPTY_REF(z) do { \
zend_reference *_ref = \
(zend_reference *) emalloc(sizeof(zend_reference)); \
- GC_REFCOUNT(_ref) = 1; \
+ GC_SET_REFCOUNT(_ref, 1); \
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
@@ -800,31 +871,38 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define ZVAL_NEW_REF(z, r) do { \
zend_reference *_ref = \
(zend_reference *) emalloc(sizeof(zend_reference)); \
- GC_REFCOUNT(_ref) = 1; \
+ GC_SET_REFCOUNT(_ref, 1); \
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
ZVAL_COPY_VALUE(&_ref->val, r); \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
} while (0)
+#define ZVAL_MAKE_REF_EX(z, refcount) do { \
+ zval *_z = (z); \
+ zend_reference *_ref = \
+ (zend_reference *) emalloc(sizeof(zend_reference)); \
+ GC_SET_REFCOUNT(_ref, (refcount)); \
+ GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ ZVAL_COPY_VALUE(&_ref->val, _z); \
+ Z_REF_P(_z) = _ref; \
+ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \
+ } while (0)
+
#define ZVAL_NEW_PERSISTENT_REF(z, r) do { \
zend_reference *_ref = \
(zend_reference *) malloc(sizeof(zend_reference)); \
- GC_REFCOUNT(_ref) = 1; \
- GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ GC_SET_REFCOUNT(_ref, 1); \
+ GC_TYPE_INFO(_ref) = IS_REFERENCE | \
+ (GC_PERSISTENT << GC_FLAGS_SHIFT); \
ZVAL_COPY_VALUE(&_ref->val, r); \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
} while (0)
-#define ZVAL_NEW_AST(z, a) do { \
+#define ZVAL_AST(z, ast) do { \
zval *__z = (z); \
- zend_ast_ref *_ast = \
- (zend_ast_ref *) emalloc(sizeof(zend_ast_ref)); \
- GC_REFCOUNT(_ast) = 1; \
- GC_TYPE_INFO(_ast) = IS_CONSTANT_AST; \
- _ast->ast = (a); \
- Z_AST_P(__z) = _ast; \
+ Z_AST_P(__z) = ast; \
Z_TYPE_INFO_P(__z) = IS_CONSTANT_AST_EX; \
} while (0)
@@ -877,24 +955,79 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z))
#define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z))
-static zend_always_inline uint32_t zval_refcount_p(zval* pz) {
- ZEND_ASSERT(Z_REFCOUNTED_P(pz) || Z_COPYABLE_P(pz));
+#ifndef ZEND_RC_DEBUG
+# define ZEND_RC_DEBUG 0
+#endif
+
+#if ZEND_RC_DEBUG
+extern ZEND_API zend_bool zend_rc_debug;
+# define ZEND_RC_MOD_CHECK(p) do { \
+ if (zend_rc_debug) { \
+ ZEND_ASSERT(!(zval_gc_flags((p)->u.type_info) & GC_IMMUTABLE)); \
+ ZEND_ASSERT((zval_gc_flags((p)->u.type_info) & (GC_PERSISTENT|GC_PERSISTENT_LOCAL)) != GC_PERSISTENT); \
+ } \
+ } while (0)
+# define GC_MAKE_PERSISTENT_LOCAL(p) do { \
+ GC_ADD_FLAGS(p, GC_PERSISTENT_LOCAL); \
+ } while (0)
+#else
+# define ZEND_RC_MOD_CHECK(p) \
+ do { } while (0)
+# define GC_MAKE_PERSISTENT_LOCAL(p) \
+ do { } while (0)
+#endif
+
+static zend_always_inline uint32_t zend_gc_refcount(const zend_refcounted_h *p) {
+ return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_set_refcount(zend_refcounted_h *p, uint32_t rc) {
+ p->refcount = rc;
+ return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_addref(zend_refcounted_h *p) {
+ ZEND_RC_MOD_CHECK(p);
+ return ++(p->refcount);
+}
+
+static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
+ ZEND_RC_MOD_CHECK(p);
+ return --(p->refcount);
+}
+
+static zend_always_inline uint32_t zend_gc_addref_ex(zend_refcounted_h *p, uint32_t rc) {
+ ZEND_RC_MOD_CHECK(p);
+ p->refcount += rc;
+ return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint32_t rc) {
+ ZEND_RC_MOD_CHECK(p);
+ p->refcount -= rc;
+ return p->refcount;
+}
+
+static zend_always_inline uint32_t zval_refcount_p(const zval* pz) {
+#if ZEND_DEBUG
+ ZEND_ASSERT(Z_REFCOUNTED_P(pz) || Z_TYPE_P(pz) == IS_ARRAY);
+#endif
return GC_REFCOUNT(Z_COUNTED_P(pz));
}
static zend_always_inline uint32_t zval_set_refcount_p(zval* pz, uint32_t rc) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
- return GC_REFCOUNT(Z_COUNTED_P(pz)) = rc;
+ return GC_SET_REFCOUNT(Z_COUNTED_P(pz), rc);
}
static zend_always_inline uint32_t zval_addref_p(zval* pz) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
- return ++GC_REFCOUNT(Z_COUNTED_P(pz));
+ return GC_ADDREF(Z_COUNTED_P(pz));
}
static zend_always_inline uint32_t zval_delref_p(zval* pz) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
- return --GC_REFCOUNT(Z_COUNTED_P(pz));
+ return GC_DELREF(Z_COUNTED_P(pz));
}
#if SIZEOF_SIZE_T == 4
@@ -931,8 +1064,8 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
zend_refcounted *_gc = Z_COUNTED_P(_z2); \
uint32_t _t = Z_TYPE_INFO_P(_z2); \
ZVAL_COPY_VALUE_EX(_z1, _z2, _gc, _t); \
- if ((_t & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0) { \
- GC_REFCOUNT(_gc)++; \
+ if (Z_TYPE_INFO_REFCOUNTED(_t)) { \
+ GC_ADDREF(_gc); \
} \
} while (0)
@@ -942,22 +1075,48 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
const zval *_z2 = (v); \
zend_refcounted *_gc = Z_COUNTED_P(_z2); \
uint32_t _t = Z_TYPE_INFO_P(_z2); \
- ZVAL_COPY_VALUE_EX(_z1, _z2, _gc, _t); \
- if ((_t & ((IS_TYPE_REFCOUNTED|IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT)) != 0) { \
- if ((_t & (IS_TYPE_COPYABLE << Z_TYPE_FLAGS_SHIFT)) != 0) { \
- _zval_copy_ctor_func(_z1 ZEND_FILE_LINE_CC); \
- } else { \
- GC_REFCOUNT(_gc)++; \
+ if ((_t & Z_TYPE_MASK) == IS_ARRAY) { \
+ ZVAL_ARR(_z1, zend_array_dup((zend_array*)_gc));\
+ } else { \
+ if (Z_TYPE_INFO_REFCOUNTED(_t)) { \
+ GC_ADDREF(_gc); \
} \
+ ZVAL_COPY_VALUE_EX(_z1, _z2, _gc, _t); \
} \
} while (0)
+
+/* ZVAL_COPY_OR_DUP() should be used instead of ZVAL_COPY() and ZVAL_DUP()
+ * in all places where the source may be a persistent zval.
+ */
+#define ZVAL_COPY_OR_DUP(z, v) \
+ do { \
+ zval *_z1 = (z); \
+ const zval *_z2 = (v); \
+ zend_refcounted *_gc = Z_COUNTED_P(_z2); \
+ uint32_t _t = Z_TYPE_INFO_P(_z2); \
+ ZVAL_COPY_VALUE_EX(_z1, _z2, _gc, _t); \
+ if (Z_TYPE_INFO_REFCOUNTED(_t)) { \
+ if (EXPECTED(!(GC_FLAGS(_gc) & GC_PERSISTENT))) { \
+ GC_ADDREF(_gc); \
+ } else { \
+ zval_copy_ctor_func(_z1); \
+ } \
+ } \
+ } while (0)
+
#define ZVAL_DEREF(z) do { \
if (UNEXPECTED(Z_ISREF_P(z))) { \
(z) = Z_REFVAL_P(z); \
} \
} while (0)
+#define ZVAL_DEINDIRECT(z) do { \
+ if (Z_TYPE_P(z) == IS_INDIRECT) { \
+ (z) = Z_INDIRECT_P(z); \
+ } \
+ } while (0)
+
#define ZVAL_OPT_DEREF(z) do { \
if (UNEXPECTED(Z_OPT_ISREF_P(z))) { \
(z) = Z_REFVAL_P(z); \
@@ -980,12 +1139,11 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
efree_size(ref, sizeof(zend_reference)); \
} while (0)
-#define ZVAL_COPY_UNREF(z, v) do { \
+#define ZVAL_COPY_DEREF(z, v) do { \
zval *_z3 = (v); \
if (Z_OPT_REFCOUNTED_P(_z3)) { \
- if (UNEXPECTED(Z_OPT_ISREF_P(_z3)) \
- && UNEXPECTED(Z_REFCOUNT_P(_z3) == 1)) { \
- ZVAL_UNREF(_z3); \
+ if (UNEXPECTED(Z_OPT_ISREF_P(_z3))) { \
+ _z3 = Z_REFVAL_P(_z3); \
if (Z_OPT_REFCOUNTED_P(_z3)) { \
Z_ADDREF_P(_z3); \
} \
@@ -1000,10 +1158,12 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
#define SEPARATE_STRING(zv) do { \
zval *_zv = (zv); \
if (Z_REFCOUNT_P(_zv) > 1) { \
- if (Z_REFCOUNTED_P(_zv)) { \
- Z_DELREF_P(_zv); \
- } \
- zval_copy_ctor_func(_zv); \
+ zend_string *_str = Z_STR_P(_zv); \
+ ZEND_ASSERT(Z_REFCOUNTED_P(_zv)); \
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(_str)); \
+ Z_DELREF_P(_zv); \
+ ZVAL_NEW_STR(_zv, zend_string_init( \
+ ZSTR_VAL(_str), ZSTR_LEN(_str), 0)); \
} \
} while (0)
@@ -1012,53 +1172,46 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
zend_array *_arr = Z_ARR_P(_zv); \
if (UNEXPECTED(GC_REFCOUNT(_arr) > 1)) { \
if (Z_REFCOUNTED_P(_zv)) { \
- GC_REFCOUNT(_arr)--; \
+ GC_DELREF(_arr); \
} \
ZVAL_ARR(_zv, zend_array_dup(_arr)); \
} \
} while (0)
-#define SEPARATE_ZVAL_NOREF(zv) do { \
- zval *_zv = (zv); \
- ZEND_ASSERT(Z_TYPE_P(_zv) != IS_REFERENCE); \
- if (Z_COPYABLE_P(_zv)) { \
- if (Z_REFCOUNT_P(_zv) > 1) { \
- if (Z_REFCOUNTED_P(_zv)) { \
- Z_DELREF_P(_zv); \
+#define SEPARATE_ZVAL_IF_NOT_REF(zv) do { \
+ zval *__zv = (zv); \
+ if (Z_TYPE_P(__zv) == IS_ARRAY) { \
+ if (Z_REFCOUNT_P(__zv) > 1) { \
+ if (Z_REFCOUNTED_P(__zv)) { \
+ Z_DELREF_P(__zv); \
} \
- zval_copy_ctor_func(_zv); \
+ ZVAL_ARR(__zv, zend_array_dup(Z_ARR_P(__zv)));\
} \
} \
} while (0)
-#define SEPARATE_ZVAL(zv) do { \
+#define SEPARATE_ZVAL_NOREF(zv) do { \
zval *_zv = (zv); \
- if (Z_REFCOUNTED_P(_zv) || \
- Z_COPYABLE_P(_zv)) { \
- if (Z_REFCOUNT_P(_zv) > 1) { \
- if (Z_COPYABLE_P(_zv)) { \
- if (Z_REFCOUNTED_P(_zv)) { \
- Z_DELREF_P(_zv); \
- } \
- zval_copy_ctor_func(_zv); \
- } else if (Z_ISREF_P(_zv)) { \
- Z_DELREF_P(_zv); \
- ZVAL_DUP(_zv, Z_REFVAL_P(_zv)); \
- } \
- } \
- } \
+ ZEND_ASSERT(Z_TYPE_P(_zv) != IS_REFERENCE); \
+ SEPARATE_ZVAL_IF_NOT_REF(_zv); \
} while (0)
-#define SEPARATE_ZVAL_IF_NOT_REF(zv) do { \
+#define SEPARATE_ZVAL(zv) do { \
zval *_zv = (zv); \
- if (Z_COPYABLE_P(_zv)) { \
- if (Z_REFCOUNT_P(_zv) > 1) { \
- if (Z_REFCOUNTED_P(_zv)) { \
- Z_DELREF_P(_zv); \
- } \
- zval_copy_ctor_func(_zv); \
+ if (Z_ISREF_P(_zv)) { \
+ zend_reference *_r = Z_REF_P(_zv); \
+ ZVAL_COPY_VALUE(_zv, &_r->val); \
+ if (GC_DELREF(_r) == 0) { \
+ efree_size(_r, sizeof(zend_reference)); \
+ } else if (Z_OPT_TYPE_P(_zv) == IS_ARRAY) { \
+ ZVAL_ARR(_zv, zend_array_dup(Z_ARR_P(_zv)));\
+ break; \
+ } else if (Z_OPT_REFCOUNTED_P(_zv)) { \
+ Z_ADDREF_P(_zv); \
+ break; \
} \
} \
+ SEPARATE_ZVAL_IF_NOT_REF(_zv); \
} while (0)
#define SEPARATE_ARG_IF_REF(varptr) do { \
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index d3d5cf7680..c2594274dd 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <stdio.h>
#include "zend.h"
#include "zend_API.h"
@@ -28,114 +26,112 @@
#include "zend_constants.h"
#include "zend_list.h"
-ZEND_API void ZEND_FASTCALL _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
+static void ZEND_FASTCALL zend_string_destroy(zend_string *str);
+static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref);
+static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref);
+
+#if ZEND_DEBUG
+static void ZEND_FASTCALL zend_array_destroy_wrapper(zend_array *arr);
+static void ZEND_FASTCALL zend_object_destroy_wrapper(zend_object *obj);
+static void ZEND_FASTCALL zend_resource_destroy_wrapper(zend_resource *res);
+static void ZEND_FASTCALL zend_ast_ref_destroy_wrapper(zend_ast_ref *ast);
+#else
+# define zend_array_destroy_wrapper zend_array_destroy
+# define zend_object_destroy_wrapper zend_objects_store_del
+# define zend_resource_destroy_wrapper zend_list_free
+# define zend_ast_ref_destroy_wrapper zend_ast_ref_destroy
+#endif
+
+typedef void (ZEND_FASTCALL *zend_rc_dtor_func_t)(zend_refcounted *p);
+
+static const zend_rc_dtor_func_t zend_rc_dtor_func[] = {
+ /* IS_UNDEF */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_NULL */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_FALSE */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_TRUE */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_LONG */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_DOUBLE */ (zend_rc_dtor_func_t)zend_empty_destroy,
+ /* IS_STRING */ (zend_rc_dtor_func_t)zend_string_destroy,
+ /* IS_ARRAY */ (zend_rc_dtor_func_t)zend_array_destroy_wrapper,
+ /* IS_OBJECT */ (zend_rc_dtor_func_t)zend_object_destroy_wrapper,
+ /* IS_RESOURCE */ (zend_rc_dtor_func_t)zend_resource_destroy_wrapper,
+ /* IS_REFERENCE */ (zend_rc_dtor_func_t)zend_reference_destroy,
+ /* IS_CONSTANT_AST */ (zend_rc_dtor_func_t)zend_ast_ref_destroy_wrapper
+};
+
+ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
{
- switch (GC_TYPE(p)) {
- case IS_STRING:
- case IS_CONSTANT: {
- zend_string *str = (zend_string*)p;
- CHECK_ZVAL_STRING_REL(str);
- zend_string_free(str);
- break;
- }
- case IS_ARRAY: {
- zend_array *arr = (zend_array*)p;
- zend_array_destroy(arr);
- break;
- }
- case IS_CONSTANT_AST: {
- zend_ast_ref *ast = (zend_ast_ref*)p;
+ ZEND_ASSERT(GC_TYPE(p) <= IS_CONSTANT_AST);
+ zend_rc_dtor_func[GC_TYPE(p)](p);
+}
- zend_ast_destroy_and_free(ast->ast);
- efree_size(ast, sizeof(zend_ast_ref));
- break;
- }
- case IS_OBJECT: {
- zend_object *obj = (zend_object*)p;
+static void ZEND_FASTCALL zend_string_destroy(zend_string *str)
+{
+ CHECK_ZVAL_STRING(str);
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(str));
+ ZEND_ASSERT(GC_REFCOUNT(str) == 0);
+ ZEND_ASSERT(!(GC_FLAGS(str) & IS_STR_PERSISTENT));
+ efree(str);
+}
- zend_objects_store_del(obj);
- break;
- }
- case IS_RESOURCE: {
- zend_resource *res = (zend_resource*)p;
+static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref)
+{
+ i_zval_ptr_dtor(&ref->val ZEND_FILE_LINE_CC);
+ efree_size(ref, sizeof(zend_reference));
+}
- /* destroy resource */
- zend_list_free(res);
- break;
- }
- case IS_REFERENCE: {
- zend_reference *ref = (zend_reference*)p;
+static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref)
+{
+}
- i_zval_ptr_dtor(&ref->val ZEND_FILE_LINE_RELAY_CC);
- efree_size(ref, sizeof(zend_reference));
- break;
- }
- default:
- break;
- }
+#if ZEND_DEBUG
+static void ZEND_FASTCALL zend_array_destroy_wrapper(zend_array *arr)
+{
+ zend_array_destroy(arr);
}
-ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC)
+static void ZEND_FASTCALL zend_object_destroy_wrapper(zend_object *obj)
{
- switch (Z_TYPE_P(zvalue)) {
- case IS_STRING:
- case IS_CONSTANT:
- CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue));
- zend_string_release(Z_STR_P(zvalue));
- break;
- case IS_ARRAY:
- case IS_CONSTANT_AST:
- case IS_OBJECT:
- case IS_RESOURCE:
- zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources");
- break;
- case IS_REFERENCE: {
- zend_reference *ref = (zend_reference*)Z_REF_P(zvalue);
-
- zval_internal_ptr_dtor(&ref->val);
- free(ref);
- break;
- }
- case IS_LONG:
- case IS_DOUBLE:
- case IS_FALSE:
- case IS_TRUE:
- case IS_NULL:
- default:
- break;
- }
+ zend_objects_store_del(obj);
+}
+
+static void ZEND_FASTCALL zend_resource_destroy_wrapper(zend_resource *res)
+{
+ zend_list_free(res);
+}
+
+static void ZEND_FASTCALL zend_ast_ref_destroy_wrapper(zend_ast_ref *ast)
+{
+ zend_ast_ref_destroy(ast);
+}
+#endif
+
+ZEND_API void zval_ptr_dtor(zval *zval_ptr) /* {{{ */
+{
+ i_zval_ptr_dtor(zval_ptr ZEND_FILE_LINE_CC);
}
+/* }}} */
-ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC)
+ZEND_API void zval_internal_ptr_dtor(zval *zval_ptr) /* {{{ */
{
- switch (Z_TYPE_P(zvalue)) {
- case IS_STRING:
- case IS_CONSTANT:
- CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue));
- zend_string_free(Z_STR_P(zvalue));
- break;
- case IS_ARRAY:
- case IS_CONSTANT_AST:
- case IS_OBJECT:
- case IS_RESOURCE:
- zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources");
- break;
- case IS_REFERENCE: {
- zend_reference *ref = (zend_reference*)Z_REF_P(zvalue);
-
- zval_internal_ptr_dtor(&ref->val);
- free(ref);
- break;
+ if (Z_REFCOUNTED_P(zval_ptr)) {
+ zend_refcounted *ref = Z_COUNTED_P(zval_ptr);
+
+ if (GC_DELREF(ref) == 0) {
+ if (Z_TYPE_P(zval_ptr) == IS_STRING) {
+ zend_string *str = (zend_string*)ref;
+
+ CHECK_ZVAL_STRING(str);
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(str));
+ ZEND_ASSERT((GC_FLAGS(str) & IS_STR_PERSISTENT));
+ free(str);
+ } else {
+ zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects, resources or reference");
}
- case IS_LONG:
- case IS_DOUBLE:
- case IS_FALSE:
- case IS_TRUE:
- case IS_NULL:
- default:
- break;
+ }
}
}
+/* }}} */
/* This function should only be used as a copy constructor, i.e. it
* should only be called AFTER a zval has been copied to another
@@ -152,66 +148,17 @@ ZEND_API void zval_add_ref(zval *p)
}
}
-ZEND_API void zval_add_ref_unref(zval *p)
-{
- if (Z_REFCOUNTED_P(p)) {
- if (Z_ISREF_P(p)) {
- ZVAL_COPY(p, Z_REFVAL_P(p));
- } else {
- Z_ADDREF_P(p);
- }
- }
-}
-
-ZEND_API void ZEND_FASTCALL _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
+ZEND_API void ZEND_FASTCALL zval_copy_ctor_func(zval *zvalue)
{
if (EXPECTED(Z_TYPE_P(zvalue) == IS_ARRAY)) {
ZVAL_ARR(zvalue, zend_array_dup(Z_ARRVAL_P(zvalue)));
} else if (EXPECTED(Z_TYPE_P(zvalue) == IS_STRING)) {
- CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue));
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(Z_STR_P(zvalue)));
+ CHECK_ZVAL_STRING(Z_STR_P(zvalue));
ZVAL_NEW_STR(zvalue, zend_string_dup(Z_STR_P(zvalue), 0));
- } else if (EXPECTED(Z_TYPE_P(zvalue) == IS_CONSTANT)) {
- CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue));
- Z_STR_P(zvalue) = zend_string_dup(Z_STR_P(zvalue), 0);
- } else if (EXPECTED(Z_TYPE_P(zvalue) == IS_CONSTANT_AST)) {
- zend_ast *copy = zend_ast_copy(Z_ASTVAL_P(zvalue));
- ZVAL_NEW_AST(zvalue, copy);
}
}
-
-ZEND_API size_t zend_print_variable(zval *var)
-{
- return zend_print_zval(var, 0);
-}
-
-
-ZEND_API void _zval_dtor_wrapper(zval *zvalue)
-{
- zval_dtor(zvalue);
-}
-
-
-#if ZEND_DEBUG
-ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue)
-{
- zval_internal_dtor(zvalue);
-}
-
-
-ZEND_API void _zval_ptr_dtor_wrapper(zval *zval_ptr)
-{
-
- i_zval_ptr_dtor(zval_ptr ZEND_FILE_LINE_CC);
-}
-
-
-ZEND_API void _zval_internal_ptr_dtor_wrapper(zval *zval_ptr)
-{
- zval_internal_ptr_dtor(zval_ptr);
-}
-#endif
-
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h
index 3cecb3a6b3..665dbbd760 100644
--- a/Zend/zend_variables.h
+++ b/Zend/zend_variables.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_VARIABLES_H
#define ZEND_VARIABLES_H
@@ -28,16 +26,13 @@
BEGIN_EXTERN_C()
-ZEND_API void ZEND_FASTCALL _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC);
-ZEND_API void ZEND_FASTCALL _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC);
-
-#define zval_dtor_func(zv) _zval_dtor_func(zv ZEND_FILE_LINE_CC)
-#define zval_copy_ctor_func(zv) _zval_copy_ctor_func(zv ZEND_FILE_LINE_CC)
+ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p);
+ZEND_API void ZEND_FASTCALL zval_copy_ctor_func(zval *zvalue);
-static zend_always_inline void _zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC)
+static zend_always_inline void zval_ptr_dtor_nogc(zval *zval_ptr)
{
if (Z_REFCOUNTED_P(zval_ptr) && !Z_DELREF_P(zval_ptr)) {
- _zval_dtor_func(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_RELAY_CC);
+ rc_dtor_func(Z_COUNTED_P(zval_ptr));
}
}
@@ -45,73 +40,58 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC)
{
if (Z_REFCOUNTED_P(zval_ptr)) {
zend_refcounted *ref = Z_COUNTED_P(zval_ptr);
- if (!--GC_REFCOUNT(ref)) {
- _zval_dtor_func(ref ZEND_FILE_LINE_RELAY_CC);
+ if (!GC_DELREF(ref)) {
+ rc_dtor_func(ref);
} else {
gc_check_possible_root(ref);
}
}
}
-static zend_always_inline void _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
+static zend_always_inline void zval_copy_ctor(zval *zvalue)
{
- if (Z_REFCOUNTED_P(zvalue) || Z_COPYABLE_P(zvalue)) {
- if (Z_COPYABLE_P(zvalue)) {
- _zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
- } else {
- Z_ADDREF_P(zvalue);
- }
+ if (Z_TYPE_P(zvalue) == IS_ARRAY) {
+ ZVAL_ARR(zvalue, zend_array_dup(Z_ARR_P(zvalue)));
+ } else if (Z_REFCOUNTED_P(zvalue)) {
+ Z_ADDREF_P(zvalue);
}
}
-static zend_always_inline void _zval_opt_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
+static zend_always_inline void zval_opt_copy_ctor(zval *zvalue)
{
- if (Z_OPT_REFCOUNTED_P(zvalue) || Z_OPT_COPYABLE_P(zvalue)) {
- if (Z_OPT_COPYABLE_P(zvalue)) {
- _zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
- } else {
- Z_ADDREF_P(zvalue);
- }
+ if (Z_OPT_TYPE_P(zvalue) == IS_ARRAY) {
+ ZVAL_ARR(zvalue, zend_array_dup(Z_ARR_P(zvalue)));
+ } else if (Z_OPT_REFCOUNTED_P(zvalue)) {
+ Z_ADDREF_P(zvalue);
}
}
-ZEND_API size_t zend_print_variable(zval *var);
-ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC);
-ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC);
-ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC);
-ZEND_API void _zval_internal_ptr_dtor(zval *zvalue ZEND_FILE_LINE_DC);
-ZEND_API void _zval_dtor_wrapper(zval *zvalue);
-#define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
-#define zval_opt_copy_ctor(zvalue) _zval_opt_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
+static zend_always_inline void zval_ptr_dtor_str(zval *zval_ptr)
+{
+ if (Z_REFCOUNTED_P(zval_ptr) && !Z_DELREF_P(zval_ptr)) {
+ ZEND_ASSERT(Z_TYPE_P(zval_ptr) == IS_STRING);
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(Z_STR_P(zval_ptr)));
+ ZEND_ASSERT(!(GC_FLAGS(Z_STR_P(zval_ptr)) & IS_STR_PERSISTENT));
+ efree(Z_STR_P(zval_ptr));
+ }
+}
+
+ZEND_API void zval_ptr_dtor(zval *zval_ptr);
+ZEND_API void zval_internal_ptr_dtor(zval *zvalue);
+
+/* Kept for compatibility */
#define zval_dtor(zvalue) zval_ptr_dtor_nogc(zvalue)
-#define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC)
-#define zval_ptr_dtor_nogc(zval_ptr) _zval_ptr_dtor_nogc((zval_ptr) ZEND_FILE_LINE_CC)
-#define zval_internal_dtor(zvalue) _zval_internal_dtor((zvalue) ZEND_FILE_LINE_CC)
-#define zval_internal_ptr_dtor(zvalue) _zval_internal_ptr_dtor((zvalue) ZEND_FILE_LINE_CC)
-#define zval_dtor_wrapper _zval_dtor_wrapper
-
-#if ZEND_DEBUG
-ZEND_API void _zval_ptr_dtor_wrapper(zval *zval_ptr);
-ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue);
-ZEND_API void _zval_internal_ptr_dtor_wrapper(zval *zvalue);
-#define zval_ptr_dtor_wrapper _zval_ptr_dtor_wrapper
-#define zval_internal_dtor_wrapper _zval_internal_dtor_wrapper
-#define zval_internal_ptr_dtor_wrapper _zval_internal_ptr_dtor_wrapper
-#else
-#define zval_ptr_dtor_wrapper _zval_ptr_dtor
-#define zval_internal_dtor_wrapper _zval_internal_dtor
-#define zval_internal_ptr_dtor_wrapper _zval_internal_ptr_dtor
-#endif
+#define zval_internal_dtor(zvalue) zval_internal_ptr_dtor(zvalue)
+#define zval_dtor_func rc_dtor_func
+#define zval_ptr_dtor_wrapper zval_ptr_dtor
+#define zval_internal_ptr_dtor_wrapper zval_internal_ptr_dtor
ZEND_API void zval_add_ref(zval *p);
-ZEND_API void zval_add_ref_unref(zval *p);
END_EXTERN_C()
-#define ZVAL_DESTRUCTOR zval_dtor_wrapper
-#define ZVAL_PTR_DTOR zval_ptr_dtor_wrapper
-#define ZVAL_INTERNAL_DTOR zval_internal_dtor_wrapper
-#define ZVAL_INTERNAL_PTR_DTOR zval_internal_ptr_dtor_wrapper
+#define ZVAL_PTR_DTOR zval_ptr_dtor
+#define ZVAL_INTERNAL_PTR_DTOR zval_internal_ptr_dtor
#endif
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 563e121b7e..c523f40dc9 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
| Sascha Schumann <sascha@schumann.cx> |
| Pierre Joye <pierre@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
@@ -85,7 +83,7 @@ ts_rsrc_id cwd_globals_id;
virtual_cwd_globals cwd_globals;
#endif
-cwd_state main_cwd_state; /* True global */
+static cwd_state main_cwd_state; /* True global */
#ifndef ZEND_WIN32
#include <unistd.h>
@@ -157,7 +155,6 @@ typedef struct {
static inline time_t FileTimeToUnixTime(const FILETIME *FileTime)
{
__int64 UnixTime;
- long *nsec = NULL;
SYSTEMTIME SystemTime;
FileTimeToSystemTime(FileTime, &SystemTime);
@@ -166,10 +163,6 @@ static inline time_t FileTimeToUnixTime(const FILETIME *FileTime)
UnixTime -= (SECS_BETWEEN_EPOCHS * SECS_TO_100NS);
- if (nsec) {
- *nsec = (UnixTime % SECS_TO_100NS) * (__int64)100;
- }
-
UnixTime /= SECS_TO_100NS; /* now convert to seconds */
if ((time_t)UnixTime != UnixTime) {
@@ -178,7 +171,7 @@ static inline time_t FileTimeToUnixTime(const FILETIME *FileTime)
return (time_t)UnixTime;
}
-CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ /* {{{ */
+CWD_API ssize_t php_sys_readlink(const char *link, char *target, size_t target_len){ /* {{{ */
HANDLE hFile;
wchar_t *linkw = php_win32_ioutil_any_to_w(link), targetw[MAXPATHLEN];
size_t ret_len, targetw_len, offset = 0;
@@ -194,8 +187,8 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){
}
hFile = CreateFileW(linkw, // file to open
- GENERIC_READ, // open for reading
- FILE_SHARE_READ, // share for reading
+ 0, // query possible attributes
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_FLAG_BACKUP_SEMANTICS, // normal file
@@ -244,7 +237,7 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){
CloseHandle(hFile);
free(linkw);
- return ret_len;
+ return (ssize_t)ret_len;
}
/* }}} */
@@ -306,7 +299,13 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{
REPARSE_DATA_BUFFER * pbuffer;
DWORD retlength = 0;
- hLink = CreateFileW(pathw, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ hLink = CreateFileW(pathw,
+ FILE_READ_ATTRIBUTES,
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
if(hLink == INVALID_HANDLE_VALUE) {
free(pathw);
return -1;
@@ -424,7 +423,7 @@ void virtual_cwd_main_cwd_init(uint8_t reinit) /* {{{ */
cwd[0] = '\0';
}
- main_cwd_state.cwd_length = (int)strlen(cwd);
+ main_cwd_state.cwd_length = strlen(cwd);
#ifdef ZEND_WIN32
if (main_cwd_state.cwd_length >= 2 && cwd[1] == ':') {
cwd[0] = toupper(cwd[0]);
@@ -731,10 +730,10 @@ CWD_API realpath_cache_bucket** realpath_cache_get_buckets(void)
#undef LINK_MAX
#define LINK_MAX 32
-static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, int use_realpath, int is_dir, int *link_is_dir) /* {{{ */
+static size_t tsrm_realpath_r(char *path, size_t start, size_t len, int *ll, time_t *t, int use_realpath, int is_dir, int *link_is_dir) /* {{{ */
{
- int i, j, save;
- int directory = 0;
+ size_t i, j;
+ int directory = 0, save;
#ifdef ZEND_WIN32
WIN32_FIND_DATAW dataw;
HANDLE hFind = INVALID_HANDLE_VALUE;
@@ -762,28 +761,31 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
while (i > start && !IS_SLASH(path[i-1])) {
i--;
}
+ assert(i < MAXPATHLEN);
if (i == len ||
- (i == len - 1 && path[i] == '.')) {
+ (i + 1 == len && path[i] == '.')) {
/* remove double slashes and '.' */
- len = i - 1;
+ len = EXPECTED(i > 0) ? i - 1 : 0;
is_dir = 1;
continue;
- } else if (i == len - 2 && path[i] == '.' && path[i+1] == '.') {
+ } else if (i + 2 == len && path[i] == '.' && path[i+1] == '.') {
/* remove '..' and previous directory */
is_dir = 1;
if (link_is_dir) {
*link_is_dir = 1;
}
- if (i - 1 <= start) {
+ if (i <= start + 1) {
return start ? start : len;
}
j = tsrm_realpath_r(path, start, i-1, ll, t, use_realpath, 1, NULL);
- if (j > start) {
+ if (j > start && j != (size_t)-1) {
j--;
+ assert(i < MAXPATHLEN);
while (j > start && !IS_SLASH(path[j])) {
j--;
}
+ assert(i < MAXPATHLEN);
if (!start) {
/* leading '..' must not be removed in case of relative path */
if (j == 0 && path[0] == '.' && path[1] == '.' &&
@@ -823,7 +825,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
if ((bucket = realpath_cache_find(path, len, *t)) != NULL) {
if (is_dir && !bucket->is_dir) {
/* not a directory */
- return -1;
+ return (size_t)-1;
} else {
if (link_is_dir) {
*link_is_dir = bucket->is_dir;
@@ -838,14 +840,14 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
if (save) {
pathw = php_win32_ioutil_any_to_w(path);
if (!pathw) {
- return -1;
+ return (size_t)-1;
}
hFind = FindFirstFileExW(pathw, FindExInfoBasic, &dataw, FindExSearchNameMatch, NULL, 0);
if (INVALID_HANDLE_VALUE == hFind) {
if (use_realpath == CWD_REALPATH) {
/* file not found */
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
/* continue resolution anyway but don't save result in the cache */
save = 0;
@@ -866,7 +868,8 @@ retry:
HANDLE hLink = NULL;
REPARSE_DATA_BUFFER * pbuffer;
DWORD retlength = 0;
- int bufindex = 0, isabsolute = 0;
+ size_t bufindex = 0;
+ uint8_t isabsolute = 0;
wchar_t * reparsetarget;
BOOL isVolume = FALSE;
#if VIRTUAL_CWD_DEBUG
@@ -874,20 +877,26 @@ retry:
#endif
char *substitutename = NULL;
size_t substitutename_len;
- int substitutename_off = 0;
+ size_t substitutename_off = 0;
wchar_t tmpsubstname[MAXPATHLEN];
if(++(*ll) > LINK_MAX) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
- hLink = CreateFileW(pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ hLink = CreateFileW(pathw,
+ 0,
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
if(hLink == INVALID_HANDLE_VALUE) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
@@ -895,7 +904,7 @@ retry:
CloseHandle(hLink);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) {
BY_HANDLE_FILE_INFORMATION fileInformation;
@@ -916,7 +925,7 @@ retry:
free_alloca(tmp, use_heap);
CloseHandle(hLink);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
CloseHandle(hLink);
@@ -930,7 +939,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
#endif
@@ -939,7 +948,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
memmove(tmpsubstname, reparsetarget + pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR), pbuffer->MountPointReparseBuffer.SubstituteNameLength);
tmpsubstname[substitutename_len] = L'\0';
@@ -952,7 +961,7 @@ retry:
free(printname);
#endif
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
}
else if(pbuffer->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) {
@@ -964,7 +973,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
#endif
@@ -974,7 +983,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
memmove(tmpsubstname, reparsetarget + pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR), pbuffer->MountPointReparseBuffer.SubstituteNameLength);
tmpsubstname[substitutename_len] = L'\0';
@@ -987,7 +996,7 @@ retry:
free(printname);
#endif
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
}
else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP ||
@@ -1000,7 +1009,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
memcpy(substitutename, path, len + 1);
substitutename_len = len;
@@ -1009,7 +1018,7 @@ retry:
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
if(isabsolute && substitutename_len > 4) {
@@ -1036,7 +1045,7 @@ retry:
if (!isVolume) {
char * tmp2 = substitutename + substitutename_off;
- for(bufindex = 0; bufindex < (substitutename_len - substitutename_off); bufindex++) {
+ for (bufindex = 0; bufindex + substitutename_off < substitutename_len; bufindex++) {
*(path + bufindex) = *(tmp2 + bufindex);
}
@@ -1060,10 +1069,10 @@ retry:
if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) {
/* use_realpath is 0 in the call below coz path is absolute*/
j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory);
- if(j < 0) {
+ if(j == (size_t)-1) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
}
}
@@ -1071,17 +1080,17 @@ retry:
if(i + j >= MAXPATHLEN - 1) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
memmove(path+i, path, j+1);
memcpy(path, tmp, i-1);
path[i-1] = DEFAULT_SLASH;
j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory);
- if(j < 0) {
+ if(j == (size_t)-1) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
}
directory = (dataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
@@ -1097,14 +1106,14 @@ retry:
/* not a directory */
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
}
#else
if (save && php_sys_lstat(path, &st) < 0) {
if (use_realpath == CWD_REALPATH) {
/* file not found */
- return -1;
+ return (size_t)-1;
}
/* continue resolution anyway but don't save result in the cache */
save = 0;
@@ -1114,30 +1123,30 @@ retry:
memcpy(tmp, path, len+1);
if (save && S_ISLNK(st.st_mode)) {
- if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) {
+ if (++(*ll) > LINK_MAX || (j = (size_t)php_sys_readlink(tmp, path, MAXPATHLEN)) == (size_t)-1) {
/* too many links or broken symlinks */
free_alloca(tmp, use_heap);
- return -1;
+ return (size_t)-1;
}
path[j] = 0;
if (IS_ABSOLUTE_PATH(path, j)) {
j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory);
- if (j < 0) {
+ if (j == (size_t)-1) {
free_alloca(tmp, use_heap);
- return -1;
+ return (size_t)-1;
}
} else {
if (i + j >= MAXPATHLEN-1) {
free_alloca(tmp, use_heap);
- return -1; /* buffer overflow */
+ return (size_t)-1; /* buffer overflow */
}
memmove(path+i, path, j+1);
memcpy(path, tmp, i-1);
path[i-1] = DEFAULT_SLASH;
j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory);
- if (j < 0) {
+ if (j == (size_t)-1) {
free_alloca(tmp, use_heap);
- return -1;
+ return (size_t)-1;
}
}
if (link_is_dir) {
@@ -1152,24 +1161,24 @@ retry:
if (is_dir && !directory) {
/* not a directory */
free_alloca(tmp, use_heap);
- return -1;
+ return (size_t)-1;
}
}
#endif
- if (i - 1 <= start) {
+ if (i <= start + 1) {
j = start;
} else {
/* some leading directories may be unaccessable */
j = tsrm_realpath_r(path, start, i-1, ll, t, save ? CWD_FILEPATH : use_realpath, 1, NULL);
- if (j > start) {
+ if (j > start && j != (size_t)-1) {
path[j++] = DEFAULT_SLASH;
}
}
#ifdef ZEND_WIN32
- if (j < 0 || j + len - i >= MAXPATHLEN-1) {
+ if (j == (size_t)-1 || j + len >= MAXPATHLEN - 1 + i) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
if (save) {
size_t sz;
@@ -1177,9 +1186,9 @@ retry:
if (!tmp_path) {
free_alloca(tmp, use_heap);
FREE_PATHW()
- return -1;
+ return (size_t)-1;
}
- i = (int)sz;
+ i = sz;
memcpy(path+j, tmp_path, i+1);
free(tmp_path);
j += i;
@@ -1190,9 +1199,9 @@ retry:
}
}
#else
- if (j < 0 || j + len - i >= MAXPATHLEN-1) {
+ if (j == (size_t)-1 || j + len >= MAXPATHLEN - 1 + i) {
free_alloca(tmp, use_heap);
- return -1;
+ return (size_t)-1;
}
memcpy(path+j, tmp+i, len-i+1);
j += (len-i);
@@ -1218,16 +1227,16 @@ retry:
/* returns 0 for ok, 1 for error */
CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath) /* {{{ */
{
- int path_length = (int)strlen(path);
- char resolved_path[MAXPATHLEN];
- int start = 1;
+ size_t path_length = strlen(path);
+ char resolved_path[MAXPATHLEN] = {0};
+ size_t start = 1;
int ll = 0;
time_t t;
int ret;
int add_slash;
void *tmp;
- if (path_length <= 0 || path_length >= MAXPATHLEN-1) {
+ if (!path_length || path_length >= MAXPATHLEN-1) {
#ifdef ZEND_WIN32
_set_errno(EINVAL);
#else
@@ -1249,7 +1258,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
start = 0;
memcpy(resolved_path , path, path_length + 1);
} else {
- int state_cwd_length = state->cwd_length;
+ size_t state_cwd_length = state->cwd_length;
#ifdef ZEND_WIN32
if (IS_SLASH(path[0])) {
@@ -1343,7 +1352,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
t = CWDG(realpath_cache_ttl) ? 0 : -1;
path_length = tsrm_realpath_r(resolved_path, start, path_length, &ll, &t, use_realpath, 0, NULL);
- if (path_length < 0) {
+ if (path_length == (size_t)-1) {
errno = ENOENT;
return 1;
}
@@ -1351,6 +1360,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
if (!start && !path_length) {
resolved_path[path_length++] = '.';
}
+
if (add_slash && path_length && !IS_SLASH(resolved_path[path_length-1])) {
if (path_length >= MAXPATHLEN-1) {
return -1;
@@ -1404,7 +1414,7 @@ CWD_API int virtual_chdir(const char *path) /* {{{ */
CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path)) /* {{{ */
{
- int length = (int)strlen(path);
+ size_t length = strlen(path);
char *temp;
int retval;
ALLOCA_FLAG(use_heap)
@@ -1412,10 +1422,10 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path
if (length == 0) {
return 1; /* Can't cd to empty string */
}
- while(--length >= 0 && !IS_SLASH(path[length])) {
+ while(--length < SIZE_MAX && !IS_SLASH(path[length])) {
}
- if (length == -1) {
+ if (length == SIZE_MAX) {
/* No directory only file name */
errno = ENOENT;
return -1;
@@ -1459,7 +1469,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path) /* {{{ */
}
if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)==0) {
- int len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length;
+ size_t len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length;
memcpy(real_path, new_state.cwd, len);
real_path[len] = '\0';
@@ -1923,7 +1933,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path) /* {{{ */
} else if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
VCWD_GETCWD(cwd, MAXPATHLEN)) {
new_state.cwd = estrdup(cwd);
- new_state.cwd_length = (int)strlen(cwd);
+ new_state.cwd_length = strlen(cwd);
} else {
new_state.cwd = (char*)emalloc(1);
new_state.cwd[0] = '\0';
@@ -1936,7 +1946,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path) /* {{{ */
}
if (real_path) {
- int copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length;
+ size_t copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length;
memcpy(real_path, new_state.cwd, copy_len);
real_path[copy_len] = '\0';
efree(new_state.cwd);
diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h
index 6a3d78bb3e..6799dba630 100644
--- a/Zend/zend_virtual_cwd.h
+++ b/Zend/zend_virtual_cwd.h
@@ -12,14 +12,12 @@
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
| Sascha Schumann <sascha@schumann.cx> |
| Pierre Joye <pierre@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef VIRTUAL_CWD_H
#define VIRTUAL_CWD_H
@@ -121,7 +119,7 @@ typedef unsigned short mode_t;
CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat);
# define php_sys_stat(path, buf) php_sys_stat_ex(path, buf, 0)
# define php_sys_lstat(path, buf) php_sys_stat_ex(path, buf, 1)
-CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len);
+CWD_API ssize_t php_sys_readlink(const char *link, char *target, size_t target_len);
#else
# define php_sys_stat stat
# define php_sys_lstat lstat
@@ -132,7 +130,7 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len);
typedef struct _cwd_state {
char *cwd;
- int cwd_length;
+ size_t cwd_length;
} cwd_state;
typedef int (*verify_path_func)(const cwd_state *);
@@ -160,21 +158,6 @@ CWD_API int virtual_rmdir(const char *pathname);
CWD_API DIR *virtual_opendir(const char *pathname);
CWD_API FILE *virtual_popen(const char *command, const char *type);
CWD_API int virtual_access(const char *pathname, int mode);
-#if defined(ZEND_WIN32)
-/* these are not defined in win32 headers */
-#ifndef W_OK
-#define W_OK 0x02
-#endif
-#ifndef R_OK
-#define R_OK 0x04
-#endif
-#ifndef X_OK
-#define X_OK 0x01
-#endif
-#ifndef F_OK
-#define F_OK 0x00
-#endif
-#endif
#if HAVE_UTIME
CWD_API int virtual_utime(const char *filename, struct utimbuf *buf);
@@ -187,7 +170,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li
/* One of the following constants must be used as the last argument
in virtual_file_ex() call. */
-#define CWD_EXPAND 0 /* expand "." and ".." but dont resolve symlinks */
+#define CWD_EXPAND 0 /* expand "." and ".." but don't resolve symlinks */
#define CWD_FILEPATH 1 /* resolve symlinks if file is exist otherwise expand */
#define CWD_REALPATH 2 /* call realpath(), resolve symlinks. File must exist */
diff --git a/Zend/zend_vm.h b/Zend/zend_vm.h
index eed06a653c..f14267e828 100644
--- a/Zend/zend_vm.h
+++ b/Zend/zend_vm.h
@@ -12,27 +12,27 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#ifndef ZEND_VM_H
#define ZEND_VM_H
BEGIN_EXTERN_C()
-ZEND_API void zend_vm_use_old_executor(void);
-ZEND_API void zend_vm_set_opcode_handler(zend_op* opcode);
-ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* opcode, uint32_t op1_info, uint32_t op2_info, uint32_t res_info);
-ZEND_API void zend_serialize_opcode_handler(zend_op *op);
-ZEND_API void zend_deserialize_opcode_handler(zend_op *op);
-ZEND_API const void *zend_get_opcode_handler_func(const zend_op *op);
+ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* opcode);
+ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* opcode, uint32_t op1_info, uint32_t op2_info, uint32_t res_info);
+ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op);
+ZEND_API void ZEND_FASTCALL zend_deserialize_opcode_handler(zend_op *op);
+ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *op);
ZEND_API const zend_op *zend_get_halt_op(void);
-ZEND_API int zend_vm_call_opcode_handler(zend_execute_data *ex);
+ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data *ex);
ZEND_API int zend_vm_kind(void);
+void zend_vm_init(void);
+void zend_vm_dtor(void);
+
END_EXTERN_C()
#define ZEND_VM_SET_OPCODE_HANDLER(opline) zend_vm_set_opcode_handler(opline)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index df0a3d9812..99b731b11a 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -12,20 +12,18 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
* php zend_vm_gen.php
*/
-ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -68,7 +66,7 @@ ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -111,7 +109,7 @@ ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -157,7 +155,7 @@ ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -172,7 +170,17 @@ ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
+
+ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -184,10 +192,7 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_mod_by_zero_helper);
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -211,7 +216,7 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -239,7 +244,7 @@ ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -267,7 +272,7 @@ ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -282,7 +287,7 @@ ZEND_VM_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_CONST))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -297,38 +302,36 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (OP1_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- FREE_OP1();
- break;
- }
- }
- if (OP2_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- FREE_OP1();
- break;
- }
+ if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ FREE_OP1();
+ } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
+ FREE_OP2();
+ } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ FREE_OP2();
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
FREE_OP1();
- } while (0);
- FREE_OP2();
+ FREE_OP2();
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
@@ -346,7 +349,7 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
}
-ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -364,7 +367,7 @@ ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -382,7 +385,7 @@ ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -411,17 +414,7 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
FREE_OP1();
FREE_OP2();
} else {
@@ -450,7 +443,7 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -479,17 +472,7 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
FREE_OP1();
FREE_OP2();
} else {
@@ -518,7 +501,7 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -568,7 +551,7 @@ ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -618,7 +601,7 @@ ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -633,7 +616,7 @@ ZEND_VM_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -660,7 +643,7 @@ ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -687,7 +670,7 @@ ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -714,7 +697,7 @@ ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -729,7 +712,7 @@ ZEND_VM_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -748,7 +731,7 @@ ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zval *val;
@@ -773,7 +756,7 @@ ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
+ZEND_VM_COLD_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
{
USE_OPLINE
@@ -787,6 +770,23 @@ ZEND_VM_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
HANDLE_EXCEPTION();
}
+ZEND_VM_COLD_HELPER(zend_abstract_method_helper, ANY, ANY, zend_function *fbc)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+}
+
+ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY, zval *function_name)
+{
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ HANDLE_EXCEPTION();
+}
+
ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op_type binary_op)
{
USE_OPLINE
@@ -806,31 +806,30 @@ 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_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_data1);
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ ZEND_VM_C_GOTO(assign_op_object);
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+ZEND_VM_C_LABEL(assign_op_object):
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -838,7 +837,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
@@ -863,15 +862,14 @@ ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|CV, CONST|TMPVAR|UNUSED|CV,
ZEND_VM_C_LABEL(assign_dim_op_array):
SEPARATE_ARRAY(container);
ZEND_VM_C_LABEL(assign_dim_op_new_array):
+ dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP2_TYPE == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
}
} else {
- dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-
if (OP2_TYPE == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
@@ -881,10 +879,9 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -900,39 +897,39 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
} else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
ZEND_VM_C_LABEL(assign_dim_op_convert_to_array):
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
ZEND_VM_C_GOTO(assign_dim_op_new_array);
}
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (OP2_TYPE == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
} else {
if (UNEXPECTED(OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
ZEND_VM_C_LABEL(assign_dim_op_ret_null):
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
@@ -959,7 +956,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin
}
} else {
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
binary_op(var_ptr, var_ptr, value);
@@ -979,7 +975,10 @@ ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TM
ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op);
#else
# if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED
+# if !defined(ZEND_VM_SPEC)
+ /* opline->extended_value checks are specialized, don't need opline */
USE_OPLINE
+# endif
if (EXPECTED(opline->extended_value == 0)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_simple_helper, binary_op, binary_op);
@@ -993,62 +992,62 @@ ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TM
#endif
}
-ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_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, SPEC(DIM_OBJ))
+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_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function);
}
@@ -1072,21 +1071,21 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ ZEND_VM_C_GOTO(pre_incdec_object);
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+ZEND_VM_C_LABEL(pre_incdec_object):
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -1100,7 +1099,6 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -1113,7 +1111,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -1122,12 +1120,12 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_property_helper, inc, 1);
}
-ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_property_helper, inc, 0);
}
@@ -1151,25 +1149,26 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ ZEND_VM_C_GOTO(post_incdec_object);
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+ZEND_VM_C_LABEL(post_incdec_object):
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -1177,8 +1176,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -1187,7 +1185,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -1196,12 +1194,12 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 1);
}
-ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0);
}
@@ -1234,7 +1232,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
increment_function(var_ptr);
@@ -1274,7 +1271,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
decrement_function(var_ptr);
@@ -1295,7 +1291,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -1310,8 +1306,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
increment_function(var_ptr);
@@ -1328,7 +1323,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -1343,8 +1338,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
decrement_function(var_ptr);
@@ -1368,14 +1362,14 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
}
} else {
- zend_string *str = _zval_get_string_func(z);
+ zend_string *str = zval_get_string_func(z);
if (ZSTR_LEN(str) != 0) {
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
} else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(z, BP_VAR_R);
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
FREE_OP1();
@@ -1388,82 +1382,46 @@ ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
zend_free_op free_op1;
zval *varname;
zval *retval;
- zend_string *name;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
SAVE_OPLINE();
varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (OP1_TYPE == IS_CONST) {
+ if (OP1_TYPE == IS_CONST) {
name = Z_STR_P(varname);
} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
name = Z_STR_P(varname);
- zend_string_addref(name);
+ tmp_name = NULL;
} else {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
- name = zval_get_string(varname);
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- retval = zend_hash_find(target_symbol_table, name);
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ retval = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
if (retval == NULL) {
if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- zval *result;
-
ZEND_VM_C_LABEL(fetch_this):
- result = EX_VAR(opline->result.var);
- switch (type) {
- case BP_VAR_R:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- zend_error(E_NOTICE,"Undefined variable: this");
- }
- break;
- case BP_VAR_IS:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- }
- break;
- case BP_VAR_RW:
- case BP_VAR_W:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot re-assign $this");
- break;
- case BP_VAR_UNSET:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot unset $this");
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
+ zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
if (OP1_TYPE != IS_CONST) {
- zend_string_release(name);
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_W) {
+ retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- case BP_VAR_W:
- retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
}
/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -1472,36 +1430,32 @@ ZEND_VM_C_LABEL(fetch_this):
if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
ZEND_VM_C_GOTO(fetch_this);
}
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_W:
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(retval);
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
ZVAL_NULL(retval);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
}
}
}
- if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+ if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
FREE_OP1();
}
if (OP1_TYPE != IS_CONST) {
- zend_string_release(name);
+ zend_tmp_string_release(tmp_name);
}
ZEND_ASSERT(retval != NULL);
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -1523,15 +1477,12 @@ ZEND_VM_HANDLER(86, ZEND_FETCH_RW, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_RW);
}
-ZEND_VM_HANDLER(92, ZEND_FETCH_FUNC_ARG, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ARG_NUM)
+ZEND_VM_HANDLER(92, ZEND_FETCH_FUNC_ARG, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_W);
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_R);
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, fetch_type);
}
ZEND_VM_HANDLER(95, ZEND_FETCH_UNSET, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
@@ -1550,15 +1501,77 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
zend_free_op free_op1;
zval *varname;
zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- retval = zend_fetch_static_property_address(varname, OP1_TYPE, opline->op2, OP2_TYPE, type EXECUTE_DATA_CC);
+ 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), 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 (EG(exception)) {
- FREE_OP1();
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
} else {
@@ -1567,53 +1580,48 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
}
}
- FREE_OP1();
-
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
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)
+ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W);
}
-ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
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, NUM)
+ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W);
- } else {
- ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R);
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, fetch_type);
}
-ZEND_VM_HANDLER(178, ZEND_FETCH_STATIC_PROP_UNSET, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_HANDLER(178, ZEND_FETCH_STATIC_PROP_UNSET, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_UNSET);
}
-ZEND_VM_HANDLER(176, ZEND_FETCH_STATIC_PROP_IS, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_HANDLER(176, ZEND_FETCH_STATIC_PROP_IS, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_IS);
}
-ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -1627,7 +1635,7 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_C_LABEL(fetch_dim_r_array):
value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, OP2_TYPE, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -1637,12 +1645,13 @@ ZEND_VM_C_LABEL(fetch_dim_r_array):
}
} else {
ZEND_VM_C_LABEL(fetch_dim_r_slow):
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, OP2_TYPE EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
}
FREE_OP2();
FREE_OP1();
@@ -1657,13 +1666,12 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
-
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_W(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -1675,17 +1683,16 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_RW(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -1693,49 +1700,49 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_IS);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_IS(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, NUM)
+ZEND_VM_COLD_HELPER(zend_use_tmp_in_write_context_helper, ANY, ANY)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use temporary expression in write context");
+ FREE_UNFETCHED_OP2();
+ FREE_UNFETCHED_OP1();
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
+
+ZEND_VM_COLD_HELPER(zend_use_undef_in_read_context_helper, ANY, ANY)
{
USE_OPLINE
- zval *container;
- zend_free_op free_op1, free_op2;
SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use [] for reading");
+ FREE_UNFETCHED_OP2();
+ FREE_UNFETCHED_OP1();
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ZEND_VM_COLD_CONSTCONST_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
}
- container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- FREE_OP2();
- FREE_OP1_VAR_PTR();
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_W);
} else {
if (OP2_TYPE == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_use_undef_in_read_context_helper);
}
- container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
- FREE_OP2();
- FREE_OP1();
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_R);
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV)
@@ -1746,43 +1753,50 @@ ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV)
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
-
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_UNSET(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1;
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
+ container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
- offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP1_TYPE == IS_CONST ||
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- ZEND_VM_C_GOTO(fetch_obj_r_no_object);
+ do {
+ if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
ZEND_VM_C_GOTO(fetch_obj_r_no_object);
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -1790,37 +1804,60 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (OP2_TYPE == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
ZEND_VM_C_LABEL(fetch_obj_r_no_object):
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
@@ -1830,12 +1867,11 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
@@ -1845,21 +1881,20 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
}
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
+ 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);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
@@ -1868,22 +1903,23 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
+ 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);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1;
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
@@ -1892,18 +1928,19 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
- offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE == IS_CONST ||
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- ZEND_VM_C_GOTO(fetch_obj_is_no_object);
+ do {
+ if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
ZEND_VM_C_GOTO(fetch_obj_is_no_object);
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -1911,21 +1948,43 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (OP2_TYPE == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (OP2_TYPE == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -1935,7 +1994,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object):
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -1948,47 +2007,25 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM)
+ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
-
- 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);
- }
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- FREE_UNFETCHED_OP2();
- FREE_OP1_VAR_PTR();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = GET_OP2_ZVAL_PTR(BP_VAR_R);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
}
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W);
} else {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R);
}
}
-ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *container, *property;
+ zval *container, *property, *result;
SAVE_OPLINE();
container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
@@ -1998,17 +2035,16 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
}
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
+ 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);
FREE_OP2();
- if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (OP1_TYPE == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(98, ZEND_FETCH_LIST_R, CONST|TMPVARCV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -2016,12 +2052,36 @@ ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_LIST_r(container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
+ FREE_OP2();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+ZEND_VM_HANDLER(198, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container, *dim;
+
+ SAVE_OPLINE();
+ container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
+ dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+
+ if (OP1_TYPE == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_W(container, dim, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC);
+ }
+
FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV))
+ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
{
USE_OPLINE
zend_free_op free_op1, free_op2, free_op_data;
@@ -2038,54 +2098,26 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC(
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ ZEND_VM_C_GOTO(assign_object);
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- FREE_OP_DATA();
- OBJ_RELEASE(obj);
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- Z_DELREF_P(object);
- } else {
- if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- FREE_OP_DATA();
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ FREE_OP_DATA();
+ ZEND_VM_C_GOTO(exit_assign_obj);
+ }
}
+ZEND_VM_C_LABEL(assign_object):
if (OP2_TYPE == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
ZEND_VM_C_LABEL(fast_assign_obj):
@@ -2099,11 +2131,11 @@ ZEND_VM_C_LABEL(fast_assign_obj):
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
ZEND_VM_C_GOTO(fast_assign_obj);
}
@@ -2122,24 +2154,20 @@ ZEND_VM_C_LABEL(fast_assign_obj):
if (Z_ISREF_P(value)) {
if (OP_DATA_TYPE == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (OP_DATA_TYPE == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (OP_DATA_TYPE == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -2152,12 +2180,7 @@ ZEND_VM_C_LABEL(fast_assign_obj):
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
FREE_OP_DATA();
ZEND_VM_C_GOTO(exit_assign_obj);
}
@@ -2166,7 +2189,7 @@ 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(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -2196,10 +2219,30 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(
ZEND_VM_C_LABEL(try_assign_dim_array):
SEPARATE_ARRAY(object_ptr);
if (OP2_TYPE == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
+ if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ FREE_OP_DATA();
+ zend_cannot_add_element();
ZEND_VM_C_GOTO(assign_dim_error);
+ } else if (OP_DATA_TYPE == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (OP_DATA_TYPE == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ FREE_OP_DATA();
+ }
+ } else if (OP_DATA_TYPE == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -2211,9 +2254,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
if (UNEXPECTED(variable_ptr == NULL)) {
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 = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
- value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -2228,16 +2271,15 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
FREE_OP_DATA();
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (OP2_TYPE == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
FREE_UNFETCHED_OP_DATA();
FREE_OP1_VAR_PTR();
UNDEF_RESULT();
@@ -2245,16 +2287,15 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
} else {
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
FREE_OP_DATA();
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
ZEND_VM_C_GOTO(try_assign_dim_array);
} else {
if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
ZEND_VM_C_LABEL(assign_dim_error):
@@ -2311,54 +2352,45 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W);
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- if (OP1_TYPE == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) &&
- UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) {
+ if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } 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");
FREE_OP1_VAR_PTR();
FREE_OP2_VAR_PTR();
UNDEF_RESULT();
HANDLE_EXCEPTION();
-
+ } else if (OP2_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
} else if (OP2_TYPE == IS_VAR &&
opline->extended_value == ZEND_RETURNS_FUNCTION &&
UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- zend_error(E_NOTICE, "Only variables should be assigned by reference");
- if (UNEXPECTED(EG(exception) != NULL)) {
+
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) {
FREE_OP2_VAR_PTR();
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
- }
- /* zend_assign_to_variable() always takes care of op2, never free it! */
-
+ /* op2 freed by assign_to_variable */
+ FREE_OP1_VAR_PTR();
+ ZEND_VM_NEXT_OPCODE();
} else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
+ }
- if ((OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) ||
- (OP2_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr)))) {
- variable_ptr = &EG(uninitialized_zval);
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
-
- FREE_OP2_VAR_PTR();
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
+ FREE_OP2_VAR_PTR();
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
+ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
{
zend_execute_data *old_execute_data;
uint32_t call_info = EX_CALL_INFO();
@@ -2374,12 +2406,12 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
#else
if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
EG(vm_stack_top) = (zval*)execute_data;
execute_data = EX(prev_execute_data);
@@ -2410,12 +2442,12 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
#else
if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
old_execute_data = execute_data;
@@ -2456,7 +2488,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
}
EG(current_execute_data) = EX(prev_execute_data);
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
ZEND_VM_RETURN();
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
@@ -2483,11 +2515,10 @@ ZEND_VM_HOT_HANDLER(42, ZEND_JMP, JMP_ADDR, ANY)
{
USE_OPLINE
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
}
-ZEND_VM_HOT_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_HOT_NOCONST_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2496,17 +2527,16 @@ ZEND_VM_HOT_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2519,7 +2549,7 @@ ZEND_VM_HOT_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HOT_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_HOT_NOCONST_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2528,16 +2558,16 @@ ZEND_VM_HOT_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
@@ -2550,7 +2580,7 @@ ZEND_VM_HOT_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HOT_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
+ZEND_VM_HOT_NOCONST_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2565,11 +2595,11 @@ ZEND_VM_HOT_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2582,7 +2612,7 @@ ZEND_VM_HOT_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2599,11 +2629,11 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2619,7 +2649,7 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2630,8 +2660,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
@@ -2656,7 +2685,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, LIVE_RANGE)
+ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
{
USE_OPLINE
@@ -2665,7 +2694,7 @@ ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, LIVE_RANGE)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, LIVE_RANGE)
+ZEND_VM_HOT_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY)
{
zval *var;
USE_OPLINE
@@ -2679,7 +2708,7 @@ ZEND_VM_HANDLER(127, ZEND_FE_FREE, TMPVAR, LIVE_RANGE)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -2695,38 +2724,36 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (OP1_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- FREE_OP1();
- break;
- }
- }
- if (OP2_TYPE != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- FREE_OP1();
- break;
- }
+ if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ FREE_OP1();
+ } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
+ FREE_OP2();
+ } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ FREE_OP2();
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
FREE_OP1();
- } while (0);
- FREE_OP2();
+ FREE_OP2();
+ }
ZEND_VM_NEXT_OPCODE();
}
@@ -2739,7 +2766,7 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
if (OP2_TYPE == IS_CONST) {
op2_str = Z_STR_P(op2);
@@ -2749,26 +2776,30 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
if (OP1_TYPE != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
if (OP2_TYPE == IS_CONST) {
- zend_string_addref(op2_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
if (OP2_TYPE != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
if (OP1_TYPE == IS_CONST) {
- zend_string_addref(op1_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -2777,10 +2808,10 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
if (OP1_TYPE != IS_CONST) {
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
}
if (OP2_TYPE != IS_CONST) {
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
FREE_OP1();
@@ -2799,7 +2830,10 @@ ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV, NUM)
rope = (zend_string**)EX_VAR(opline->result.var);
if (OP2_TYPE == IS_CONST) {
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[0] = zend_string_copy(Z_STR_P(var));
+ rope[0] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
@@ -2813,7 +2847,7 @@ ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV, NUM)
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[0] = _zval_get_string_func(var);
+ rope[0] = zval_get_string_func(var);
FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -2832,7 +2866,10 @@ ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV, NUM)
rope = (zend_string**)EX_VAR(opline->op1.var);
if (OP2_TYPE == IS_CONST) {
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
@@ -2846,7 +2883,7 @@ ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV, NUM)
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -2867,7 +2904,10 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
rope = (zend_string**)EX_VAR(opline->op1.var);
if (OP2_TYPE == IS_CONST) {
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
@@ -2881,11 +2921,11 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
FREE_OP2();
if (UNEXPECTED(EG(exception))) {
for (i = 0; i <= opline->extended_value; i++) {
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -2901,38 +2941,39 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
for (i = 0; i <= opline->extended_value; i++) {
memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
target += ZSTR_LEN(rope[i]);
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
*target = '\0';
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV, CLASS_FETCH)
+ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, UNUSED|CLASS_FETCH, CONST|TMPVAR|UNUSED|CV, CACHE_SLOT)
{
+ zend_free_op free_op2;
+ zval *class_name;
USE_OPLINE
SAVE_OPLINE();
if (OP2_TYPE == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_free_op free_op2;
- zval *class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ } else if (OP2_TYPE == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ CACHE_PTR(opline->extended_value, ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else {
+ class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
ZEND_VM_C_LABEL(try_class_name):
- if (OP2_TYPE == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), EX_CONSTANT(opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ if (Z_TYPE_P(class_name) == IS_OBJECT) {
Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
} else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
class_name = Z_REFVAL_P(class_name);
ZEND_VM_C_GOTO(try_class_name);
@@ -2945,13 +2986,13 @@ ZEND_VM_C_LABEL(try_class_name):
}
zend_throw_error(NULL, "Class name must be a valid object or a string");
}
-
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+
+ FREE_OP2();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM)
+ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|CACHE_SLOT)
{
USE_OPLINE
zval *function_name;
@@ -2971,7 +3012,9 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
- function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if (OP2_TYPE != IS_CONST) {
+ function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ }
if (OP2_TYPE != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
@@ -3007,11 +3050,16 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
- FREE_OP2();
+ if (OP2_TYPE != IS_CONST) {
+ FREE_OP2();
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ if (OP2_TYPE == IS_CONST) {
+ function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ }
+ zend_invalid_method_call(object, function_name);
FREE_OP2();
FREE_OP1();
HANDLE_EXCEPTION();
@@ -3023,8 +3071,8 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
called_scope = obj->ce;
if (OP2_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
@@ -3035,11 +3083,15 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
HANDLE_EXCEPTION();
}
+ if (OP2_TYPE == IS_CONST) {
+ function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
FREE_OP2();
FREE_OP1();
@@ -3049,27 +3101,38 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (OP2_TYPE != IS_CONST) {
+ FREE_OP2();
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+ FREE_OP1();
+
+ if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (OP1_TYPE & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
- FREE_OP2();
- FREE_OP1();
-
- if ((OP1_TYPE & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if (OP1_TYPE == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
+ FREE_OP1();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -3080,7 +3143,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM)
+ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM|CACHE_SLOT)
{
USE_OPLINE
zval *function_name;
@@ -3093,14 +3156,16 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
if (OP1_TYPE == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (OP2_TYPE != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (OP1_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -3115,12 +3180,12 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
if (OP1_TYPE == IS_CONST &&
OP2_TYPE == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (OP1_TYPE != IS_CONST &&
OP2_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (OP2_TYPE != IS_UNUSED) {
zend_free_op free_op2;
@@ -3143,17 +3208,17 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
FREE_OP2();
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((OP2_TYPE == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
FREE_OP2();
HANDLE_EXCEPTION();
@@ -3161,11 +3226,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
if (OP2_TYPE == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (OP1_TYPE == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -3194,22 +3255,8 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -3235,27 +3282,25 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM)
+ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
{
USE_OPLINE
zend_function *fbc;
zval *function_name, *func;
zend_execute_data *call;
- function_name = (zval*)EX_CONSTANT(opline->op2);
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(function_name+1));
+ function_name = (zval*)RT_CONSTANT(opline, opline->op2);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(function_name+1), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, function_name);
}
fbc = Z_FUNC_P(func);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL);
@@ -3305,7 +3350,7 @@ ZEND_VM_C_LABEL(try_function_name):
if (UNEXPECTED(EG(exception))) {
if (call) {
if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release(call->func->common.function_name);
+ zend_string_release_ex(call->func->common.function_name, 0);
zend_free_trampoline(call->func);
}
zend_vm_stack_free_call_frame(call);
@@ -3344,9 +3389,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
+ zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
FREE_OP2();
HANDLE_EXCEPTION();
@@ -3354,21 +3397,20 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
- ZEND_ASSERT(GC_TYPE((zend_object*)func->common.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)func->common.prototype)++;
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
call_info |= ZEND_CALL_CLOSURE;
if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
}
} else if (object) {
call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ GC_ADDREF(object); /* For $this pointer */
}
FREE_OP2();
if ((OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
if (call_info & ZEND_CALL_CLOSURE) {
- zend_object_release((zend_object*)func->common.prototype);
+ zend_object_release(ZEND_CLOSURE_OBJECT(func));
}
if (call_info & ZEND_CALL_RELEASE_THIS) {
zend_object_release(object);
@@ -3380,7 +3422,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
init_func_run_time_cache(&func->op_array);
}
} else {
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
+ zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
efree(error);
FREE_OP2();
if (UNEXPECTED(EG(exception))) {
@@ -3399,7 +3441,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM)
+ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
{
USE_OPLINE
zval *func_name;
@@ -3407,24 +3449,21 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM)
zend_function *fbc;
zend_execute_data *call;
- func_name = EX_CONSTANT(opline->op2) + 1;
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(func_name));
+ func_name = (zval *)RT_CONSTANT(opline, opline->op2);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 1), 1);
if (func == NULL) {
- func_name++;
- func = zend_hash_find(EG(function_table), Z_STR_P(func_name));
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, func_name);
}
}
fbc = Z_FUNC_P(func);
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
@@ -3435,28 +3474,27 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM)
+ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op2;
- zval *fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ zval *fname;
zval *func;
zend_function *fbc;
zend_execute_data *call;
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(fname));
+ fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(fname));
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, fname);
}
fbc = Z_FUNC_P(func);
- CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame_ex(
@@ -3488,11 +3526,12 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
fbc->internal_function.handler(call, ret);
#if ZEND_DEBUG
- ZEND_ASSERT(
- EG(exception) || !call->func ||
- !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT(!Z_ISREF_P(ret));
+ if (!EG(exception) && call->func) {
+ ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_verify_internal_return_type(call->func, ret));
+ ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+ }
#endif
EG(current_execute_data) = execute_data;
@@ -3529,9 +3568,11 @@ ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL))
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
}
ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
@@ -3552,18 +3593,17 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
} else {
zval retval;
ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -3624,15 +3664,10 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
EX(call) = call->prev_execute_data;
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_abstract_method_helper, fbc, fbc);
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -3640,8 +3675,6 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
}
}
- LOAD_OPLINE();
-
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
ret = NULL;
if (RETURN_VALUE_USED(opline)) {
@@ -3650,11 +3683,15 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ LOAD_OPLINE();
+ ZEND_VM_ENTER_EX();
} else {
+ execute_data = EX(prev_execute_data);
+ LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
@@ -3721,7 +3758,7 @@ ZEND_VM_C_LABEL(fcall_end):
#else
if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
@@ -3737,7 +3774,7 @@ ZEND_VM_C_LABEL(fcall_end):
ZEND_VM_CONTINUE();
}
-ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED|CACHE_SLOT)
{
USE_OPLINE
@@ -3806,7 +3843,7 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
SAVE_OPLINE();
- zval_dtor_func(Z_COUNTED_P(free_op1));
+ rc_dtor_func(Z_COUNTED_P(free_op1));
}
}
} else {
@@ -3839,7 +3876,7 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
retval_ptr = Z_REFVAL_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
Z_ADDREF_P(retval_ptr);
@@ -3852,7 +3889,7 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
-ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
+ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
{
USE_OPLINE
zval *retval_ptr;
@@ -3877,7 +3914,7 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
ZVAL_NEW_REF(EX(return_value), retval_ptr);
if (OP1_TYPE == IS_CONST) {
- if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
+ Z_TRY_ADDREF_P(retval_ptr);
}
}
break;
@@ -3899,8 +3936,11 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
}
if (EX(return_value)) {
- ZVAL_MAKE_REF(retval_ptr);
- Z_ADDREF_P(retval_ptr);
+ if (Z_ISREF_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(retval_ptr, 2);
+ }
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
}
@@ -4006,15 +4046,14 @@ ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
}
}
} else if (OP1_TYPE == IS_CV) {
- ZVAL_DEREF(retval);
- ZVAL_COPY(&generator->retval, retval);
+ ZVAL_COPY_DEREF(&generator->retval, retval);
} else /* if (OP1_TYPE == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval))) {
zend_refcounted *ref = Z_COUNTED_P(retval);
retval = Z_REFVAL_P(retval);
ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval)) {
Z_ADDREF_P(retval);
@@ -4031,7 +4070,7 @@ ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
ZEND_VM_RETURN();
}
-ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
zval *value;
@@ -4062,7 +4101,7 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
zend_exception_save();
if (OP1_TYPE != IS_TMP_VAR) {
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
}
zend_throw_exception_object(value);
@@ -4071,7 +4110,7 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
HANDLE_EXCEPTION();
}
-ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV, JMP_ADDR)
+ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
{
USE_OPLINE
zend_class_entry *ce, *catch_ce;
@@ -4082,14 +4121,13 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV, JMP_ADDR)
/* Check whether an exception has been thrown, if not, jump over code */
zend_exception_restore();
if (EG(exception) == NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
- catch_ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), catch_ce);
+ CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
ce = EG(exception)->ce;
@@ -4101,24 +4139,23 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV, JMP_ADDR)
if (ce != catch_ce) {
if (!catch_ce || !instanceof_function(ce, catch_ce)) {
- if (opline->result.num) {
+ if (opline->extended_value & ZEND_LAST_CATCH) {
zend_rethrow_exception(execute_data);
HANDLE_EXCEPTION();
}
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
}
exception = EG(exception);
- ex = EX_VAR(opline->op2.var);
+ ex = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_ISREF_P(ex))) {
ex = Z_REFVAL_P(ex);
}
zval_ptr_dtor(ex);
ZVAL_OBJ(ex, EG(exception));
if (UNEXPECTED(EG(exception) != exception)) {
- GC_REFCOUNT(EG(exception))++;
+ GC_ADDREF(EG(exception));
HANDLE_EXCEPTION();
} else {
EG(exception) = NULL;
@@ -4143,7 +4180,21 @@ ZEND_VM_HOT_HANDLER(65, ZEND_SEND_VAL, CONST|TMPVAR, NUM)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
+ZEND_VM_COLD_HELPER(zend_cannot_pass_by_ref_helper, ANY, ANY)
+{
+ USE_OPLINE
+ zval *arg;
+ uint32_t arg_num = opline->op2.num;
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
+ FREE_UNFETCHED_OP1();
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_UNDEF(arg);
+ HANDLE_EXCEPTION();
+}
+
+ZEND_VM_HOT_SEND_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
{
USE_OPLINE
zval *value, *arg;
@@ -4156,12 +4207,7 @@ ZEND_VM_HOT_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
}
} else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
ZEND_VM_C_LABEL(send_val_by_ref):
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- FREE_UNFETCHED_OP1();
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper);
}
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -4192,15 +4238,14 @@ ZEND_VM_HOT_HANDLER(117, ZEND_SEND_VAR, VAR|CV, NUM)
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (OP1_TYPE == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (OP1_TYPE == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -4232,7 +4277,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
+ZEND_VM_HOT_SEND_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
{
USE_OPLINE
zend_free_op free_op1;
@@ -4290,18 +4335,16 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM)
if (Z_ISREF_P(varptr)) {
Z_ADDREF_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
} else {
- ZVAL_NEW_REF(arg, varptr);
- Z_ADDREF_P(arg);
- ZVAL_REF(varptr, Z_REF_P(arg));
+ ZVAL_MAKE_REF_EX(varptr, 2);
}
+ ZVAL_REF(arg, Z_REF_P(varptr));
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, NUM, SPEC(QUICK_ARG))
+ZEND_VM_HOT_SEND_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, NUM, SPEC(QUICK_ARG))
{
USE_OPLINE
zval *varptr, *arg;
@@ -4329,15 +4372,14 @@ ZEND_VM_C_LABEL(send_var_by_ref):
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (OP1_TYPE == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (OP1_TYPE == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -4350,6 +4392,55 @@ ZEND_VM_C_LABEL(send_var_by_ref):
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HOT_SEND_HANDLER(100, ZEND_CHECK_FUNC_ARG, UNUSED, NUM, SPEC(QUICK_ARG))
+{
+ USE_OPLINE
+ uint32_t arg_num = opline->op2.num;
+
+ if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ } else {
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ }
+ } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ } else {
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
+ZEND_VM_HOT_HANDLER(185, ZEND_SEND_FUNC_ARG, VAR, NUM)
+{
+ USE_OPLINE
+ zval *varptr, *arg;
+ zend_free_op free_op1;
+
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
+ }
+
+ varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+
+ if (UNEXPECTED(Z_ISREF_P(varptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(varptr);
+
+ varptr = Z_REFVAL_P(varptr);
+ ZVAL_COPY_VALUE(arg, varptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(arg)) {
+ Z_ADDREF_P(arg);
+ }
+ } else {
+ ZVAL_COPY_VALUE(arg, varptr);
+ }
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
{
USE_OPLINE
@@ -4395,17 +4486,19 @@ ZEND_VM_C_LABEL(send_again):
top = ZEND_CALL_ARG(EX(call), arg_num);
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- if (Z_REFCOUNT_P(args) == 1) {
- ZVAL_MAKE_REF(arg);
+ if (Z_ISREF_P(arg)) {
Z_ADDREF_P(arg);
ZVAL_REF(top, Z_REF_P(arg));
+ } else if (OP1_TYPE & (IS_VAR|IS_CV)) {
+ /* array is already separated above */
+ ZVAL_MAKE_REF_EX(arg, 2);
+ ZVAL_REF(top, Z_REF_P(arg));
} else {
- ZVAL_DUP(top, arg);
+ Z_TRY_ADDREF_P(arg);
+ ZVAL_NEW_REF(top, arg);
}
- } else if (Z_ISREF_P(arg)) {
- ZVAL_COPY(top, Z_REFVAL_P(arg));
} else {
- ZVAL_COPY(top, arg);
+ ZVAL_COPY_DEREF(top, arg);
}
ZEND_CALL_NUM_ARGS(EX(call))++;
@@ -4454,14 +4547,14 @@ ZEND_VM_C_LABEL(send_again):
break;
}
- if (Z_TYPE(key) == IS_STRING) {
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
zend_throw_error(NULL,
- "Cannot unpack Traversable with string keys");
- zend_string_release(Z_STR(key));
+ (Z_TYPE(key) == IS_STRING) ?
+ "Cannot unpack Traversable with string keys" :
+ "Cannot unpack Traversable with non-integer keys");
+ zval_ptr_dtor(&key);
break;
}
-
- zval_dtor(&key);
}
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
@@ -4519,7 +4612,7 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY, NUM)
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
- OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(call)->func));
}
if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
OBJ_RELEASE(Z_OBJ(EX(call)->This));
@@ -4564,13 +4657,7 @@ ZEND_VM_C_LABEL(send_array):
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
- zend_error(E_WARNING,
- "Parameter %d to %s%s%s() expected to be a reference, value given",
- arg_num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
-
+ zend_param_must_be_ref(EX(call)->func, arg_num);
}
}
} else {
@@ -4597,13 +4684,7 @@ ZEND_VM_C_LABEL(send_array):
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
- zend_error(E_WARNING,
- "Parameter %d to %s%s%s() expected to be a reference, value given",
- arg_num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
-
+ zend_param_must_be_ref(EX(call)->func, arg_num);
}
}
} else {
@@ -4635,11 +4716,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, CONST|TMP|VAR|CV, NUM)
param = ZEND_CALL_VAR(EX(call), opline->result.var);
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- opline->op2.num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
+ zend_param_must_be_ref(EX(call)->func, opline->op2.num);
}
ZVAL_COPY(param, arg);
@@ -4648,7 +4725,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, CONST|TMP|VAR|CV, NUM)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(63, ZEND_RECV, NUM, ANY)
+ZEND_VM_HOT_HANDLER(63, ZEND_RECV, NUM, UNUSED|CACHE_SLOT)
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
@@ -4658,7 +4735,7 @@ ZEND_VM_HANDLER(63, ZEND_RECV, NUM, ANY)
zend_missing_arg_error(execute_data);
HANDLE_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
+ zval *param = EX_VAR(opline->result.var);
SAVE_OPLINE();
if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
@@ -4669,7 +4746,7 @@ ZEND_VM_HANDLER(63, ZEND_RECV, NUM, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST)
+ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST, CACHE_SLOT)
{
USE_OPLINE
uint32_t arg_num;
@@ -4678,24 +4755,38 @@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST)
ZEND_VM_REPEATABLE_OPCODE
arg_num = opline->op1.num;
- param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
+ param = EX_VAR(opline->result.var);
if (arg_num > EX_NUM_ARGS()) {
- ZVAL_COPY(param, EX_CONSTANT(opline->op2));
- if (Z_OPT_CONSTANT_P(param)) {
- SAVE_OPLINE();
- if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor(param);
- ZVAL_UNDEF(param);
- HANDLE_EXCEPTION();
+ zval *default_value = RT_CONSTANT(opline, opline->op2);
+
+ if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
+ zval *cache_val = (zval*)CACHE_ADDR(Z_CACHE_SLOT_P(default_value));
+
+ /* we keep in cache only not refcounted values */
+ if (Z_TYPE_P(cache_val) != IS_UNDEF) {
+ ZVAL_COPY_VALUE(param, cache_val);
+ } else {
+ SAVE_OPLINE();
+ ZVAL_COPY(param, default_value);
+ if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
+ zval_ptr_dtor_nogc(param);
+ ZVAL_UNDEF(param);
+ HANDLE_EXCEPTION();
+ }
+ if (!Z_REFCOUNTED_P(param)) {
+ ZVAL_COPY_VALUE(cache_val, param);
+ }
}
+ } else {
+ ZVAL_COPY(param, default_value);
}
}
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *default_value = EX_CONSTANT(opline->op2);
+ zval *default_value = RT_CONSTANT(opline, opline->op2);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(Z_CACHE_SLOT_P(default_value))) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)) || EG(exception))) {
HANDLE_EXCEPTION();
}
}
@@ -4704,7 +4795,7 @@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, ANY)
+ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED|CACHE_SLOT)
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
@@ -4713,13 +4804,13 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, ANY)
SAVE_OPLINE();
- params = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
+ params = EX_VAR(opline->result.var);
if (arg_num <= arg_count) {
zval *param;
array_init_size(params, arg_count - arg_num + 1);
- zend_hash_real_init(Z_ARRVAL_P(params), 1);
+ zend_hash_real_init_packed(Z_ARRVAL_P(params));
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
@@ -4738,13 +4829,13 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, ANY)
}
} ZEND_HASH_FILL_END();
} else {
- array_init(params);
+ ZVAL_EMPTY_ARRAY(params);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zval *val;
@@ -4769,7 +4860,7 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(48, ZEND_CASE, TMPVAR, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -4798,17 +4889,7 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
FREE_OP2();
} else {
break;
@@ -4835,7 +4916,7 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
+ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
{
USE_OPLINE
zval *result;
@@ -4845,15 +4926,15 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
SAVE_OPLINE();
if (OP1_TYPE == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ CACHE_PTR(opline->op2.num, ce);
}
} else if (OP1_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -4907,7 +4988,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -4927,9 +5008,9 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
if (OP1_TYPE == IS_CONST ||
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
+ obj = Z_REFVAL_P(obj);
+ if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
+ break;
}
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -4985,78 +5066,45 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, UNUSED, CONST, CONST_FETCH)
+ZEND_VM_HOT_HANDLER(99, ZEND_FETCH_CONSTANT, UNUSED|CONST_FETCH, CONST, CACHE_SLOT)
{
USE_OPLINE
zend_constant *c;
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- c = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- } else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op2) + 1, opline->extended_value)) == NULL) {
- SAVE_OPLINE();
-
- if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
- char *actual = (char *)zend_memrchr(Z_STRVAL_P(EX_CONSTANT(opline->op2)), '\\', Z_STRLEN_P(EX_CONSTANT(opline->op2)));
- if (!actual) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_STR_P(EX_CONSTANT(opline->op2)));
- } else {
- actual++;
- ZVAL_STRINGL(EX_VAR(opline->result.var),
- actual, Z_STRLEN_P(EX_CONSTANT(opline->op2)) - (actual - Z_STRVAL_P(EX_CONSTANT(opline->op2))));
- }
- /* non-qualified constant - allow text substitution */
- zend_error(E_WARNING, "Use of undefined constant %s - assumed '%s' (this will throw an Error in a future version of PHP)",
- Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var)));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), c);
- }
-
-#ifdef ZTS
- if (c->flags & CONST_PERSISTENT) {
- ZVAL_DUP(EX_VAR(opline->result.var), &c->value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), &c->value);
+ c = CACHED_PTR(opline->extended_value);
+ if (EXPECTED(c != NULL) && EXPECTED(!IS_SPECIAL_CACHE_VAL(c))) {
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value);
+ ZEND_VM_NEXT_OPCODE();
}
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), &c->value);
-#endif
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST)
+ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST, CACHE_SLOT)
{
zend_class_entry *ce, *scope;
zend_class_constant *c;
- zval *value;
+ zval *value, *zv;
USE_OPLINE
SAVE_OPLINE();
do {
if (OP1_TYPE == IS_CONST) {
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-#ifdef ZTS
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
-#endif
+ if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
- } else if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ } else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+ ce = CACHED_PTR(opline->extended_value);
} else {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
} else {
if (OP1_TYPE == IS_UNUSED) {
@@ -5069,48 +5117,38 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
} else {
ce = Z_CE_P(EX_VAR(opline->op1.var));
}
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
}
}
- if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ if (EXPECTED(zv != NULL)) {
+ c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
if (!zend_verify_const_access(c, scope)) {
- zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
value = &c->value;
- if (Z_CONSTANT_P(value)) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
zval_update_constant_ex(value, c->ce);
if (UNEXPECTED(EG(exception) != NULL)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
}
- if (OP1_TYPE == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), value);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
- }
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
} else {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
} while (0);
-#ifdef ZTS
- if (ce->type == ZEND_INTERNAL_CLASS) {
- ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), value);
-#endif
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
ZEND_VM_NEXT_OPCODE();
}
@@ -5125,28 +5163,27 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE
if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
FREE_OP1_VAR_PTR();
} else {
expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE == IS_TMP_VAR) {
/* pass */
} else if (OP1_TYPE == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (OP1_TYPE == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (OP1_TYPE == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -5197,14 +5234,14 @@ ZEND_VM_C_LABEL(num_index):
str = ZSTR_EMPTY_ALLOC();
ZEND_VM_C_GOTO(str_index);
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
FREE_OP2();
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5219,28 +5256,25 @@ ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|
array = EX_VAR(opline->result.var);
if (OP1_TYPE != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (OP1_TYPE != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
}
-ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
+ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
{
USE_OPLINE
zend_free_op free_op1;
zval *expr;
zval *result = EX_VAR(opline->result.var);
+ HashTable *ht;
SAVE_OPLINE();
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -5279,16 +5313,29 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
- ZVAL_NEW_ARR(result);
- zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (OP1_TYPE == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
+ ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
if (OP1_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
} else {
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -5296,19 +5343,22 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
convert_to_array(result);
}
} else {
- if (Z_TYPE_P(expr) != IS_ARRAY) {
- object_init(result);
- if (Z_TYPE_P(expr) != IS_NULL) {
- expr = zend_hash_add_new(Z_OBJPROP_P(result), ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (OP1_TYPE == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
+ ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
+ if (Z_TYPE_P(expr) == IS_ARRAY) {
+ ht = zend_symtable_to_proptable(Z_ARR_P(expr));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ /* TODO: try not to duplicate immutable arrays as well ??? */
+ ht = zend_array_dup(ht);
+ }
+ Z_OBJ_P(result)->properties = ht;
+ } else if (Z_TYPE_P(expr) != IS_NULL) {
+ Z_OBJ_P(result)->properties = ht = zend_new_array(1);
+ expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
+ if (OP1_TYPE == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
+ } else {
+ if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
- } else {
- ZVAL_COPY(result, expr);
- convert_to_object(result);
}
}
}
@@ -5381,8 +5431,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
} else if (RETURN_VALUE_USED(opline)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
}
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
@@ -5395,8 +5444,8 @@ ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
ZVAL_UNDEF(var);
SAVE_OPLINE();
- if (!--GC_REFCOUNT(garbage)) {
- zval_dtor_func(garbage);
+ if (!GC_DELREF(garbage)) {
+ rc_dtor_func(garbage);
} else {
gc_check_possible_root(garbage);
}
@@ -5410,7 +5459,8 @@ ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
zend_free_op free_op1;
@@ -5418,76 +5468,77 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
- ZVAL_UNDEF(&tmp);
- if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+ 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)) {
varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ zend_hash_del_ind(target_symbol_table, name);
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (OP1_TYPE != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
zend_free_op free_op1;
SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
-
- ZVAL_UNDEF(&tmp);
- if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (OP2_TYPE == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- FREE_OP1();
+ FREE_UNFETCHED_OP1();
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ /*CACHE_PTR(opline->extended_value, ce);*/
}
} else if (OP2_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- FREE_OP1();
+ FREE_UNFETCHED_OP1();
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (OP1_TYPE != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5571,8 +5622,11 @@ ZEND_VM_C_LABEL(num_index_dim):
}
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
} else {
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
}
} else if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -5585,7 +5639,7 @@ ZEND_VM_C_LABEL(num_index_dim):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -5611,11 +5665,9 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
@@ -5653,7 +5705,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -5662,52 +5714,13 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
FREE_OP1_IF_VAR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- FREE_OP1();
- if (iter) {
- OBJ_RELEASE(&iter->std);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- FREE_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -5721,7 +5734,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
}
}
-ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -5752,13 +5765,15 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
array_ptr = Z_REFVAL_P(array_ref);
}
if (OP1_TYPE == IS_CONST) {
- zval_copy_ctor_func(array_ptr);
+ ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
} else {
SEPARATE_ARRAY(array_ptr);
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
- FREE_OP1_VAR_PTR();
+ if (OP1_TYPE == IS_VAR) {
+ FREE_OP1_VAR_PTR();
+ }
ZEND_VM_NEXT_OPCODE();
} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -5776,7 +5791,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -5785,54 +5800,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1();
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1();
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (OP1_TYPE == IS_VAR) {
- FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1();
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (OP1_TYPE == IS_VAR) {
FREE_OP1_VAR_PTR();
@@ -5842,8 +5810,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -5880,7 +5847,9 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
while (1) {
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
/* reached end of iteration */
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
+ZEND_VM_C_LABEL(fe_fetch_r_exit):
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
}
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
@@ -5899,20 +5868,21 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
p++;
}
Z_FE_POS_P(array) = pos + 1;
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (!p->key) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else {
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
}
}
- } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
+ } else {
zend_object_iterator *iter;
+ ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
if ((iter = zend_iterator_unwrap(array)) == NULL) {
/* plain object */
- fe_ht = Z_OBJPROP_P(array);
+ fe_ht = Z_OBJPROP_P(array);
pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
p = fe_ht->arData + pos;
while (1) {
@@ -5938,7 +5908,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (UNEXPECTED(!p->key)) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else if (ZSTR_VAL(p->key)[0]) {
@@ -5951,10 +5921,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos + 1;
} else {
if (EXPECTED(++iter->index > 0)) {
/* This could cause an endless loop if index becomes zero again.
@@ -5982,7 +5949,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
/* failure in get_current_data */
ZEND_VM_C_GOTO(fe_fetch_r_exit);
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (iter->funcs->get_current_key) {
iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -5995,27 +5962,18 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
}
value_type = Z_TYPE_INFO_P(value);
}
- } else {
- zend_error(E_WARNING, "Invalid argument supplied for foreach()");
- if (UNEXPECTED(EG(exception))) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-ZEND_VM_C_LABEL(fe_fetch_r_exit):
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
}
if (EXPECTED(OP2_TYPE == IS_CV)) {
- zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ zval *variable_ptr = EX_VAR(opline->op2.var);
zend_assign_to_variable(variable_ptr, value, IS_CV);
} else {
zval *res = EX_VAR(opline->op2.var);
zend_refcounted *gc = Z_COUNTED_P(value);
ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
- if (EXPECTED((value_type & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0)) {
- GC_REFCOUNT(gc)++;
+ if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
+ GC_ADDREF(gc);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6060,24 +6018,21 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (!p->key) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else {
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
} else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
zend_object_iterator *iter;
if ((iter = zend_iterator_unwrap(array)) == NULL) {
/* plain object */
- fe_ht = Z_OBJPROP_P(array);
+ fe_ht = Z_OBJPROP_P(array);
pos = zend_hash_iterator_pos(Z_FE_ITER_P(EX_VAR(opline->op1.var)), fe_ht);
p = fe_ht->arData + pos;
while (1) {
@@ -6103,7 +6058,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (UNEXPECTED(!p->key)) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else if (ZSTR_VAL(p->key)[0]) {
@@ -6116,10 +6071,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
} else {
if (++iter->index > 0) {
/* This could cause an endless loop if index becomes zero again.
@@ -6147,7 +6099,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
/* failure in get_current_data */
ZEND_VM_C_GOTO(fe_fetch_w_exit);
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (iter->funcs->get_current_key) {
iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -6179,12 +6131,12 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
ZVAL_COPY_VALUE_EX(ref, value, gc, value_type);
}
if (EXPECTED(OP2_TYPE == IS_CV)) {
- zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ zval *variable_ptr = EX_VAR(opline->op2.var);
if (EXPECTED(variable_ptr != value)) {
zend_reference *ref;
ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+ GC_ADDREF(ref);
zval_ptr_dtor(variable_ptr);
ZVAL_REF(variable_ptr, ref);
}
@@ -6195,18 +6147,18 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET)
+ZEND_VM_HOT_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET, SPEC(ISSET))
{
USE_OPLINE
zval *value;
int result;
value = EX_VAR(opline->op1.var);
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result =
Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
SAVE_OPLINE();
result = !i_zend_is_true(value);
if (UNEXPECTED(EG(exception))) {
@@ -6216,8 +6168,7 @@ ZEND_VM_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET)
}
ZEND_VM_SMART_BRANCH(result, 0);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ISSET)
@@ -6226,30 +6177,40 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
zval *value;
int result;
zend_free_op free_op1;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
SAVE_OPLINE();
varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- ZVAL_UNDEF(&tmp);
- if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ if (OP1_TYPE == IS_CONST) {
+ name = Z_STR_P(varname);
+ } else {
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ value = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (OP1_TYPE != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
FREE_OP1();
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
+ if (!value) {
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ if (Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ }
+ result = Z_TYPE_P(value) > IS_NULL;
+ } else {
+ result = !i_zend_is_true(value);
+ }
}
ZEND_VM_SMART_BRANCH(result, 1);
@@ -6257,51 +6218,38 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, ISSET)
+ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, ISSET|CACHE_SLOT)
{
USE_OPLINE
zval *value;
int result;
zend_free_op free_op1;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- ZVAL_UNDEF(&tmp);
- if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (OP2_TYPE == IS_CONST) {
- if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ } 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)), 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ 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));
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- FREE_OP1();
+ FREE_UNFETCHED_OP1();
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
@@ -6309,35 +6257,36 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
if (OP1_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ 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);
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result = value && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = !value || !i_zend_is_true(value);
}
@@ -6346,7 +6295,7 @@ ZEND_VM_C_LABEL(is_static_prop_return):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|CV, CONST|TMPVAR|CV, ISSET)
+ZEND_VM_COLD_CONSTCONST_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|CV, CONST|TMPVAR|CV, ISSET)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -6374,8 +6323,7 @@ ZEND_VM_C_LABEL(isset_again):
ZEND_VM_C_GOTO(num_index_prop);
}
}
-ZEND_VM_C_LABEL(str_index_prop):
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, OP2_TYPE == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
ZEND_VM_C_LABEL(num_index_prop):
@@ -6383,91 +6331,32 @@ ZEND_VM_C_LABEL(num_index_prop):
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
ZEND_VM_C_GOTO(isset_again);
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- ZEND_VM_C_GOTO(num_index_prop);
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index_prop);
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- ZEND_VM_C_GOTO(num_index_prop);
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- ZEND_VM_C_GOTO(num_index_prop);
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- ZEND_VM_C_GOTO(num_index_prop);
- } else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- ZEND_VM_C_GOTO(str_index_prop);
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- ZEND_VM_C_GOTO(isset_not_found);
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
ZEND_VM_C_GOTO(isset_dim_obj_exit);
- } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
ZEND_VM_C_GOTO(isset_dim_obj_array);
}
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- ZEND_VM_C_GOTO(isset_not_found);
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-ZEND_VM_C_LABEL(isset_str_offset):
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- ZEND_VM_C_GOTO(isset_not_found);
- }
- } else {
- if (OP2_TYPE & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- ZEND_VM_C_GOTO(isset_str_offset);
- }
- ZEND_VM_C_GOTO(isset_not_found);
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-ZEND_VM_C_LABEL(isset_not_found):
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
ZEND_VM_C_LABEL(isset_dim_obj_exit):
@@ -6478,7 +6367,7 @@ ZEND_VM_C_LABEL(isset_dim_obj_exit):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, ISSET)
+ZEND_VM_COLD_CONST_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, ISSET|CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -6507,15 +6396,13 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, C
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
ZEND_VM_C_LABEL(isset_no_object):
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
FREE_OP2();
@@ -6525,7 +6412,7 @@ ZEND_VM_C_LABEL(isset_no_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY)
+ZEND_VM_COLD_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY)
{
USE_OPLINE
@@ -6545,7 +6432,7 @@ ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY)
break;
}
}
- zend_print_variable(ptr);
+ zend_print_zval(ptr, 0);
}
} while (0);
FREE_OP1();
@@ -6564,9 +6451,9 @@ ZEND_VM_HANDLER(57, ZEND_BEGIN_SILENCE, ANY, ANY)
do {
EG(error_reporting) = 0;
if (!EG(error_reporting_ini_entry)) {
- zend_ini_entry *p = zend_hash_find_ptr(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING));
- if (p) {
- EG(error_reporting_ini_entry) = p;
+ zval *zv = zend_hash_find_ex(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), 1);
+ if (zv) {
+ EG(error_reporting_ini_entry) = (zend_ini_entry *)Z_PTR_P(zv);
} else {
break;
}
@@ -6597,7 +6484,7 @@ ZEND_VM_HANDLER(58, ZEND_END_SILENCE, TMP, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -6634,21 +6521,20 @@ ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
} else if (OP1_TYPE == IS_VAR && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
FREE_OP1();
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -6658,8 +6544,8 @@ ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && Z_ISREF_P(value)) {
- if (OP1_TYPE == IS_VAR) {
+ if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if (OP1_TYPE & IS_VAR) {
ref = value;
}
value = Z_REFVAL_P(value);
@@ -6672,17 +6558,16 @@ ZEND_VM_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
} else if (OP1_TYPE == IS_CV) {
if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (OP1_TYPE == IS_VAR && ref) {
+ } else if ((OP1_TYPE & IS_VAR) && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
FREE_OP1();
@@ -6705,8 +6590,7 @@ ZEND_VM_HOT_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
}
if (OP1_TYPE == IS_CV) {
- ZVAL_DEREF(value);
- ZVAL_COPY(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (OP1_TYPE == IS_VAR) {
if (UNEXPECTED(Z_ISREF_P(value))) {
ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
@@ -6729,7 +6613,7 @@ ZEND_VM_HOT_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
+ZEND_VM_COLD_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
{
USE_OPLINE
@@ -6741,7 +6625,7 @@ ZEND_VM_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
+ZEND_VM_COLD_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
{
USE_OPLINE
@@ -6753,7 +6637,7 @@ ZEND_VM_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
+ZEND_VM_COLD_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
{
USE_OPLINE
@@ -6765,7 +6649,7 @@ ZEND_VM_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY)
+ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, CONST, ANY)
{
USE_OPLINE
@@ -6774,38 +6658,56 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, VAR)
+ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, CONST, CONST)
{
+ zend_class_entry *parent;
USE_OPLINE
SAVE_OPLINE();
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->op2.var)), 0);
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, VAR)
+ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, CONST, CONST)
{
USE_OPLINE
zval *zce, *orig_zce;
+ zend_class_entry *parent;
SAVE_OPLINE();
- if ((zce = zend_hash_find(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)))) == NULL ||
- ((orig_zce = zend_hash_find(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)+1))) != NULL &&
+ if ((zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1)) == NULL ||
+ ((orig_zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)+1), 1)) != NULL &&
Z_CE_P(zce) != Z_CE_P(orig_zce))) {
- do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->op2.var)), 0);
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR)
{
+ zval *zv;
zend_class_entry *ce;
USE_OPLINE
SAVE_OPLINE();
- ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
Z_CE_P(EX_VAR(opline->result.var)) = ce;
- ZEND_ASSERT(ce != NULL);
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
@@ -6819,22 +6721,32 @@ ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, ANY, VAR, JMP_ADDR)
+ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, CONST, CONST, JMP_ADDR)
{
- zend_class_entry *ce;
+ zval *zv;
+ zend_class_entry *ce, *parent;
USE_OPLINE
SAVE_OPLINE();
- ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
Z_CE_P(EX_VAR(opline->result.var)) = ce;
- ZEND_ASSERT(ce != NULL);
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
ZEND_VM_CONTINUE();
}
- zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->op2.var)));
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+
+ zend_do_inheritance(ce, parent);
ce->ce_flags |= ZEND_ACC_ANON_BOUND;
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -6863,7 +6775,7 @@ ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY, NUM)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
+ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1;
@@ -6878,11 +6790,11 @@ ZEND_VM_C_LABEL(try_instanceof):
zend_class_entry *ce;
if (OP2_TYPE == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ CACHE_PTR(opline->extended_value, ce);
}
}
} else if (OP2_TYPE == IS_UNUSED) {
@@ -6912,34 +6824,31 @@ ZEND_VM_C_LABEL(try_instanceof):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
+ZEND_VM_HOT_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(0, ZEND_NOP, ANY, ANY)
+ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST)
+ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST, CACHE_SLOT)
{
USE_OPLINE
zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
zend_class_entry *iface;
SAVE_OPLINE();
- iface = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ iface = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE);
if (UNEXPECTED(iface == NULL)) {
- iface = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE);
- if (UNEXPECTED(iface == NULL)) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), iface);
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
@@ -6950,25 +6859,22 @@ ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY)
+ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY, CACHE_SLOT)
{
USE_OPLINE
zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
zend_class_entry *trait;
SAVE_OPLINE();
- trait = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ trait = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_TRAIT);
if (UNEXPECTED(trait == NULL)) {
- trait = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)),
- EX_CONSTANT(opline->op2) + 1,
- ZEND_FETCH_CLASS_TRAIT);
- if (UNEXPECTED(trait == NULL)) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
- zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), trait);
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
+ zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
}
zend_do_implement_trait(ce, trait);
@@ -6999,8 +6905,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
if (op_num < try_catch->catch_op && ex) {
/* Go to catch block */
cleanup_live_vars(execute_data, op_num, try_catch->catch_op);
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[try_catch->catch_op]);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0);
} else if (op_num < try_catch->finally_op) {
/* Go to finally block */
@@ -7008,17 +6913,16 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
cleanup_live_vars(execute_data, op_num, try_catch->finally_op);
Z_OBJ_P(fast_call) = EG(exception);
EG(exception) = NULL;
- fast_call->u2.lineno = (uint32_t)-1;
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[try_catch->finally_op]);
- ZEND_VM_CONTINUE();
+ Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
+ ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0);
} else if (op_num < try_catch->finally_end) {
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
/* cleanup incomplete RETURN statement */
- if (fast_call->u2.lineno != (uint32_t)-1
- && (EX(func)->op_array.opcodes[fast_call->u2.lineno].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[fast_call->u2.lineno].op2.var);
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
+ && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
+ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
zval_ptr_dtor(return_value);
}
@@ -7054,16 +6958,15 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
int i, current_try_catch_offset = -1;
- {
- const zend_op *exc_opline = EG(opline_before_exception);
- if ((exc_opline->opcode == ZEND_FREE || exc_opline->opcode == ZEND_FE_FREE)
- && exc_opline->extended_value & ZEND_FREE_ON_RETURN) {
- /* exceptions thrown because of loop var destruction on return/break/...
- * are logically thrown at the end of the foreach loop, so adjust the
- * throw_op_num.
- */
- throw_op_num = EX(func)->op_array.live_range[exc_opline->op2.num].end;
- }
+ if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
+ && throw_op->extended_value & ZEND_FREE_ON_RETURN) {
+ /* exceptions thrown because of loop var destruction on return/break/...
+ * are logically thrown at the end of the foreach loop, so adjust the
+ * throw_op_num.
+ */
+ const zend_live_range *range = find_live_range(
+ &EX(func)->op_array, throw_op_num, throw_op->op1.var);
+ throw_op_num = range->end;
}
/* Find the innermost try/catch/finally the exception was thrown in */
@@ -7157,15 +7060,15 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
ZVAL_COPY(&c.value, val);
if (Z_OPT_CONSTANT(c.value)) {
if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor(&c.value);
+ zval_ptr_dtor_nogc(&c.value);
FREE_OP1();
FREE_OP2();
HANDLE_EXCEPTION();
}
}
- c.flags = CONST_CS; /* non persistent, case sensetive */
- c.name = zend_string_dup(Z_STR_P(name), 0);
- c.module_number = PHP_USER_CONSTANT;
+ /* non persistent, case sensitive */
+ ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, PHP_USER_CONSTANT);
+ c.name = zend_string_copy(Z_STR_P(name));
if (zend_register_constant(&c) == FAILURE) {
}
@@ -7181,10 +7084,20 @@ ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
zval *zfunc;
zval *object;
zend_class_entry *called_scope;
+ zend_function *fbc;
- zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
+ fbc = Z_PTR_P(zfunc);
+ if (fbc->common.fn_flags & ZEND_ACC_IMMUTABLE) {
+ zend_function *new_func = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+
+ memcpy(new_func, fbc, sizeof(zend_op_array));
+ new_func->common.fn_flags &= ~ZEND_ACC_IMMUTABLE;
+ Z_PTR_P(zfunc) = fbc = new_func;
+ }
+
if (Z_TYPE(EX(This)) == IS_OBJECT) {
called_scope = Z_OBJCE(EX(This));
if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
@@ -7218,6 +7131,18 @@ ZEND_VM_HANDLER(156, ZEND_SEPARATE, VAR, UNUSED)
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_COLD_HELPER(zend_yield_in_closed_generator_helper, ANY, ANY)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
+ FREE_UNFETCHED_OP2();
+ FREE_UNFETCHED_OP1();
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+}
+
ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSED, SRC)
{
USE_OPLINE
@@ -7226,11 +7151,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_yield_in_closed_generator_helper);
}
/* Destroy the previously yielded value */
@@ -7268,10 +7189,15 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
FREE_OP1_VAR_PTR();
}
@@ -7469,9 +7395,9 @@ ZEND_VM_HANDLER(159, ZEND_DISCARD_EXCEPTION, ANY, ANY)
SAVE_OPLINE();
/* cleanup incomplete RETURN statement */
- if (fast_call->u2.lineno != (uint32_t)-1
- && (EX(func)->op_array.opcodes[fast_call->u2.lineno].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[fast_call->u2.lineno].op2.var);
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
+ && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
+ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
zval_ptr_dtor(return_value);
}
@@ -7493,9 +7419,8 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, JMP_ADDR, ANY)
Z_OBJ_P(fast_call) = NULL;
/* set return address */
- fast_call->u2.lineno = opline - EX(func)->op_array.opcodes;
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1));
- ZEND_VM_CONTINUE();
+ Z_OPLINE_NUM_P(fast_call) = opline - EX(func)->op_array.opcodes;
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
}
ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH)
@@ -7504,11 +7429,10 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH)
zval *fast_call = EX_VAR(opline->op1.var);
uint32_t current_try_catch_offset, current_op_num;
- if (fast_call->u2.lineno != (uint32_t)-1) {
- const zend_op *fast_ret = EX(func)->op_array.opcodes + fast_call->u2.lineno;
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1) {
+ const zend_op *fast_ret = EX(func)->op_array.opcodes + Z_OPLINE_NUM_P(fast_call);
- ZEND_VM_SET_OPCODE(fast_ret + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(fast_ret + 1, 0);
}
/* special case for unhandled exceptions */
@@ -7519,14 +7443,14 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, TRY_CATCH)
ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, current_op_num);
}
-ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST)
+ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *varname;
zval *value;
zval *variable_ptr;
- uint32_t idx;
+ uintptr_t idx;
zend_reference *ref;
ZEND_VM_REPEATABLE_OPCODE
@@ -7534,32 +7458,31 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST)
varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- idx = (uint32_t)(uintptr_t)CACHED_PTR(Z_CACHE_SLOT_P(varname)) - 1;
- if (EXPECTED(idx < EG(symbol_table).nNumUsed)) {
- Bucket *p = EG(symbol_table).arData + idx;
+ idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
+ if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
(EXPECTED(p->key == Z_STR_P(varname)) ||
(EXPECTED(p->h == ZSTR_H(Z_STR_P(varname))) &&
EXPECTED(p->key != NULL) &&
- EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(varname)) &&
- EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(varname), Z_STRLEN_P(varname)) == 0)))) {
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) {
- value = &EG(symbol_table).arData[idx].val;
+ value = (zval*)p; /* value = &p->val; */
ZEND_VM_C_GOTO(check_indirect);
}
}
- value = zend_hash_find(&EG(symbol_table), Z_STR_P(varname));
+ value = zend_hash_find_ex(&EG(symbol_table), Z_STR_P(varname), 1);
if (UNEXPECTED(value == NULL)) {
value = zend_hash_add_new(&EG(symbol_table), Z_STR_P(varname), &EG(uninitialized_zval));
- idx = ((char*)value - (char*)EG(symbol_table).arData) / sizeof(Bucket);
+ idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(Z_CACHE_SLOT_P(varname), (void*)(uintptr_t)(idx + 1));
+ CACHE_PTR(opline->extended_value, (void*)(idx + 1));
} else {
- idx = ((char*)value - (char*)EG(symbol_table).arData) / sizeof(Bucket);
+ idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(Z_CACHE_SLOT_P(varname), (void*)(uintptr_t)(idx + 1));
+ CACHE_PTR(opline->extended_value, (void*)(idx + 1));
ZEND_VM_C_LABEL(check_indirect):
/* GLOBAL variable may be an INDIRECT pointer to CV */
if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
@@ -7571,27 +7494,23 @@ ZEND_VM_C_LABEL(check_indirect):
}
if (UNEXPECTED(!Z_ISREF_P(value))) {
- ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_REFCOUNT(ref) = 2;
- GC_TYPE_INFO(ref) = IS_REFERENCE;
- ZVAL_COPY_VALUE(&ref->val, value);
- Z_REF_P(value) = ref;
- Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+ ZVAL_MAKE_REF_EX(value, 2);
+ ref = Z_REF_P(value);
} else {
ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+ GC_ADDREF(ref);
}
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(variable_ptr);
- uint32_t refcnt = --GC_REFCOUNT(ref);
+ uint32_t refcnt = GC_DELREF(ref);
if (EXPECTED(variable_ptr != value)) {
if (refcnt == 0) {
SAVE_OPLINE();
- zval_dtor_func(ref);
+ rc_dtor_func(ref);
if (UNEXPECTED(EG(exception))) {
ZVAL_NULL(variable_ptr);
HANDLE_EXCEPTION();
@@ -7607,7 +7526,7 @@ ZEND_VM_C_LABEL(check_indirect):
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zval *value;
@@ -7656,49 +7575,70 @@ ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY, TYPE)
+ZEND_VM_HOT_NOCONST_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMPVAR|CV, ANY, TYPE_MASK)
{
USE_OPLINE
zval *value;
int result = 0;
zend_free_op free_op1;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) {
- if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) {
- const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value));
-
- if (EXPECTED(type_name != NULL)) {
- result = 1;
- }
- } else {
+ value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+ZEND_VM_C_LABEL(type_check_resource):
+ if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
+ || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
result = 1;
}
- } else if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
+ } else if ((OP1_TYPE & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+ ZEND_VM_C_GOTO(type_check_resource);
+ }
+ } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+ result = ((1 << IS_NULL) & opline->extended_value) != 0;
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
}
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(122, ZEND_DEFINED, CONST, ANY)
+ZEND_VM_HOT_HANDLER(122, ZEND_DEFINED, CONST, ANY, CACHE_SLOT)
{
USE_OPLINE
zend_constant *c;
int result;
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- result = 1;
- } else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op1), 0)) == NULL) {
- result = 0;
- } else {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), c);
- result = 1;
- }
+ c = CACHED_PTR(opline->extended_value);
+ do {
+ if (EXPECTED(c != NULL)) {
+ if (!IS_SPECIAL_CACHE_VAL(c)) {
+ result = 1;
+ break;
+ } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
+ result = 0;
+ break;
+ }
+ }
+ if (zend_quick_check_constant(RT_CONSTANT(opline, opline->op1) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ CACHE_PTR(opline->extended_value, ENCODE_SPECIAL_CACHE_NUM(zend_hash_num_elements(EG(zend_constants))));
+ result = 0;
+ } else {
+ result = 1;
+ }
+ } while (0);
ZEND_VM_SMART_BRANCH(result, 0);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE();
@@ -7713,20 +7653,19 @@ ZEND_VM_HANDLER(151, ZEND_ASSERT_CHECK, ANY, JMP_ADDR)
if (RETURN_VALUE_USED(opline)) {
ZVAL_TRUE(EX_VAR(opline->result.var));
}
- ZEND_VM_SET_OPCODE(target);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(target, 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
}
-ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, ANY, ANY, CLASS_FETCH)
+ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, UNUSED|CLASS_FETCH, ANY)
{
uint32_t fetch_type;
zend_class_entry *called_scope, *scope;
USE_OPLINE
- fetch_type = opline->extended_value;
+ fetch_type = opline->op1.num;
scope = EX(func)->op_array.scope;
if (UNEXPECTED(scope == NULL)) {
@@ -7773,17 +7712,15 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
uint32_t num_args = EX_NUM_ARGS();
zend_execute_data *call;
- USE_OPLINE
SAVE_OPLINE();
- args = emalloc(sizeof(zend_array));
- zend_hash_init(args, num_args, NULL, ZVAL_PTR_DTOR, 0);
if (num_args) {
zval *p = ZEND_CALL_ARG(execute_data, 1);
zval *end = p + num_args;
- zend_hash_real_init(args, 1);
+ args = zend_new_array(num_args);
+ zend_hash_real_init_packed(args);
ZEND_HASH_FILL_PACKED(args) {
do {
ZEND_HASH_FILL_ADD(p);
@@ -7795,13 +7732,16 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
call = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- ZEND_ASSERT(zend_vm_calc_used_stack(2, fbc->common.prototype) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
-
- call->func = fbc->common.prototype;
+ call->func = (fbc->op_array.fn_flags & ZEND_ACC_STATIC) ? fbc->op_array.scope->__callstatic : fbc->op_array.scope->__call;
+ ZEND_ASSERT(zend_vm_calc_used_stack(2, call->func) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
ZEND_CALL_NUM_ARGS(call) = 2;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
- ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
+ if (num_args) {
+ ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
+ } else {
+ ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
+ }
zend_free_trampoline(fbc);
fbc = call->func;
@@ -7809,10 +7749,14 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ LOAD_OPLINE();
+ ZEND_VM_ENTER_EX();
} else {
+ execute_data = EX(prev_execute_data);
+ LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
@@ -7845,10 +7789,12 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
}
#if ZEND_DEBUG
- ZEND_ASSERT(
- EG(exception) || !call->func ||
- !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (!EG(exception) && call->func) {
+ ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_verify_internal_return_type(call->func, ret));
+ ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+ }
#endif
EG(current_execute_data) = call->prev_execute_data;
@@ -7867,8 +7813,6 @@ ZEND_VM_C_LABEL(call_trampoline_end):
ZEND_VM_RETURN();
}
- opline = EX(opline);
-
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
zend_object *object = Z_OBJ(call->This);
OBJ_RELEASE(object);
@@ -7880,6 +7824,7 @@ ZEND_VM_C_LABEL(call_trampoline_end):
HANDLE_EXCEPTION_LEAVE();
}
+ LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
}
@@ -7889,14 +7834,16 @@ ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *closure, *var;
- zend_string *var_name;
closure = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (opline->extended_value) {
+ if (opline->extended_value & ZEND_BIND_REF) {
/* By-ref binding */
var = GET_OP2_ZVAL_PTR(BP_VAR_W);
- ZVAL_MAKE_REF(var);
- Z_ADDREF_P(var);
+ if (Z_ISREF_P(var)) {
+ Z_ADDREF_P(var);
+ } else {
+ ZVAL_MAKE_REF_EX(var, 2);
+ }
} else {
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
if (UNEXPECTED(Z_ISUNDEF_P(var))) {
@@ -7910,17 +7857,15 @@ ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
Z_TRY_ADDREF_P(var);
}
- var_name = CV_DEF_OF(EX_VAR_TO_NUM(opline->op2.var));
- zend_closure_bind_var(closure, var_name, var);
+ zend_closure_bind_var_ex(closure, (opline->extended_value & ~ZEND_BIND_REF), var);
ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+ zend_free_op free_op1;
HashTable *ht;
- zval *varname;
zval *value;
zval *variable_ptr;
@@ -7931,16 +7876,15 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
ZEND_ASSERT(ht != NULL);
if (GC_REFCOUNT(ht) > 1) {
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(ht)--;
+ GC_DELREF(ht);
}
EX(func)->op_array.static_variables = ht = zend_array_dup(ht);
}
- varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
- value = zend_hash_find(ht, Z_STR_P(varname));
+ value = (zval*)((char*)ht->arData + (opline->extended_value & ~ZEND_BIND_REF));
- if (opline->extended_value) {
- if (Z_CONSTANT_P(value)) {
+ if (opline->extended_value & ZEND_BIND_REF) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
SAVE_OPLINE();
if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
ZVAL_NULL(variable_ptr);
@@ -7949,7 +7893,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
}
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_REFCOUNT(ref) = 2;
+ GC_SET_REFCOUNT(ref, 2);
GC_TYPE_INFO(ref) = IS_REFERENCE;
ZVAL_COPY_VALUE(&ref->val, value);
Z_REF_P(value) = ref;
@@ -7986,9 +7930,8 @@ ZEND_VM_HANDLER(186, ZEND_ISSET_ISEMPTY_THIS, UNUSED, UNUSED)
USE_OPLINE
ZVAL_BOOL(EX_VAR(opline->result.var),
- (opline->extended_value & ZEND_ISSET) ?
- (Z_TYPE(EX(This)) == IS_OBJECT) :
- (Z_TYPE(EX(This)) != IS_OBJECT));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ (Z_TYPE(EX(This)) == IS_OBJECT));
ZEND_VM_NEXT_OPCODE();
}
@@ -8017,15 +7960,20 @@ ZEND_VM_HANDLER(51, ZEND_MAKE_REF, VAR|CV, UNUSED)
ZVAL_NULL(Z_REFVAL_P(op1));
ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
} else {
- ZVAL_MAKE_REF(op1);
- ZVAL_COPY(EX_VAR(opline->result.var), op1);
+ if (Z_ISREF_P(op1)) {
+ Z_ADDREF_P(op1);
+ } else {
+ ZVAL_MAKE_REF_EX(op1, 2);
+ }
+ ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
op1 = Z_INDIRECT_P(op1);
if (EXPECTED(!Z_ISREF_P(op1))) {
- ZVAL_MAKE_REF(op1);
+ ZVAL_MAKE_REF_EX(op1, 2);
+ } else {
+ GC_ADDREF(Z_REF_P(op1));
}
- GC_REFCOUNT(Z_REF_P(op1))++;
ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
@@ -8033,7 +7981,7 @@ ZEND_VM_HANDLER(51, ZEND_MAKE_REF, VAR|CV, UNUSED)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(187, ZEND_SWITCH_LONG, CONST|TMPVAR|CV, CONST, JMP_ADDR)
+ZEND_VM_COLD_CONSTCONST_HANDLER(187, ZEND_SWITCH_LONG, CONST|TMPVARCV, CONST, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -8062,7 +8010,7 @@ ZEND_VM_HANDLER(187, ZEND_SWITCH_LONG, CONST|TMPVAR|CV, CONST, JMP_ADDR)
}
}
-ZEND_VM_HANDLER(188, ZEND_SWITCH_STRING, CONST|TMPVAR|CV, CONST, JMP_ADDR)
+ZEND_VM_COLD_CONSTCONST_HANDLER(188, ZEND_SWITCH_STRING, CONST|TMPVARCV, CONST, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -8073,14 +8021,19 @@ ZEND_VM_HANDLER(188, ZEND_SWITCH_STRING, CONST|TMPVAR|CV, CONST, JMP_ADDR)
jumptable = Z_ARRVAL_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
if (Z_TYPE_P(op) != IS_STRING) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_STRING) {
+ if (OP1_TYPE == IS_CONST) {
/* Wrong type, fall back to ZEND_CASE chain */
ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZVAL_DEREF(op);
+ if (Z_TYPE_P(op) != IS_STRING) {
+ /* Wrong type, fall back to ZEND_CASE chain */
+ ZEND_VM_NEXT_OPCODE();
+ }
}
}
- jump_zv = zend_hash_find(jumptable, Z_STR_P(op));
+ jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), OP1_TYPE == IS_CONST);
if (jump_zv != NULL) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
ZEND_VM_CONTINUE();
@@ -8091,12 +8044,12 @@ ZEND_VM_HANDLER(188, ZEND_SWITCH_STRING, CONST|TMPVAR|CV, CONST, JMP_ADDR)
}
}
-ZEND_VM_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM)
+ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM)
{
USE_OPLINE
zend_free_op free_op1;
zval *op1;
- HashTable *ht = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
int result;
SAVE_OPLINE();
@@ -8131,7 +8084,7 @@ ZEND_VM_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
{
USE_OPLINE
zend_free_op free_op1;
@@ -8177,7 +8130,7 @@ ZEND_VM_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMP|VAR|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMP|VAR|CV, UNUSED)
{
USE_OPLINE
@@ -8227,7 +8180,7 @@ ZEND_VM_HANDLER(192, ZEND_GET_CALLED_CLASS, UNUSED, UNUSED)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(193, ZEND_GET_TYPE, CONST|TMP|VAR|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(193, ZEND_GET_TYPE, CONST|TMP|VAR|CV, UNUSED)
{
USE_OPLINE
zend_free_op free_op1;
@@ -8262,7 +8215,7 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
arg_count = EX_NUM_ARGS();
if (OP1_TYPE == IS_CONST) {
- skip = Z_LVAL_P(EX_CONSTANT(opline->op1));
+ skip = Z_LVAL_P(RT_CONSTANT(opline, opline->op1));
if (arg_count < skip) {
result_size = 0;
} else {
@@ -8273,13 +8226,12 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
result_size = arg_count;
}
- ht = (zend_array *) emalloc(sizeof(zend_array));
- zend_hash_init(ht, result_size, NULL, ZVAL_PTR_DTOR, 0);
- ZVAL_ARR(EX_VAR(opline->result.var), ht);
-
if (result_size) {
uint32_t first_extra_arg = EX(func)->op_array.num_args;
- zend_hash_real_init(ht, 1);
+
+ ht = zend_new_array(result_size);
+ ZVAL_ARR(EX_VAR(opline->result.var), ht);
+ zend_hash_real_init_packed(ht);
ZEND_HASH_FILL_PACKED(ht) {
zval *p, *q;
uint32_t i = skip;
@@ -8322,10 +8274,20 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
}
} ZEND_HASH_FILL_END();
ht->nNumOfElements = result_size;
+ } else {
+ ZVAL_EMPTY_ARRAY(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_JMP, (OP_JMP_ADDR(op, op->op1) > op), ZEND_JMP_FORWARD, JMP_ADDR, ANY)
+{
+ USE_OPLINE
+
+ OPLINE = OP_JMP_ADDR(opline, opline->op1);
+ ZEND_VM_CONTINUE();
+}
+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_ADD, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_ADD_LONG_NO_OVERFLOW, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(NO_CONST_CONST,COMMUTATIVE))
{
USE_OPLINE
@@ -8662,10 +8624,11 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DO
zval *var_ptr;
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
} else {
+ ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
Z_DVAL_P(var_ptr)++;
}
ZEND_VM_NEXT_OPCODE();
@@ -8699,10 +8662,11 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DO
zval *var_ptr;
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
} else {
+ ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
Z_DVAL_P(var_ptr)--;
}
ZEND_VM_NEXT_OPCODE();
@@ -8719,7 +8683,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_DOUBLE), ZEND_
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))), ZEND_QM_ASSIGN_NOREF, CONST|TMPVARCV, ANY)
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, ((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))))), ZEND_QM_ASSIGN_NOREF, CONST|TMPVARCV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -8730,12 +8694,13 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (!(op1_info & ((MAY_BE_ANY|MAY_BE_
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FETCH_DIM_R, (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))), ZEND_FETCH_DIM_R_INDEX, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FETCH_DIM_R, (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))), ZEND_FETCH_DIM_R_INDEX, CONST|TMPVAR|CV, CONST|TMPVARCV, SPEC(NO_CONST_CONST))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *container, *dim, *value;
zend_long offset;
+ HashTable *ht;
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -8746,8 +8711,9 @@ ZEND_VM_C_LABEL(fetch_dim_r_index_array):
} else {
offset = zval_get_long(dim);
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, ZEND_VM_C_LABEL(fetch_dim_r_index_undef));
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, ZEND_VM_C_LABEL(fetch_dim_r_index_undef));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
FREE_OP1();
@@ -8765,7 +8731,10 @@ ZEND_VM_C_LABEL(fetch_dim_r_index_array):
} else {
ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
+ if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -8773,7 +8742,7 @@ ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
ZEND_VM_C_LABEL(fetch_dim_r_index_undef):
ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ zend_undefined_offset(offset);
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -8796,19 +8765,14 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR, (op1_info & (MAY_BE_UNDEF|MAY_BE_RE
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM, SPEC(QUICK_ARG))
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM)
{
USE_OPLINE
zval *varptr, *arg;
zend_free_op free_op1;
uint32_t arg_num = opline->op2.num;
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_C_GOTO(send_var_by_ref_simple);
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-ZEND_VM_C_LABEL(send_var_by_ref_simple):
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
}
@@ -8824,6 +8788,34 @@ ZEND_VM_C_LABEL(send_var_by_ref_simple):
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL, op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_SIMPLE, CONST, NUM)
+{
+ USE_OPLINE
+ zval *value, *arg;
+ zend_free_op free_op1;
+
+ value = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_COPY_VALUE(arg, value);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAL_EX, op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)), ZEND_SEND_VAL_EX_SIMPLE, CONST, NUM)
+{
+ USE_OPLINE
+ zval *value, *arg;
+ zend_free_op free_op1;
+ uint32_t arg_num = opline->op2.num;
+
+ if (QUICK_ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_VM_DISPATCH_TO_HELPER(zend_cannot_pass_by_ref_helper);
+ }
+ value = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_COPY_VALUE(arg, value);
+ ZEND_VM_NEXT_OPCODE();
+}
+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY, ZEND_FE_FETCH_R_SIMPLE, VAR, CV, JMP_ADDR, SPEC(RETVAL))
{
USE_OPLINE
@@ -8870,7 +8862,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
}
}
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op2.var);
zend_assign_to_variable(variable_ptr, value, IS_CV);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 28fc5dabe4..b29f5bddc6 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -12,9 +12,9 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
@@ -307,6 +307,7 @@ static zend_uchar zend_user_opcodes[256] = {0,
};
#define SPEC_START_MASK 0x0000ffff
+#define SPEC_EXTRA_MASK 0xfffc0000
#define SPEC_RULE_OP1 0x00010000
#define SPEC_RULE_OP2 0x00020000
#define SPEC_RULE_OP_DATA 0x00040000
@@ -314,15 +315,19 @@ static zend_uchar zend_user_opcodes[256] = {0,
#define SPEC_RULE_QUICK_ARG 0x00100000
#define SPEC_RULE_SMART_BRANCH 0x00200000
#define SPEC_RULE_DIM_OBJ 0x00400000
+#define SPEC_RULE_COMMUTATIVE 0x00800000
+#define SPEC_RULE_ISSET 0x01000000
static const uint32_t *zend_spec_handlers;
-static const void **zend_opcode_handlers;
+static const void * const *zend_opcode_handlers;
static int zend_handlers_count;
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
-static const void **zend_opcode_handler_funcs;
+static const void * const * zend_opcode_handler_funcs;
static zend_op hybrid_halt_op;
#endif
+#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC
static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op);
+#endif
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend_op* op);
@@ -330,6 +335,15 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
# define zend_vm_get_opcode_handler_func zend_vm_get_opcode_handler
#endif
+#ifndef VM_TRACE
+# define VM_TRACE(op)
+#endif
+#ifndef VM_TRACE_START
+# define VM_TRACE_START()
+#endif
+#ifndef VM_TRACE_END
+# define VM_TRACE_END()
+#endif
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
#define HYBRID_NEXT() goto *(void**)(OPLINE->handler)
#define HYBRID_SWITCH() HYBRID_NEXT();
@@ -360,10 +374,12 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
# endif
# if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
# define ZEND_VM_RETURN() opline = &hybrid_halt_op; return
-# define ZEND_VM_HOT zend_always_inline
+# define ZEND_VM_HOT zend_always_inline ZEND_COLD ZEND_OPT_SIZE
+# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE
# else
# define ZEND_VM_RETURN() opline = NULL; return
# define ZEND_VM_HOT
+# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE
# endif
#else
# define ZEND_OPCODE_HANDLER_RET int
@@ -371,6 +387,7 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
# define ZEND_VM_CONTINUE() return 0
# define ZEND_VM_RETURN() return -1
# define ZEND_VM_HOT
+# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE
#endif
typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);
@@ -400,12 +417,15 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H
#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()
#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()
#if defined(ZEND_VM_FP_GLOBAL_REG)
-# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()
+# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()
+# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()
# define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()
#elif defined(ZEND_VM_IP_GLOBAL_REG)
-# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; return 1
+# define ZEND_VM_ENTER_EX() return 1
+# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; ZEND_VM_ENTER_EX()
# define ZEND_VM_LEAVE() return 2
#else
+# define ZEND_VM_ENTER_EX() return 1
# define ZEND_VM_ENTER() return 1
# define ZEND_VM_LEAVE() return 2
#endif
@@ -414,7 +434,19 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H
#define ZEND_VM_DISPATCH(opcode, opline) ZEND_VM_TAIL_CALL(((opcode_handler_t)zend_vm_get_opcode_handler_func(opcode, opline))(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);
+
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
+
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -428,6 +460,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_this_not_in_object_context_hel
HANDLE_EXCEPTION();
}
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_abstract_method_helper_SPEC(zend_function *fbc ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+}
+
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(zval *function_name ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ HANDLE_EXCEPTION();
+}
+
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use temporary expression in write context");
+ FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
+
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use [] for reading");
+ FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
zend_execute_data *old_execute_data;
@@ -444,12 +517,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
#else
if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
EG(vm_stack_top) = (zval*)execute_data;
execute_data = EX(prev_execute_data);
@@ -480,12 +553,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
#else
if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
old_execute_data = execute_data;
@@ -526,7 +599,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
}
EG(current_execute_data) = EX(prev_execute_data);
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
- OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
ZEND_VM_RETURN();
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
@@ -553,8 +626,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SPEC_HANDLER(Z
{
USE_OPLINE
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -577,11 +649,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
fbc->internal_function.handler(call, ret);
#if ZEND_DEBUG
- ZEND_ASSERT(
- EG(exception) || !call->func ||
- !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT(!Z_ISREF_P(ret));
+ if (!EG(exception) && call->func) {
+ ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_verify_internal_return_type(call->func, ret));
+ ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+ }
#endif
EG(current_execute_data) = execute_data;
@@ -621,11 +694,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
fbc->internal_function.handler(call, ret);
#if ZEND_DEBUG
- ZEND_ASSERT(
- EG(exception) || !call->func ||
- !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
- ZEND_ASSERT(!Z_ISREF_P(ret));
+ if (!EG(exception) && call->func) {
+ ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_verify_internal_return_type(call->func, ret));
+ ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+ }
#endif
EG(current_execute_data) = execute_data;
@@ -662,9 +736,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -684,9 +760,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -707,18 +785,17 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
} else {
zval retval;
ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -785,18 +862,17 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+ LOAD_OPLINE();
- ZEND_VM_ENTER();
+ ZEND_VM_ENTER_EX();
} else {
zval retval;
ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -857,15 +933,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
EX(call) = call->prev_execute_data;
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -873,8 +944,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
}
- LOAD_OPLINE();
-
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
ret = NULL;
if (0) {
@@ -883,11 +952,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ LOAD_OPLINE();
+ ZEND_VM_ENTER_EX();
} else {
+ execute_data = EX(prev_execute_data);
+ LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
@@ -954,7 +1027,7 @@ fcall_end:
#else
if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
@@ -982,15 +1055,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
EX(call) = call->prev_execute_data;
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
- zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
- fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "",
- fbc->common.scope ? "::" : "",
- ZSTR_VAL(fbc->common.function_name));
+ zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -998,8 +1066,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
}
- LOAD_OPLINE();
-
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
ret = NULL;
if (1) {
@@ -1008,11 +1074,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
call->prev_execute_data = execute_data;
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ LOAD_OPLINE();
+ ZEND_VM_ENTER_EX();
} else {
+ execute_data = EX(prev_execute_data);
+ LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
@@ -1079,7 +1149,7 @@ fcall_end:
#else
if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
#endif
- GC_REFCOUNT(object)--;
+ GC_DELREF(object);
zend_object_store_ctor_failed(object);
}
OBJ_RELEASE(object);
@@ -1171,6 +1241,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(
}
}
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *arg;
+ uint32_t arg_num = opline->op2.num;
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_UNDEF(arg);
+ HANDLE_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1216,17 +1300,19 @@ send_again:
top = ZEND_CALL_ARG(EX(call), arg_num);
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- if (Z_REFCOUNT_P(args) == 1) {
- ZVAL_MAKE_REF(arg);
+ if (Z_ISREF_P(arg)) {
Z_ADDREF_P(arg);
ZVAL_REF(top, Z_REF_P(arg));
+ } else if (opline->op1_type & (IS_VAR|IS_CV)) {
+ /* array is already separated above */
+ ZVAL_MAKE_REF_EX(arg, 2);
+ ZVAL_REF(top, Z_REF_P(arg));
} else {
- ZVAL_DUP(top, arg);
+ Z_TRY_ADDREF_P(arg);
+ ZVAL_NEW_REF(top, arg);
}
- } else if (Z_ISREF_P(arg)) {
- ZVAL_COPY(top, Z_REFVAL_P(arg));
} else {
- ZVAL_COPY(top, arg);
+ ZVAL_COPY_DEREF(top, arg);
}
ZEND_CALL_NUM_ARGS(EX(call))++;
@@ -1275,14 +1361,14 @@ send_again:
break;
}
- if (Z_TYPE(key) == IS_STRING) {
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
zend_throw_error(NULL,
- "Cannot unpack Traversable with string keys");
- zend_string_release(Z_STR(key));
+ (Z_TYPE(key) == IS_STRING) ?
+ "Cannot unpack Traversable with string keys" :
+ "Cannot unpack Traversable with non-integer keys");
+ zval_ptr_dtor(&key);
break;
}
-
- zval_dtor(&key);
}
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
@@ -1340,7 +1426,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_O
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
- OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(call)->func));
}
if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
OBJ_RELEASE(Z_OBJ(EX(call)->This));
@@ -1385,13 +1471,7 @@ send_array:
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
- zend_error(E_WARNING,
- "Parameter %d to %s%s%s() expected to be a reference, value given",
- arg_num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
-
+ zend_param_must_be_ref(EX(call)->func, arg_num);
}
}
} else {
@@ -1418,13 +1498,7 @@ send_array:
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
/* By-value send is not allowed -- emit a warning,
* but still perform the call. */
- zend_error(E_WARNING,
- "Parameter %d to %s%s%s() expected to be a reference, value given",
- arg_num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
-
+ zend_param_must_be_ref(EX(call)->func, arg_num);
}
}
} else {
@@ -1445,67 +1519,6 @@ send_array:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- uint32_t arg_num = opline->op1.num;
-
- if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
- SAVE_OPLINE();
- zend_missing_arg_error(execute_data);
- HANDLE_EXCEPTION();
- } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
-
- SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
- HANDLE_EXCEPTION();
- }
- }
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX_NUM_ARGS();
- zval *params;
-
- SAVE_OPLINE();
-
- params = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
-
- if (arg_num <= arg_count) {
- zval *param;
-
- array_init_size(params, arg_count - arg_num + 1);
- zend_hash_real_init(Z_ARRVAL_P(params), 1);
- ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
- param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- do {
- zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num));
- if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
- ZEND_HASH_FILL_ADD(param);
- param++;
- } while (++arg_num <= arg_count);
- } else {
- do {
- if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
- ZEND_HASH_FILL_ADD(param);
- param++;
- } while (++arg_num <= arg_count);
- }
- } ZEND_HASH_FILL_END();
- } else {
- array_init(params);
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1516,9 +1529,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEN
do {
EG(error_reporting) = 0;
if (!EG(error_reporting_ini_entry)) {
- zend_ini_entry *p = zend_hash_find_ptr(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING));
- if (p) {
- EG(error_reporting_ini_entry) = p;
+ zval *zv = zend_hash_find_ex(EG(ini_directives), ZSTR_KNOWN(ZEND_STR_ERROR_REPORTING), 1);
+ if (zv) {
+ EG(error_reporting_ini_entry) = (zend_ini_entry *)Z_PTR_P(zv);
} else {
break;
}
@@ -1539,7 +1552,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1551,7 +1564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPC
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1563,7 +1576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(Z
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1575,24 +1588,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+ zval *zv;
zend_class_entry *ce;
USE_OPLINE
SAVE_OPLINE();
- ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
Z_CE_P(EX_VAR(opline->result.var)) = ce;
- ZEND_ASSERT(ce != NULL);
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
@@ -1630,14 +1636,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1651,18 +1657,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OP
zend_class_entry *trait;
SAVE_OPLINE();
- trait = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ trait = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_TRAIT);
if (UNEXPECTED(trait == NULL)) {
- trait = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)),
- EX_CONSTANT(opline->op2) + 1,
- ZEND_FETCH_CLASS_TRAIT);
- if (UNEXPECTED(trait == NULL)) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
- zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), trait);
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
+ zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
}
zend_do_implement_trait(ce, trait);
@@ -1693,8 +1696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_hel
if (op_num < try_catch->catch_op && ex) {
/* Go to catch block */
cleanup_live_vars(execute_data, op_num, try_catch->catch_op);
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[try_catch->catch_op]);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->catch_op], 0);
} else if (op_num < try_catch->finally_op) {
/* Go to finally block */
@@ -1702,17 +1704,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_hel
cleanup_live_vars(execute_data, op_num, try_catch->finally_op);
Z_OBJ_P(fast_call) = EG(exception);
EG(exception) = NULL;
- fast_call->u2.lineno = (uint32_t)-1;
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[try_catch->finally_op]);
- ZEND_VM_CONTINUE();
+ Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
+ ZEND_VM_JMP_EX(&EX(func)->op_array.opcodes[try_catch->finally_op], 0);
} else if (op_num < try_catch->finally_end) {
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[try_catch->finally_end].op1.var);
/* cleanup incomplete RETURN statement */
- if (fast_call->u2.lineno != (uint32_t)-1
- && (EX(func)->op_array.opcodes[fast_call->u2.lineno].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[fast_call->u2.lineno].op2.var);
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
+ && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
+ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
zval_ptr_dtor(return_value);
}
@@ -1748,16 +1749,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
int i, current_try_catch_offset = -1;
- {
- const zend_op *exc_opline = EG(opline_before_exception);
- if ((exc_opline->opcode == ZEND_FREE || exc_opline->opcode == ZEND_FE_FREE)
- && exc_opline->extended_value & ZEND_FREE_ON_RETURN) {
- /* exceptions thrown because of loop var destruction on return/break/...
- * are logically thrown at the end of the foreach loop, so adjust the
- * throw_op_num.
- */
- throw_op_num = EX(func)->op_array.live_range[exc_opline->op2.num].end;
- }
+ if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
+ && throw_op->extended_value & ZEND_FREE_ON_RETURN) {
+ /* exceptions thrown because of loop var destruction on return/break/...
+ * are logically thrown at the end of the foreach loop, so adjust the
+ * throw_op_num.
+ */
+ const zend_live_range *range = find_live_range(
+ &EX(func)->op_array, throw_op_num, throw_op->op1.var);
+ throw_op_num = range->end;
}
/* Find the innermost try/catch/finally the exception was thrown in */
@@ -1836,6 +1836,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_
}
}
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
+ FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DISCARD_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1843,9 +1855,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DISCARD_EXCEPTION_SPEC_HANDLER
SAVE_OPLINE();
/* cleanup incomplete RETURN statement */
- if (fast_call->u2.lineno != (uint32_t)-1
- && (EX(func)->op_array.opcodes[fast_call->u2.lineno].op2_type & (IS_TMP_VAR | IS_VAR))) {
- zval *return_value = EX_VAR(EX(func)->op_array.opcodes[fast_call->u2.lineno].op2.var);
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1
+ && (EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2_type & (IS_TMP_VAR | IS_VAR))) {
+ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var);
zval_ptr_dtor(return_value);
}
@@ -1867,9 +1879,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CALL_SPEC_HANDLER(ZEND_OP
Z_OBJ_P(fast_call) = NULL;
/* set return address */
- fast_call->u2.lineno = opline - EX(func)->op_array.opcodes;
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1));
- ZEND_VM_CONTINUE();
+ Z_OPLINE_NUM_P(fast_call) = opline - EX(func)->op_array.opcodes;
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op1), 0);
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -1878,11 +1889,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPC
zval *fast_call = EX_VAR(opline->op1.var);
uint32_t current_try_catch_offset, current_op_num;
- if (fast_call->u2.lineno != (uint32_t)-1) {
- const zend_op *fast_ret = EX(func)->op_array.opcodes + fast_call->u2.lineno;
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t)-1) {
+ const zend_op *fast_ret = EX(func)->op_array.opcodes + Z_OPLINE_NUM_P(fast_call);
- ZEND_VM_SET_OPCODE(fast_ret + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(fast_ret + 1, 0);
}
/* special case for unhandled exceptions */
@@ -1902,58 +1912,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND
if (RETURN_VALUE_USED(opline)) {
ZVAL_TRUE(EX_VAR(opline->result.var));
}
- ZEND_VM_SET_OPCODE(target);
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(target, 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- uint32_t fetch_type;
- zend_class_entry *called_scope, *scope;
- USE_OPLINE
-
- fetch_type = opline->extended_value;
-
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(scope == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot use \"%s\" when no class scope is active",
- fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
- fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- switch (fetch_type) {
- case ZEND_FETCH_CLASS_SELF:
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
- break;
- case ZEND_FETCH_CLASS_PARENT:
- if (UNEXPECTED(scope->parent == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL,
- "Cannot use \"parent\" when current class scope has no parent");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
- break;
- case ZEND_FETCH_CLASS_STATIC:
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- called_scope = Z_OBJCE(EX(This));
- } else {
- called_scope = Z_CE(EX(This));
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_array *args;
@@ -1962,17 +1926,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
uint32_t num_args = EX_NUM_ARGS();
zend_execute_data *call;
- USE_OPLINE
SAVE_OPLINE();
- args = emalloc(sizeof(zend_array));
- zend_hash_init(args, num_args, NULL, ZVAL_PTR_DTOR, 0);
if (num_args) {
zval *p = ZEND_CALL_ARG(execute_data, 1);
zval *end = p + num_args;
- zend_hash_real_init(args, 1);
+ args = zend_new_array(num_args);
+ zend_hash_real_init_packed(args);
ZEND_HASH_FILL_PACKED(args) {
do {
ZEND_HASH_FILL_ADD(p);
@@ -1984,13 +1946,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
call = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- ZEND_ASSERT(zend_vm_calc_used_stack(2, fbc->common.prototype) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
-
- call->func = fbc->common.prototype;
+ call->func = (fbc->op_array.fn_flags & ZEND_ACC_STATIC) ? fbc->op_array.scope->__callstatic : fbc->op_array.scope->__call;
+ ZEND_ASSERT(zend_vm_calc_used_stack(2, call->func) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
ZEND_CALL_NUM_ARGS(call) = 2;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
- ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
+ if (num_args) {
+ ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
+ } else {
+ ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
+ }
zend_free_trampoline(fbc);
fbc = call->func;
@@ -1998,10 +1963,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
- i_init_func_execute_data(call, &fbc->op_array, ret);
+ execute_data = call;
+ i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ LOAD_OPLINE();
+ ZEND_VM_ENTER_EX();
} else {
+ execute_data = EX(prev_execute_data);
+ LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
@@ -2034,10 +2003,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
}
#if ZEND_DEBUG
- ZEND_ASSERT(
- EG(exception) || !call->func ||
- !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (!EG(exception) && call->func) {
+ ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_verify_internal_return_type(call->func, ret));
+ ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+ }
#endif
EG(current_execute_data) = call->prev_execute_data;
@@ -2056,8 +2027,6 @@ call_trampoline_end:
ZEND_VM_RETURN();
}
- opline = EX(opline);
-
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
zend_object *object = Z_OBJ(call->This);
OBJ_RELEASE(object);
@@ -2069,10 +2038,19 @@ call_trampoline_end:
HANDLE_EXCEPTION_LEAVE();
}
+ LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
}
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_FORWARD_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ OPLINE = OP_JMP_ADDR(opline, opline->op1);
+ ZEND_VM_CONTINUE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
EG(vm_interrupt) = 0;
@@ -2085,48 +2063,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPC
}
ZEND_VM_CONTINUE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_CONST == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = EX_CONSTANT(opline->op2);
-
-try_class_name:
- if (IS_CONST == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), EX_CONSTANT(opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2134,20 +2070,18 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME
zval *function_name, *func;
zend_execute_data *call;
- function_name = (zval*)EX_CONSTANT(opline->op2);
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(function_name+1));
+ function_name = (zval*)RT_CONSTANT(opline, opline->op2);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(function_name+1), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(function_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
fbc = Z_FUNC_P(func);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL);
@@ -2165,7 +2099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_H
zend_execute_data *call;
SAVE_OPLINE();
- function_name = EX_CONSTANT(opline->op2);
+ function_name = RT_CONSTANT(opline, opline->op2);
try_function_name:
if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
@@ -2196,7 +2130,7 @@ try_function_name:
if (UNEXPECTED(EG(exception))) {
if (call) {
if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release(call->func->common.function_name);
+ zend_string_release_ex(call->func->common.function_name, 0);
zend_free_trampoline(call->func);
}
zend_vm_stack_free_call_frame(call);
@@ -2213,7 +2147,7 @@ try_function_name:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *func_name;
@@ -2221,24 +2155,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON
zend_function *fbc;
zend_execute_data *call;
- func_name = EX_CONSTANT(opline->op2) + 1;
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(func_name));
+ func_name = (zval *)RT_CONSTANT(opline, opline->op2);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 1), 1);
if (func == NULL) {
- func_name++;
- func = zend_hash_find(EG(function_table), Z_STR_P(func_name));
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(func_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
}
fbc = Z_FUNC_P(func);
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
@@ -2253,24 +2184,23 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CO
{
USE_OPLINE
- zval *fname = EX_CONSTANT(opline->op2);
+ zval *fname;
zval *func;
zend_function *fbc;
zend_execute_data *call;
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
+ fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- func = zend_hash_find(EG(function_table), Z_STR_P(fname));
+ fname = RT_CONSTANT(opline, opline->op2);
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
if (UNEXPECTED(func == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(fname));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(fname ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
fbc = Z_FUNC_P(func);
- CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ fbc = init_func_run_time_cache_ex(func);
}
+ CACHE_PTR(opline->result.num, fbc);
}
call = zend_vm_stack_push_call_frame_ex(
@@ -2291,24 +2221,38 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CON
ZEND_VM_REPEATABLE_OPCODE
arg_num = opline->op1.num;
- param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
+ param = EX_VAR(opline->result.var);
if (arg_num > EX_NUM_ARGS()) {
- ZVAL_COPY(param, EX_CONSTANT(opline->op2));
- if (Z_OPT_CONSTANT_P(param)) {
- SAVE_OPLINE();
- if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor(param);
- ZVAL_UNDEF(param);
- HANDLE_EXCEPTION();
+ zval *default_value = RT_CONSTANT(opline, opline->op2);
+
+ if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
+ zval *cache_val = (zval*)CACHE_ADDR(Z_CACHE_SLOT_P(default_value));
+
+ /* we keep in cache only not refcounted values */
+ if (Z_TYPE_P(cache_val) != IS_UNDEF) {
+ ZVAL_COPY_VALUE(param, cache_val);
+ } else {
+ SAVE_OPLINE();
+ ZVAL_COPY(param, default_value);
+ if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
+ zval_ptr_dtor_nogc(param);
+ ZVAL_UNDEF(param);
+ HANDLE_EXCEPTION();
+ }
+ if (!Z_REFCOUNTED_P(param)) {
+ ZVAL_COPY_VALUE(cache_val, param);
+ }
}
+ } else {
+ ZVAL_COPY(param, default_value);
}
}
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *default_value = EX_CONSTANT(opline->op2);
+ zval *default_value = RT_CONSTANT(opline, opline->op2);
SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(Z_CACHE_SLOT_P(default_value))) || EG(exception))) {
+ if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)) || EG(exception))) {
HANDLE_EXCEPTION();
}
}
@@ -2324,13 +2268,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDL
zend_class_entry *iface;
SAVE_OPLINE();
- iface = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ iface = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE);
if (UNEXPECTED(iface == NULL)) {
- iface = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_INTERFACE);
- if (UNEXPECTED(iface == NULL)) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), iface);
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
@@ -2341,155 +2282,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDL
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->op2.var)), 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *zce, *orig_zce;
-
- SAVE_OPLINE();
- if ((zce = zend_hash_find(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)))) == NULL ||
- ((orig_zce = zend_hash_find(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)+1))) != NULL &&
- Z_CE_P(zce) != Z_CE_P(orig_zce))) {
- do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->op2.var)), 0);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zend_class_entry *ce;
- USE_OPLINE
-
- SAVE_OPLINE();
- ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op1)));
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- ZEND_ASSERT(ce != NULL);
-
- if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
-
- zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->op2.var)));
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_UNUSED == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = NULL;
-
-try_class_name:
- if (IS_UNUSED == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), EX_CONSTANT(opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_CV == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
-
-try_class_name:
- if (IS_CV == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), EX_CONSTANT(opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *function_name;
zend_execute_data *call;
SAVE_OPLINE();
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
try_function_name:
- if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
call = zend_init_dynamic_call_string(Z_STR_P(function_name), opline->extended_value);
- } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
call = zend_init_dynamic_call_object(function_name, opline->extended_value);
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY)) {
call = zend_init_dynamic_call_array(Z_ARRVAL_P(function_name), opline->extended_value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
function_name = Z_REFVAL_P(function_name);
goto try_function_name;
} else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -2503,11 +2317,12 @@ try_function_name:
HANDLE_EXCEPTION();
}
- if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+ zval_ptr_dtor_nogc(free_op2);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
if (UNEXPECTED(EG(exception))) {
if (call) {
if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release(call->func->common.function_name);
+ zend_string_release_ex(call->func->common.function_name, 0);
zend_free_trampoline(call->func);
}
zend_vm_stack_free_call_frame(call);
@@ -2524,71 +2339,89 @@ try_function_name:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ uint32_t arg_num = opline->op1.num;
+
+ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
+ SAVE_OPLINE();
+ zend_missing_arg_error(execute_data);
+ HANDLE_EXCEPTION();
+ } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ zval *param = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ }
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ uint32_t arg_num = opline->op1.num;
+ uint32_t arg_count = EX_NUM_ARGS();
+ zval *params;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_free_op free_op2;
- zval *class_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-try_class_name:
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
+ params = EX_VAR(opline->result.var);
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), EX_CONSTANT(opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
+ if (arg_num <= arg_count) {
+ zval *param;
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ array_init_size(params, arg_count - arg_num + 1);
+ zend_hash_real_init_packed(Z_ARRVAL_P(params));
+ ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
+ param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ do {
+ zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num));
+ if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
+ ZEND_HASH_FILL_ADD(param);
+ param++;
+ } while (++arg_num <= arg_count);
+ } else {
+ do {
+ if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);
+ ZEND_HASH_FILL_ADD(param);
+ param++;
+ } while (++arg_num <= arg_count);
+ }
+ } ZEND_HASH_FILL_END();
+ } else {
+ ZVAL_EMPTY_ARRAY(params);
}
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+
zval *function_name;
zend_execute_data *call;
SAVE_OPLINE();
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ function_name = EX_VAR(opline->op2.var);
try_function_name:
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
call = zend_init_dynamic_call_string(Z_STR_P(function_name), opline->extended_value);
- } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
+ } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT)) {
call = zend_init_dynamic_call_object(function_name, opline->extended_value);
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY)) {
call = zend_init_dynamic_call_array(Z_ARRVAL_P(function_name), opline->extended_value);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(function_name) == IS_REFERENCE)) {
function_name = Z_REFVAL_P(function_name);
goto try_function_name;
} else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -2602,12 +2435,11 @@ try_function_name:
HANDLE_EXCEPTION();
}
- zval_ptr_dtor_nogc(free_op2);
- if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
+ if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
if (UNEXPECTED(EG(exception))) {
if (call) {
if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
- zend_string_release(call->func->common.function_name);
+ zend_string_release_ex(call->func->common.function_name, 0);
zend_free_trampoline(call->func);
}
zend_vm_stack_free_call_frame(call);
@@ -2624,13 +2456,13 @@ try_function_name:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
ZEND_VM_NEXT_OPCODE();
@@ -2638,18 +2470,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND
SAVE_OPLINE();
bitwise_not_function(EX_VAR(opline->result.var),
- EX_CONSTANT(opline->op1));
+ RT_CONSTANT(opline, opline->op1));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
@@ -2675,7 +2507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_O
zval *z;
SAVE_OPLINE();
- z = EX_CONSTANT(opline->op1);
+ z = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_P(z) == IS_STRING) {
zend_string *str = Z_STR_P(z);
@@ -2684,39 +2516,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_O
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
}
} else {
- zend_string *str = _zval_get_string_func(z);
+ zend_string *str = zval_get_string_func(z);
if (ZSTR_LEN(str) != 0) {
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(z, BP_VAR_R);
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2729,25 +2560,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HA
ZEND_VM_JMP(opline);
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
@@ -2760,13 +2591,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_H
ZEND_VM_JMP(opline);
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
@@ -2775,11 +2606,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2792,14 +2623,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_
ZEND_VM_JMP(opline);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
int ret;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
@@ -2809,11 +2640,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEN
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -2829,19 +2660,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEN
ZEND_VM_JMP(opline);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
int ret;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
@@ -2873,7 +2703,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
zval *return_value;
zend_free_op free_op1;
- retval_ptr = EX_CONSTANT(opline->op1);
+ retval_ptr = RT_CONSTANT(opline, opline->op1);
return_value = EX(return_value);
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
SAVE_OPLINE();
@@ -2885,7 +2715,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
SAVE_OPLINE();
- zval_dtor_func(Z_COUNTED_P(free_op1));
+ rc_dtor_func(Z_COUNTED_P(free_op1));
}
}
} else {
@@ -2918,7 +2748,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
retval_ptr = Z_REFVAL_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
Z_ADDREF_P(retval_ptr);
@@ -2931,7 +2761,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *retval_ptr;
@@ -2945,7 +2775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDL
/* Not supposed to happen, but we'll allow it */
zend_error(E_NOTICE, "Only variable references should be returned by reference");
- retval_ptr = EX_CONSTANT(opline->op1);
+ retval_ptr = RT_CONSTANT(opline, opline->op1);
if (!EX(return_value)) {
} else {
@@ -2956,7 +2786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDL
ZVAL_NEW_REF(EX(return_value), retval_ptr);
if (IS_CONST == IS_CONST) {
- if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
+ Z_TRY_ADDREF_P(retval_ptr);
}
}
break;
@@ -2978,8 +2808,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDL
}
if (EX(return_value)) {
- ZVAL_MAKE_REF(retval_ptr);
- Z_ADDREF_P(retval_ptr);
+ if (Z_ISREF_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(retval_ptr, 2);
+ }
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
}
@@ -2997,7 +2830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HA
zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
SAVE_OPLINE();
- retval = EX_CONSTANT(opline->op1);
+ retval = RT_CONSTANT(opline, opline->op1);
/* Copy return value into generator->retval */
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
@@ -3008,15 +2841,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HA
}
}
} else if (IS_CONST == IS_CV) {
- ZVAL_DEREF(retval);
- ZVAL_COPY(&generator->retval, retval);
+ ZVAL_COPY_DEREF(&generator->retval, retval);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval))) {
zend_refcounted *ref = Z_COUNTED_P(retval);
retval = Z_REFVAL_P(retval);
ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval)) {
Z_ADDREF_P(retval);
@@ -3033,14 +2865,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HA
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
do {
if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
@@ -3064,7 +2896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_
zend_exception_save();
if (IS_CONST != IS_TMP_VAR) {
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
}
zend_throw_exception_object(value);
@@ -3073,13 +2905,66 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_
HANDLE_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_class_entry *ce, *catch_ce;
+ zend_object *exception;
+ zval *ex;
+
+ SAVE_OPLINE();
+ /* Check whether an exception has been thrown, if not, jump over code */
+ zend_exception_restore();
+ if (EG(exception) == NULL) {
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+ catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
+ if (UNEXPECTED(catch_ce == NULL)) {
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+
+ CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
+ }
+ ce = EG(exception)->ce;
+
+#ifdef HAVE_DTRACE
+ if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
+ DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
+ }
+#endif /* HAVE_DTRACE */
+
+ if (ce != catch_ce) {
+ if (!catch_ce || !instanceof_function(ce, catch_ce)) {
+ if (opline->extended_value & ZEND_LAST_CATCH) {
+ zend_rethrow_exception(execute_data);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+ }
+
+ exception = EG(exception);
+ ex = EX_VAR(opline->result.var);
+ if (UNEXPECTED(Z_ISREF_P(ex))) {
+ ex = Z_REFVAL_P(ex);
+ }
+ zval_ptr_dtor(ex);
+ ZVAL_OBJ(ex, EG(exception));
+ if (UNEXPECTED(EG(exception) != exception)) {
+ GC_ADDREF(EG(exception));
+ HANDLE_EXCEPTION();
+ } else {
+ EG(exception) = NULL;
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value, *arg;
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
@@ -3090,7 +2975,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONS
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value, *arg;
@@ -3103,14 +2988,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_C
}
} else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
send_val_by_ref:
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
-
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
@@ -3134,14 +3014,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_C
}
} else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
send_val_by_ref:
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
-
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
@@ -3159,15 +3034,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CONST_HANDLER(Z
SAVE_OPLINE();
- arg = EX_CONSTANT(opline->op1);
+ arg = RT_CONSTANT(opline, opline->op1);
param = ZEND_CALL_VAR(EX(call), opline->result.var);
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- opline->op2.num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
+ zend_param_must_be_ref(EX(call)->func, opline->op2.num);
}
ZVAL_COPY(param, arg);
@@ -3175,13 +3046,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *val;
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
@@ -3200,79 +3071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_O
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *result;
- zend_function *constructor;
- zend_class_entry *ce;
- zend_execute_data *call;
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
- }
- } else if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
- }
-
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
- ZVAL_UNDEF(result);
- HANDLE_EXCEPTION();
- }
-
- constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
- if (constructor == NULL) {
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
-
- /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
- * opcode is DO_FCALL in case EXT instructions are used. */
- if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
-
- /* Perform a dummy function call */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
- opline->extended_value, NULL, NULL);
- } else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
- init_func_run_time_cache(&constructor->op_array);
- }
- /* We are not handling overloaded classes right now */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
- constructor,
- opline->extended_value,
- ce,
- Z_OBJ_P(result));
- Z_ADDREF_P(result);
- }
-
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3282,7 +3081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
zend_object_clone_obj_t clone_call;
SAVE_OPLINE();
- obj = EX_CONSTANT(opline->op1);
+ obj = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -3292,9 +3091,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
+ obj = Z_REFVAL_P(obj);
+ if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
+ break;
}
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -3349,15 +3148,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *expr;
zval *result = EX_VAR(opline->result.var);
+ HashTable *ht;
SAVE_OPLINE();
- expr = EX_CONSTANT(opline->op1);
+ expr = RT_CONSTANT(opline, opline->op1);
switch (opline->extended_value) {
case IS_NULL:
@@ -3392,16 +3192,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_O
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
- ZVAL_NEW_ARR(result);
- zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (IS_CONST == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
+ ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
} else {
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -3409,19 +3222,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_O
convert_to_array(result);
}
} else {
- if (Z_TYPE_P(expr) != IS_ARRAY) {
- object_init(result);
- if (Z_TYPE_P(expr) != IS_NULL) {
- expr = zend_hash_add_new(Z_OBJPROP_P(result), ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (IS_CONST == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
+ ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
+ if (Z_TYPE_P(expr) == IS_ARRAY) {
+ ht = zend_symtable_to_proptable(Z_ARR_P(expr));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ /* TODO: try not to duplicate immutable arrays as well ??? */
+ ht = zend_array_dup(ht);
+ }
+ Z_OBJ_P(result)->properties = ht;
+ } else if (Z_TYPE_P(expr) != IS_NULL) {
+ Z_OBJ_P(result)->properties = ht = zend_new_array(1);
+ expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
+ } else {
+ if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
- } else {
- ZVAL_COPY(result, expr);
- convert_to_object(result);
}
}
}
@@ -3437,7 +3253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
zval *inc_filename;
SAVE_OPLINE();
- inc_filename = EX_CONSTANT(opline->op1);
+ inc_filename = RT_CONSTANT(opline, opline->op1);
new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -3493,8 +3309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
} else if (RETURN_VALUE_USED(opline)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
}
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -3505,7 +3320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
SAVE_OPLINE();
- array_ptr = EX_CONSTANT(opline->op1);
+ array_ptr = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
result = EX_VAR(opline->result.var);
ZVAL_COPY_VALUE(result, array_ptr);
@@ -3525,7 +3340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -3533,51 +3348,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
-
- if (iter) {
- OBJ_RELEASE(&iter->std);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -3591,7 +3367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3605,7 +3381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
array_ptr = Z_REFVAL_P(array_ref);
}
} else {
- array_ref = array_ptr = EX_CONSTANT(opline->op1);
+ array_ref = array_ptr = RT_CONSTANT(opline, opline->op1);
}
if (EXPECTED(Z_TYPE_P(array_ptr) == IS_ARRAY)) {
@@ -3622,12 +3398,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
array_ptr = Z_REFVAL_P(array_ref);
}
if (IS_CONST == IS_CONST) {
- zval_copy_ctor_func(array_ptr);
+ ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
} else {
SEPARATE_ARRAY(array_ptr);
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
+ if (IS_CONST == IS_VAR) {
+
+ }
ZEND_VM_NEXT_OPCODE();
} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -3645,7 +3424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -3653,54 +3432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (IS_CONST == IS_VAR) {
-
- } else {
-
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_CONST == IS_VAR) {
-
- } else {
-
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_CONST == IS_VAR) {
-
- } else {
-
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CONST == IS_VAR) {
@@ -3710,8 +3442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -3729,14 +3460,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
SAVE_OPLINE();
if (IS_CONST != IS_UNUSED) {
- zval *ptr = EX_CONSTANT(opline->op1);
+ zval *ptr = RT_CONSTANT(opline, opline->op1);
do {
if (Z_TYPE_P(ptr) == IS_LONG) {
@@ -3749,7 +3480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_O
break;
}
}
- zend_print_variable(ptr);
+ zend_print_zval(ptr, 0);
}
} while (0);
@@ -3758,7 +3489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_O
ZEND_VM_NEXT_OPCODE(); /* Never reached */
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3767,7 +3498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
int ret;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
@@ -3795,20 +3526,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEN
} else if (IS_CONST == IS_VAR && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3816,10 +3546,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZE
zval *ref = NULL;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
- if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) {
- if (IS_CONST == IS_VAR) {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if (IS_CONST & IS_VAR) {
ref = value;
}
value = Z_REFVAL_P(value);
@@ -3832,17 +3562,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZE
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
} else if (IS_CONST == IS_CV) {
if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (IS_CONST == IS_VAR && ref) {
+ } else if ((IS_CONST & IS_VAR) && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
ZEND_VM_NEXT_OPCODE();
@@ -3855,7 +3584,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CON
zval *value;
zval *result = EX_VAR(opline->result.var);
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(value, BP_VAR_R);
@@ -3864,8 +3593,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CON
}
if (IS_CONST == IS_CV) {
- ZVAL_DEREF(value);
- ZVAL_COPY(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (IS_CONST == IS_VAR) {
if (UNEXPECTED(Z_ISREF_P(value))) {
ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
@@ -3888,6 +3616,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CON
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3898,7 +3635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
SAVE_OPLINE();
- val = EX_CONSTANT(opline->op1);
+ val = RT_CONSTANT(opline, opline->op1);
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_throw_error(NULL, "Cannot use \"yield from\" in a force-closed generator");
@@ -3992,13 +3729,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value;
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
@@ -4041,49 +3778,70 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value;
int result = 0;
- SAVE_OPLINE();
- value = EX_CONSTANT(opline->op1);
- if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) {
- if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) {
- const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value));
-
- if (EXPECTED(type_name != NULL)) {
- result = 1;
- }
- } else {
+ value = RT_CONSTANT(opline, opline->op1);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+type_check_resource:
+ if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
+ || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
result = 1;
}
- } else if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
+ } else if ((IS_CONST & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+ goto type_check_resource;
+ }
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+ result = ((1 << IS_NULL) & opline->extended_value) != 0;
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_constant *c;
int result;
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- result = 1;
- } else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op1), 0)) == NULL) {
- result = 0;
- } else {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), c);
- result = 1;
- }
+ c = CACHED_PTR(opline->extended_value);
+ do {
+ if (EXPECTED(c != NULL)) {
+ if (!IS_SPECIAL_CACHE_VAL(c)) {
+ result = 1;
+ break;
+ } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
+ result = 0;
+ break;
+ }
+ }
+ if (zend_quick_check_constant(RT_CONSTANT(opline, opline->op1) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ CACHE_PTR(opline->extended_value, ENCODE_SPECIAL_CACHE_NUM(zend_hash_num_elements(EG(zend_constants))));
+ result = 0;
+ } else {
+ result = 1;
+ }
+ } while (0);
ZEND_VM_SMART_BRANCH(result, 0);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE();
@@ -4095,7 +3853,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_DOUBLE_S
zval *value;
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(value));
ZEND_VM_NEXT_OPCODE();
}
@@ -4106,19 +3864,47 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_NOREF_SP
zval *value;
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value, *arg;
+
+
+ value = RT_CONSTANT(opline, opline->op1);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_COPY_VALUE(arg, value);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value, *arg;
+
+ uint32_t arg_num = opline->op2.num;
+
+ if (QUICK_ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ value = RT_CONSTANT(opline, opline->op1);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_COPY_VALUE(arg, value);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -4154,14 +3940,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -4197,14 +3983,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -4243,37 +4029,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -4297,14 +4080,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -4325,14 +4108,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -4353,86 +4136,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
pow_function(EX_VAR(opline->result.var), op1, op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
-
- if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
-
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
- }
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- }
-
- } while (0);
-
- ZEND_VM_NEXT_OPCODE();
- } else {
- SAVE_OPLINE();
-
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- concat_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -4440,8 +4159,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_
int result;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_identical_function(op1, op2);
@@ -4450,7 +4169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -4458,8 +4177,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CO
int result;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_not_identical_function(op1, op2);
@@ -4468,14 +4187,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CO
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -4497,17 +4216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
} else {
@@ -4536,14 +4245,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -4565,17 +4274,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
} else {
@@ -4604,14 +4303,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -4654,14 +4353,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HA
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -4704,29 +4403,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
compare_function(EX_VAR(opline->result.var), op1, op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
@@ -4746,14 +4445,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
@@ -4773,14 +4472,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
@@ -4800,15 +4499,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
@@ -4821,15 +4520,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
zval *varname;
zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- retval = zend_fetch_static_property_address(varname, IS_CONST, opline->op2, IS_CONST, type EXECUTE_DATA_CC);
+ 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((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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_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;
+ }
+ }
+
+ 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 (EG(exception)) {
-
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
} else {
@@ -4839,7 +4599,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -4863,13 +4623,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONS
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4882,21 +4639,21 @@ 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_CONST(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container, *dim, *value, *result;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- dim = EX_CONSTANT(opline->op2);
+ container = RT_CONSTANT(opline, opline->op1);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST != IS_CONST) {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_array:
value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CONST, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -4906,98 +4663,83 @@ fetch_dim_r_array:
}
} else {
fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CONST EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, IS_CONST OPLINE_CC EXECUTE_DATA_CC);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_read_IS(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -5005,37 +4747,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
@@ -5044,33 +4809,35 @@ fetch_obj_r_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -5078,21 +4845,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -5102,7 +4891,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -5114,56 +4903,34 @@ fetch_obj_is_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_CONST == 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));
- }
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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));
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2) EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_LIST_r(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -5171,46 +4938,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H
zend_string *op1_str, *op2_str, *str;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = RT_CONSTANT(opline, opline->op2);
if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
(IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
+ } else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ }
ZEND_VM_NEXT_OPCODE();
}
@@ -5223,7 +4988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
if (IS_CONST == IS_CONST) {
op2_str = Z_STR_P(op2);
@@ -5233,26 +4998,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
if (IS_CONST == IS_CONST) {
- zend_string_addref(op2_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
if (IS_CONST == IS_CONST) {
- zend_string_addref(op1_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -5261,10 +5030,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
if (IS_CONST != IS_CONST) {
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
}
if (IS_CONST != IS_CONST) {
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
@@ -5272,11 +5041,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_H
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
-
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -5286,13 +5055,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
SAVE_OPLINE();
- object = EX_CONSTANT(opline->op1);
+ object = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = EX_CONSTANT(opline->op2);
+ if (IS_CONST != IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
if (IS_CONST != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
@@ -5328,11 +5099,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CONST != IS_CONST) {
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+ zend_invalid_method_call(object, function_name);
HANDLE_EXCEPTION();
@@ -5344,8 +5120,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
called_scope = obj->ce;
if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
@@ -5356,11 +5132,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
HANDLE_EXCEPTION();
}
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
@@ -5370,25 +5150,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CONST != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
+ if (IS_CONST == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -5412,14 +5204,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CONST != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_CONST == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -5434,16 +5228,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST &&
IS_CONST == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_CONST != IS_CONST &&
IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_CONST != IS_UNUSED) {
- function_name = EX_CONSTANT(opline->op2);
+ function_name = RT_CONSTANT(opline, opline->op2);
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
@@ -5462,17 +5256,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -5480,11 +5274,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_CONST == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -5513,22 +5303,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -5568,7 +5344,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
SAVE_OPLINE();
- function_name = EX_CONSTANT(opline->op2);
+ function_name = RT_CONSTANT(opline, opline->op2);
if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
func = fcc.function_handler;
called_scope = fcc.called_scope;
@@ -5576,9 +5352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
+ zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -5586,20 +5360,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
- ZEND_ASSERT(GC_TYPE((zend_object*)func->common.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)func->common.prototype)++;
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
call_info |= ZEND_CALL_CLOSURE;
if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
}
} else if (object) {
call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ GC_ADDREF(object); /* For $this pointer */
}
if ((IS_CONST & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
if (call_info & ZEND_CALL_CLOSURE) {
- zend_object_release((zend_object*)func->common.prototype);
+ zend_object_release(ZEND_CLOSURE_OBJECT(func));
}
if (call_info & ZEND_CALL_RELEASE_THIS) {
zend_object_release(object);
@@ -5611,7 +5384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
init_func_run_time_cache(&func->op_array);
}
} else {
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
+ zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
efree(error);
if (UNEXPECTED(EG(exception))) {
@@ -5630,99 +5403,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_CONSTANT(opline->op2);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_class_entry *ce, *scope;
zend_class_constant *c;
- zval *value;
+ zval *value, *zv;
USE_OPLINE
SAVE_OPLINE();
do {
if (IS_CONST == IS_CONST) {
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-#ifdef ZTS
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
-#endif
+ if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
- } else if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ } else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+ ce = CACHED_PTR(opline->extended_value);
} else {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
} else {
if (IS_CONST == IS_UNUSED) {
@@ -5735,48 +5438,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
} else {
ce = Z_CE_P(EX_VAR(opline->op1.var));
}
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
}
}
- if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ if (EXPECTED(zv != NULL)) {
+ c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
if (!zend_verify_const_access(c, scope)) {
- zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
value = &c->value;
- if (Z_CONSTANT_P(value)) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
zval_update_constant_ex(value, c->ce);
if (UNEXPECTED(EG(exception) != NULL)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
}
- if (IS_CONST == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), value);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
- }
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
} else {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
} while (0);
-#ifdef ZTS
- if (ce->type == ZEND_INTERNAL_CLASS) {
- ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), value);
-#endif
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
ZEND_VM_NEXT_OPCODE();
}
@@ -5791,28 +5484,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
- expr_ptr = EX_CONSTANT(opline->op1);
+ expr_ptr = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_TMP_VAR) {
/* pass */
} else if (IS_CONST == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CONST == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -5825,7 +5517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
if (IS_CONST != IS_UNUSED) {
- zval *offset = EX_CONSTANT(opline->op2);
+ zval *offset = RT_CONSTANT(opline, opline->op2);
zend_string *str;
zend_ulong hval;
@@ -5863,14 +5555,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5885,73 +5577,67 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HA
array = EX_VAR(opline->result.var);
if (IS_CONST != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CONST != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ /*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_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5963,44 +5649,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
zval *value;
int result;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_CONST == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ } 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)), 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ 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));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -6009,34 +5682,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
+ value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
goto is_static_prop_return;
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result = value && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = !value || !i_zend_is_true(value);
}
@@ -6045,7 +5719,7 @@ is_static_prop_return:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6055,8 +5729,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- offset = EX_CONSTANT(opline->op2);
+ container = RT_CONSTANT(opline, opline->op1);
+ offset = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht;
@@ -6073,8 +5747,7 @@ isset_again:
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -6082,91 +5755,32 @@ num_index_prop:
} else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if (IS_CONST & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
@@ -6177,7 +5791,7 @@ isset_dim_obj_exit:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6186,13 +5800,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -6206,15 +5820,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
@@ -6223,6 +5835,75 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_class_entry *parent;
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *zce, *orig_zce;
+ zend_class_entry *parent;
+
+ SAVE_OPLINE();
+ if ((zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1)) == NULL ||
+ ((orig_zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)+1), 1)) != NULL &&
+ Z_CE_P(zce) != Z_CE_P(orig_zce))) {
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *zv;
+ zend_class_entry *ce, *parent;
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+
+ if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ }
+
+ parent = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)),
+ RT_CONSTANT(opline, opline->op2) + 1,
+ ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(parent == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+
+ zend_do_inheritance(ce, parent);
+ ce->ce_flags |= ZEND_ACC_ANON_BOUND;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6232,21 +5913,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST
zend_constant c;
SAVE_OPLINE();
- name = EX_CONSTANT(opline->op1);
- val = EX_CONSTANT(opline->op2);
+ name = RT_CONSTANT(opline, opline->op1);
+ val = RT_CONSTANT(opline, opline->op2);
ZVAL_COPY(&c.value, val);
if (Z_OPT_CONSTANT(c.value)) {
if (UNEXPECTED(zval_update_constant_ex(&c.value, EX(func)->op_array.scope) != SUCCESS)) {
- zval_ptr_dtor(&c.value);
+ zval_ptr_dtor_nogc(&c.value);
HANDLE_EXCEPTION();
}
}
- c.flags = CONST_CS; /* non persistent, case sensetive */
- c.name = zend_string_dup(Z_STR_P(name), 0);
- c.module_number = PHP_USER_CONSTANT;
+ /* non persistent, case sensitive */
+ ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, PHP_USER_CONSTANT);
+ c.name = zend_string_copy(Z_STR_P(name));
if (zend_register_constant(&c) == FAILURE) {
}
@@ -6263,11 +5944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -6288,7 +5965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
@@ -6305,14 +5982,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
- zval *value = EX_CONSTANT(opline->op1);
+ zval *value = RT_CONSTANT(opline, opline->op1);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -6340,7 +6022,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
/* Set the new yielded key */
if (IS_CONST != IS_UNUSED) {
- zval *key = EX_CONSTANT(opline->op2);
+ zval *key = RT_CONSTANT(opline, opline->op2);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -6391,15 +6073,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op, *jump_zv;
HashTable *jumptable;
- op = EX_CONSTANT(opline->op1);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ op = RT_CONSTANT(opline, opline->op1);
+ jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
if (Z_TYPE_P(op) != IS_LONG) {
ZVAL_DEREF(op);
@@ -6420,25 +6102,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_CONST_CONST_H
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op, *jump_zv;
HashTable *jumptable;
- op = EX_CONSTANT(opline->op1);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ op = RT_CONSTANT(opline, opline->op1);
+ jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
if (Z_TYPE_P(op) != IS_STRING) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_STRING) {
+ if (IS_CONST == IS_CONST) {
/* Wrong type, fall back to ZEND_CASE chain */
ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZVAL_DEREF(op);
+ if (Z_TYPE_P(op) != IS_STRING) {
+ /* Wrong type, fall back to ZEND_CASE chain */
+ ZEND_VM_NEXT_OPCODE();
+ }
}
}
- jump_zv = zend_hash_find(jumptable, Z_STR_P(op));
+ jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), IS_CONST == IS_CONST);
if (jump_zv != NULL) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
ZEND_VM_CONTINUE();
@@ -6449,16 +6136,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_CONST_CONST
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1;
- HashTable *ht = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
int result;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_exists(ht, Z_STR_P(op1));
} else if (opline->extended_value) {
@@ -6489,15 +6176,220 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CONST_CONST_HAND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container, *dim, *value;
zend_long offset;
+ HashTable *ht;
- container = EX_CONSTANT(opline->op1);
- dim = EX_CONSTANT(opline->op2);
+ container = RT_CONSTANT(opline, opline->op1);
+ dim = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_index_array:
if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
@@ -6505,8 +6397,9 @@ fetch_dim_r_index_array:
} else {
offset = zval_get_long(dim);
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, fetch_dim_r_index_undef);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -6524,7 +6417,10 @@ fetch_dim_r_index_array:
} else {
fetch_dim_r_index_slow:
SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -6532,42 +6428,1390 @@ fetch_dim_r_index_slow:
fetch_dim_r_index_undef:
ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ zend_undefined_offset(offset);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_add_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ add_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ sub_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ fast_div_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
+ /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
+ ZVAL_LONG(result, 0);
+ } else {
+ ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ mod_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_left_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_right_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ pow_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ }
+
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ SAVE_OPLINE();
+
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ concat_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ compare_function(EX_VAR(opline->result.var), op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *container, *dim, *value, *result;
+
+ SAVE_OPLINE();
+ container = RT_CONSTANT(opline, opline->op1);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (IS_CONST != IS_CONST) {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_array:
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
+ result = EX_VAR(opline->result.var);
+ ZVAL_COPY_DEREF(result, value);
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_array;
+ } else {
+ goto fetch_dim_r_slow;
+ }
+ } else {
+fetch_dim_r_slow:
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ zend_fetch_dimension_address_read_R(container, dim, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_read_IS(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ 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 {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+ zend_free_op free_op2;
+ zval *offset;
+ void **cache_slot = NULL;
+
+ SAVE_OPLINE();
+ container = RT_CONSTANT(opline, opline->op1);
+
+ if (IS_CONST == 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));
+ }
+
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_CONST == IS_CONST ||
+ (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+ goto fetch_obj_r_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_r_no_object:
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
+ }
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+ zend_free_op free_op2;
+ zval *offset;
+ void **cache_slot = NULL;
+
+ SAVE_OPLINE();
+ container = RT_CONSTANT(opline, opline->op1);
+
+ if (IS_CONST == 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));
+ }
+
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_CONST == IS_CONST ||
+ (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ goto fetch_obj_is_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
+ }
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_is_no_object:
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ }
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ /* Behave like FETCH_OBJ_W */
+ 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));
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_LIST_r(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+ zend_string *op1_str, *op2_str, *str;
+
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ }
+
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CONST) {
+ op1_str = Z_STR_P(op1);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ op1_str = zend_string_copy(Z_STR_P(op1));
+ } else {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ op1_str = zval_get_string_func(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ op2_str = Z_STR_P(op2);
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ op2_str = zend_string_copy(Z_STR_P(op2));
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ op2_str = zval_get_string_func(op2);
+ }
+ do {
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ zend_string_release_ex(op1_str, 0);
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ zend_string_release_ex(op2_str, 0);
+ break;
+ }
+ }
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ if (IS_CONST != IS_CONST) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *function_name;
+ zend_free_op free_op1, free_op2;
+ zval *object;
+ zend_function *fbc;
+ zend_class_entry *called_scope;
+ zend_object *obj;
+ zend_execute_data *call;
+ uint32_t call_info;
+
+ SAVE_OPLINE();
+
+ object = RT_CONSTANT(opline, opline->op1);
+
+ if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Method name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+
+ if (IS_CONST != IS_UNUSED) {
+ do {
+ if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ HANDLE_EXCEPTION();
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+ zend_invalid_method_call(object, function_name);
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
+ }
+ } while (0);
+ }
+
+ obj = Z_OBJ_P(object);
+ called_scope = obj->ce;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else {
+ zend_object *orig_obj = obj;
+
+ if (UNEXPECTED(obj->handlers->get_method == NULL)) {
+ zend_throw_error(NULL, "Object does not support method calls");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
+ /* First, locate the function. */
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
+ }
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
+ EXPECTED(obj == orig_obj)) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+
+ call_info = ZEND_CALL_NESTED_FUNCTION;
+ if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
+ obj = NULL;
+
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
+ if (IS_CONST == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
+
+ }
+ }
+
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *function_name;
+ zend_class_entry *ce;
+ zend_object *object;
+ zend_function *fbc;
+ zend_execute_data *call;
+
+ SAVE_OPLINE();
+
+ if (IS_CONST == IS_CONST) {
+ /* no function found. try a static method in class */
+ ce = CACHED_PTR(opline->result.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
+ }
+ } else if (IS_CONST == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op1.var));
+ }
+
+ if (IS_CONST == IS_CONST &&
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
+ /* nothing to do */
+ } else if (IS_CONST != IS_CONST &&
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Function name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+ }
+
+ if (ce->get_static_method) {
+ fbc = ce->get_static_method(ce, Z_STR_P(function_name));
+ } else {
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ }
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(ce, Z_STR_P(function_name));
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ } else {
+ if (UNEXPECTED(ce->constructor == NULL)) {
+ zend_throw_error(NULL, "Cannot call constructor");
+ HANDLE_EXCEPTION();
+ }
+ if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
+ HANDLE_EXCEPTION();
+ }
+ fbc = ce->constructor;
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ }
+
+ object = NULL;
+ if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
+ if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+ object = Z_OBJ(EX(This));
+ ce = object->ce;
+ } else {
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ }
+
+ if (IS_CONST == IS_UNUSED) {
+ /* previous opcode is ZEND_FETCH_CLASS */
+ if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
+ (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
+ if (Z_TYPE(EX(This)) == IS_OBJECT) {
+ ce = Z_OBJCE(EX(This));
+ } else {
+ ce = Z_CE(EX(This));
+ }
+ }
+ }
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *function_name;
+ zend_fcall_info_cache fcc;
+ char *error = NULL;
+ zend_function *func;
+ zend_class_entry *called_scope;
+ zend_object *object;
+ zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
+
+ SAVE_OPLINE();
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
+ func = fcc.function_handler;
+ called_scope = fcc.called_scope;
+ object = fcc.object;
+ if (error) {
+ efree(error);
+ /* This is the only soft error is_callable() can generate */
+ zend_non_static_method_call(func);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
+ }
+ }
+ if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ /* Delay closure destruction until its invocation */
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
+ call_info |= ZEND_CALL_CLOSURE;
+ if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
+ call_info |= ZEND_CALL_FAKE_CLOSURE;
+ }
+ } else if (object) {
+ call_info |= ZEND_CALL_RELEASE_THIS;
+ GC_ADDREF(object); /* For $this pointer */
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
+ if (call_info & ZEND_CALL_CLOSURE) {
+ zend_object_release(ZEND_CLOSURE_OBJECT(func));
+ }
+ if (call_info & ZEND_CALL_RELEASE_THIS) {
+ zend_object_release(object);
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+ init_func_run_time_cache(&func->op_array);
+ }
+ } else {
+ zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
+ efree(error);
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ func = (zend_function*)&zend_pass_function;
+ called_scope = NULL;
+ object = NULL;
+ }
+
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, opline->extended_value, called_scope, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *expr_ptr, new_expr;
+
+ SAVE_OPLINE();
+ if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ expr_ptr = NULL;
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
+
+ } else {
+ expr_ptr = RT_CONSTANT(opline, opline->op1);
+ if (IS_CONST == IS_TMP_VAR) {
+ /* pass */
+ } else if (IS_CONST == IS_CONST) {
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else if (IS_CONST == IS_CV) {
+ ZVAL_DEREF(expr_ptr);
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else /* if (IS_CONST == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+
+ expr_ptr = Z_REFVAL_P(expr_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ expr_ptr = &new_expr;
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
+ }
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zend_string *str;
+ zend_ulong hval;
+
+add_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
+ }
+str_index:
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else {
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_CONST != IS_UNUSED) {
+ size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
+ ZVAL_ARR(array, zend_new_array(size));
+ /* Explicitly initialize array as not-packed if flag is set */
+ if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *container;
int result;
+ zend_ulong hval;
+ zval *offset;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
+ container = RT_CONSTANT(opline, opline->op1);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ HashTable *ht;
+ zval *value;
+ zend_string *str;
+
+isset_dim_obj_array:
+ ht = Z_ARRVAL_P(container);
+isset_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
+ }
+ value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index_prop:
+ value = zend_hash_index_find(ht, hval);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
+ offset = Z_REFVAL_P(offset);
+ goto isset_again;
+ } else {
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ }
+
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+ result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = (value == NULL || !i_zend_is_true(value));
+ }
+ goto isset_dim_obj_exit;
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto isset_dim_obj_array;
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
+ } else {
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
+ }
+
+isset_dim_obj_exit:
zval_ptr_dtor_nogc(free_op2);
+
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2;
+ zval *container;
int result;
+ zval *offset;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
+ container = RT_CONSTANT(opline, opline->op1);
+
+ if (IS_CONST == 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));
+ }
+
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_CONST == IS_CONST ||
+ (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ goto isset_no_object;
+ }
+ } else {
+ goto isset_no_object;
+ }
+ }
+ if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
+ zend_wrong_property_check(offset);
+isset_no_object:
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ result =
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
+ }
zval_ptr_dtor_nogc(free_op2);
+
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6581,11 +7825,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -6606,7 +7846,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
@@ -6623,14 +7863,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
- zval *value = EX_CONSTANT(opline->op1);
+ zval *value = RT_CONSTANT(opline, opline->op1);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -6709,57 +7954,82 @@ 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_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
+
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ 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);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
+ if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
- SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
+ 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)) {
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- 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_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
+ 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);
+ }
- zval *varname;
- zval *retval;
+ retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
- SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
- retval = zend_fetch_static_property_address(varname, IS_CONST, opline->op2, IS_VAR, type EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST && EXPECTED(retval)) {
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval);
+ }
+
+ } while (0);
if (UNEXPECTED(retval == NULL)) {
if (EG(exception)) {
-
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
} else {
@@ -6769,7 +8039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -6793,13 +8063,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONS
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -6812,57 +8079,55 @@ 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_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ /*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_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6874,44 +8139,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
zval *value;
int result;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_VAR == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ } 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)), 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ 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));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -6920,34 +8172,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
+ value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
goto is_static_prop_return;
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result = value && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = !value || !i_zend_is_true(value);
}
@@ -6964,11 +8217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -6989,7 +8238,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
@@ -7006,14 +8255,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
- zval *value = EX_CONSTANT(opline->op1);
+ zval *value = RT_CONSTANT(opline, opline->op1);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -7098,82 +8352,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
zval *varname;
zval *retval;
- zend_string *name;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
+ varname = RT_CONSTANT(opline, opline->op1);
- if (IS_CONST == IS_CONST) {
+ if (IS_CONST == IS_CONST) {
name = Z_STR_P(varname);
} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
name = Z_STR_P(varname);
- zend_string_addref(name);
+ tmp_name = NULL;
} else {
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
- name = zval_get_string(varname);
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- retval = zend_hash_find(target_symbol_table, name);
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ retval = zend_hash_find_ex(target_symbol_table, name, IS_CONST == IS_CONST);
if (retval == NULL) {
if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- zval *result;
-
fetch_this:
- result = EX_VAR(opline->result.var);
- switch (type) {
- case BP_VAR_R:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- zend_error(E_NOTICE,"Undefined variable: this");
- }
- break;
- case BP_VAR_IS:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- }
- break;
- case BP_VAR_RW:
- case BP_VAR_W:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot re-assign $this");
- break;
- case BP_VAR_UNSET:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot unset $this");
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
+ zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
if (IS_CONST != IS_CONST) {
- zend_string_release(name);
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_W) {
+ retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- case BP_VAR_W:
- retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
}
/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -7182,36 +8400,32 @@ fetch_this:
if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
goto fetch_this;
}
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_W:
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(retval);
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
ZVAL_NULL(retval);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
}
}
}
- if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+ if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
}
if (IS_CONST != IS_CONST) {
- zend_string_release(name);
+ zend_tmp_string_release(tmp_name);
}
ZEND_ASSERT(retval != NULL);
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -7235,13 +8449,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_UNUSED_HAN
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CONST_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7260,15 +8471,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
zval *varname;
zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- retval = zend_fetch_static_property_address(varname, IS_CONST, opline->op2, IS_UNUSED, type EXECUTE_DATA_CC);
+ 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), 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 (EG(exception)) {
-
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
} else {
@@ -7278,7 +8550,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -7302,13 +8574,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONS
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7323,41 +8592,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONS
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7373,14 +8618,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_UNUSED != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_CONST == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -7395,12 +8642,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_CONST != IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_UNUSED != IS_UNUSED) {
@@ -7423,17 +8670,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -7441,11 +8688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_UNUSED == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_CONST == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -7474,22 +8717,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -7515,7 +8744,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -7529,7 +8758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
- retval_ref = retval_ptr = EX_CONSTANT(opline->op1);
+ retval_ref = retval_ptr = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_CONST) {
ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
@@ -7565,6 +8794,78 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *result;
+ zend_function *constructor;
+ zend_class_entry *ce;
+ zend_execute_data *call;
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CONST) {
+ ce = CACHED_PTR(opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
+ }
+ CACHE_PTR(opline->op2.num, ce);
+ }
+ } else if (IS_CONST == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
+ }
+
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+ ZVAL_UNDEF(result);
+ HANDLE_EXCEPTION();
+ }
+
+ constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
+ if (constructor == NULL) {
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+
+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
+ * opcode is DO_FCALL in case EXT instructions are used. */
+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ }
+
+ /* Perform a dummy function call */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
+ opline->extended_value, NULL, NULL);
+ } else {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ init_func_run_time_cache(&constructor->op_array);
+ }
+ /* We are not handling overloaded classes right now */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
+ constructor,
+ opline->extended_value,
+ ce,
+ Z_OBJ_P(result));
+ Z_ADDREF_P(result);
+ }
+
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -7575,28 +8876,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_U
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
- expr_ptr = EX_CONSTANT(opline->op1);
+ expr_ptr = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_TMP_VAR) {
/* pass */
} else if (IS_CONST == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CONST == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -7647,14 +8947,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7669,103 +8969,101 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_H
array = EX_VAR(opline->result.var);
if (IS_CONST != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CONST != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
+ varname = RT_CONSTANT(opline, opline->op1);
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+ 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)) {
varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ zend_hash_del_ind(target_symbol_table, name);
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ /*CACHE_PTR(opline->extended_value, ce);*/
}
} else if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7777,29 +9075,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
zval *value;
int result;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
HashTable *target_symbol_table;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ 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);
}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ value = zend_hash_find_ex(target_symbol_table, name, IS_CONST == IS_CONST);
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
+ if (!value) {
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ if (Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ }
+ result = Z_TYPE_P(value) > IS_NULL;
+ } else {
+ result = !i_zend_is_true(value);
+ }
}
ZEND_VM_SMART_BRANCH(result, 1);
@@ -7813,44 +9121,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
zval *value;
int result;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = EX_CONSTANT(opline->op1);
- ZVAL_UNDEF(&tmp);
- if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_UNUSED == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ } 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)), 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ 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));
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -7859,34 +9154,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
+ value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
goto is_static_prop_return;
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CONST != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result = value && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = !value || !i_zend_is_true(value);
}
@@ -7901,10 +9197,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_C
zval *zfunc;
zval *object;
zend_class_entry *called_scope;
+ zend_function *fbc;
- zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
+ fbc = Z_PTR_P(zfunc);
+ if (fbc->common.fn_flags & ZEND_ACC_IMMUTABLE) {
+ zend_function *new_func = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+
+ memcpy(new_func, fbc, sizeof(zend_op_array));
+ new_func->common.fn_flags &= ~ZEND_ACC_IMMUTABLE;
+ Z_PTR_P(zfunc) = fbc = new_func;
+ }
+
if (Z_TYPE(EX(This)) == IS_OBJECT) {
called_scope = Z_OBJCE(EX(This));
if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
@@ -7931,11 +9237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -7956,7 +9258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
@@ -7973,14 +9275,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
- zval *value = EX_CONSTANT(opline->op1);
+ zval *value = RT_CONSTANT(opline, opline->op1);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -8059,7 +9366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8067,7 +9374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_UNUSED_HANDLE
zend_long count;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
do {
if (Z_TYPE_P(op1) == IS_ARRAY) {
count = zend_array_count(Z_ARRVAL_P(op1));
@@ -8105,7 +9412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_UNUSED_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8124,7 +9431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CONST_UNUSED_HA
zval *op1;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
if (Z_TYPE_P(op1) == IS_OBJECT) {
ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
} else {
@@ -8136,7 +9443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CONST_UNUSED_HA
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8144,7 +9451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CONST_UNUSED_HAN
zend_string *type;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
type = zend_zval_get_type(op1);
if (EXPECTED(type)) {
ZVAL_INTERNED_STR(EX_VAR(opline->result.var), type);
@@ -8163,7 +9470,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
arg_count = EX_NUM_ARGS();
if (IS_CONST == IS_CONST) {
- skip = Z_LVAL_P(EX_CONSTANT(opline->op1));
+ skip = Z_LVAL_P(RT_CONSTANT(opline, opline->op1));
if (arg_count < skip) {
result_size = 0;
} else {
@@ -8174,13 +9481,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
result_size = arg_count;
}
- ht = (zend_array *) emalloc(sizeof(zend_array));
- zend_hash_init(ht, result_size, NULL, ZVAL_PTR_DTOR, 0);
- ZVAL_ARR(EX_VAR(opline->result.var), ht);
-
if (result_size) {
uint32_t first_extra_arg = EX(func)->op_array.num_args;
- zend_hash_real_init(ht, 1);
+
+ ht = zend_new_array(result_size);
+ ZVAL_ARR(EX_VAR(opline->result.var), ht);
+ zend_hash_real_init_packed(ht);
ZEND_HASH_FILL_PACKED(ht) {
zval *p, *q;
uint32_t i = skip;
@@ -8223,6 +9529,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
}
} ZEND_HASH_FILL_END();
ht->nNumOfElements = result_size;
+ } else {
+ ZVAL_EMPTY_ARRAY(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
}
@@ -8233,8 +9541,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -8276,8 +9584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -8313,52 +9621,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- zend_long overflow;
-
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8366,7 +9628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
@@ -8380,16 +9642,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -8419,8 +9678,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -8447,8 +9706,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -8476,7 +9735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
pow_function(EX_VAR(opline->result.var), op1, op2);
@@ -8490,8 +9749,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
(IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
@@ -8499,38 +9758,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
+ } else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
@@ -8548,186 +9805,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
-
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
-
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
-
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -8776,8 +9861,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -8827,7 +9912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLE
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
+ op1 = RT_CONSTANT(opline, opline->op1);
op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
compare_function(EX_VAR(opline->result.var), op1, op2);
@@ -8835,102 +9920,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8938,14 +9927,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HAND
zval *container, *dim, *value, *result;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ dim = EX_VAR(opline->op2.var);
if (IS_CONST != IS_CONST) {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_array:
value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CV, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -8955,12 +9944,13 @@ fetch_dim_r_array:
}
} else {
fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CV EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, IS_CV OPLINE_CC EXECUTE_DATA_CC);
}
@@ -8974,8 +9964,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HAN
zval *container;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_read_IS(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -8983,70 +9973,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HAN
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = EX_VAR(opline->op2.var);
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -9054,37 +10028,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
@@ -9093,33 +10090,35 @@ fetch_obj_r_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
if (IS_CONST == IS_CONST ||
(IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -9127,21 +10126,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -9151,7 +10172,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -9163,51 +10184,29 @@ fetch_obj_is_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_CONST == 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));
- }
if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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));
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ zend_fetch_dimension_address_LIST_r(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -9220,46 +10219,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
zend_string *op1_str, *op2_str, *str;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
(IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
+ } else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ }
ZEND_VM_NEXT_OPCODE();
}
@@ -9272,7 +10269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
if (IS_CV == IS_CONST) {
op2_str = Z_STR_P(op2);
@@ -9282,26 +10279,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
if (IS_CV == IS_CONST) {
- zend_string_addref(op2_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
if (IS_CV != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
if (IS_CONST == IS_CONST) {
- zend_string_addref(op1_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -9310,10 +10311,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
if (IS_CONST != IS_CONST) {
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
}
if (IS_CV != IS_CONST) {
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
@@ -9321,11 +10322,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
-
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -9335,13 +10336,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
SAVE_OPLINE();
- object = EX_CONSTANT(opline->op1);
+ object = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ if (IS_CV != IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
if (IS_CV != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
@@ -9377,11 +10380,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CV != IS_CONST) {
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+ zend_invalid_method_call(object, function_name);
HANDLE_EXCEPTION();
@@ -9393,8 +10401,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
called_scope = obj->ce;
if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
@@ -9405,11 +10413,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
HANDLE_EXCEPTION();
}
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
@@ -9419,25 +10431,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CV != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
+ if (IS_CONST == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -9461,14 +10485,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CV != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_CONST == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -9483,16 +10509,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CONST == IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_CONST != IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_CV != IS_UNUSED) {
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ function_name = EX_VAR(opline->op2.var);
if (IS_CV != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
@@ -9511,17 +10537,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -9529,11 +10555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_CONST == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -9562,22 +10584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -9625,9 +10633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
+ zend_non_static_method_call(func);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -9635,20 +10641,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
}
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
- ZEND_ASSERT(GC_TYPE((zend_object*)func->common.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)func->common.prototype)++;
+ GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
call_info |= ZEND_CALL_CLOSURE;
if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
}
} else if (object) {
call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ GC_ADDREF(object); /* For $this pointer */
}
if ((IS_CV & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
if (call_info & ZEND_CALL_CLOSURE) {
- zend_object_release((zend_object*)func->common.prototype);
+ zend_object_release(ZEND_CLOSURE_OBJECT(func));
}
if (call_info & ZEND_CALL_RELEASE_THIS) {
zend_object_release(object);
@@ -9660,7 +10665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
init_func_run_time_cache(&func->op_array);
}
} else {
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
+ zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
efree(error);
if (UNEXPECTED(EG(exception))) {
@@ -9679,127 +10684,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_class_entry *ce, *catch_ce;
- zend_object *exception;
- zval *ex;
-
- SAVE_OPLINE();
- /* Check whether an exception has been thrown, if not, jump over code */
- zend_exception_restore();
- if (EG(exception) == NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- catch_ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
-
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), catch_ce);
- }
- ce = EG(exception)->ce;
-
-#ifdef HAVE_DTRACE
- if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
- DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
- }
-#endif /* HAVE_DTRACE */
-
- if (ce != catch_ce) {
- if (!catch_ce || !instanceof_function(ce, catch_ce)) {
- if (opline->result.num) {
- zend_rethrow_exception(execute_data);
- HANDLE_EXCEPTION();
- }
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- }
-
- exception = EG(exception);
- ex = EX_VAR(opline->op2.var);
- if (UNEXPECTED(Z_ISREF_P(ex))) {
- ex = Z_REFVAL_P(ex);
- }
- zval_ptr_dtor(ex);
- ZVAL_OBJ(ex, EG(exception));
- if (UNEXPECTED(EG(exception) != exception)) {
- GC_REFCOUNT(EG(exception))++;
- HANDLE_EXCEPTION();
- } else {
- EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9810,28 +10694,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
- expr_ptr = EX_CONSTANT(opline->op1);
+ expr_ptr = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_TMP_VAR) {
/* pass */
} else if (IS_CONST == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CONST == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -9844,7 +10727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
if (IS_CV != IS_UNUSED) {
- zval *offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ zval *offset = EX_VAR(opline->op2.var);
zend_string *str;
zend_ulong hval;
@@ -9882,14 +10765,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -9904,20 +10787,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDL
array = EX_VAR(opline->result.var);
if (IS_CONST != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CONST != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -9930,8 +10809,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ container = RT_CONSTANT(opline, opline->op1);
+ offset = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht;
@@ -9948,8 +10827,7 @@ isset_again:
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -9957,91 +10835,32 @@ num_index_prop:
} else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if (IS_CV & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
@@ -10052,7 +10871,7 @@ isset_dim_obj_exit:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -10061,7 +10880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == 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));
@@ -10081,15 +10900,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
@@ -10106,11 +10923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -10131,7 +10944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- value = EX_CONSTANT(opline->op1);
+ value = RT_CONSTANT(opline, opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
@@ -10148,14 +10961,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
- zval *value = EX_CONSTANT(opline->op1);
+ zval *value = RT_CONSTANT(opline, opline->op1);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -10234,62 +11052,1639 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
ZEND_VM_RETURN();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *container, *dim, *value;
- zend_long offset;
+ zval *value;
- container = EX_CONSTANT(opline->op1);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
+ value = EX_VAR(opline->op1.var);
+ ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(value));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value;
+
+ value = EX_VAR(opline->op1.var);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_LIST_r(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op, *jump_zv;
+ HashTable *jumptable;
+
+ op = EX_VAR(opline->op1.var);
+ jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
+
+ if (Z_TYPE_P(op) != IS_LONG) {
+ ZVAL_DEREF(op);
+ if (Z_TYPE_P(op) != IS_LONG) {
+ /* Wrong type, fall back to ZEND_CASE chain */
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
+ if (jump_zv != NULL) {
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
+ ZEND_VM_CONTINUE();
+ } else {
+ /* default */
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op, *jump_zv;
+ HashTable *jumptable;
+
+ op = EX_VAR(opline->op1.var);
+ jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
+
+ if (Z_TYPE_P(op) != IS_STRING) {
+ if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* Wrong type, fall back to ZEND_CASE chain */
+ ZEND_VM_NEXT_OPCODE();
} else {
- offset = zval_get_long(dim);
+ ZVAL_DEREF(op);
+ if (Z_TYPE_P(op) != IS_STRING) {
+ /* Wrong type, fall back to ZEND_CASE chain */
+ ZEND_VM_NEXT_OPCODE();
+ }
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ }
+
+ jump_zv = zend_hash_find_ex(jumptable, Z_STR_P(op), (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST);
+ if (jump_zv != NULL) {
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
+ ZEND_VM_CONTINUE();
+ } else {
+ /* default */
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ }
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ fast_long_add_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) * Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+ zend_long overflow;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
+ Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ fast_long_add_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_LONG(result, Z_LVAL_P(op1) * Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+ zend_long overflow;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
+ Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2, *result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *op1, *op2;
+ int result;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_LIST_r(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_LIST_r(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *op1;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ bitwise_not_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC));
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *val;
+ zend_free_op free_op1;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ } else {
+ SAVE_OPLINE();
+ ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val));
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *z;
+
+ SAVE_OPLINE();
+ z = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (Z_TYPE_P(z) == IS_STRING) {
+ zend_string *str = Z_STR_P(z);
+
+ if (ZSTR_LEN(str) != 0) {
+ zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
+ }
+ } else {
+ zend_string *str = zval_get_string_func(z);
+
+ if (ZSTR_LEN(str) != 0) {
+ zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(z, BP_VAR_R);
+ }
+ zend_string_release_ex(str, 0);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *val;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ SAVE_OPLINE();
+ if (i_zend_is_true(val)) {
+ opline++;
+ } else {
+ opline = OP_JMP_ADDR(opline, opline->op2);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_JMP(opline);
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *val;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ SAVE_OPLINE();
+ if (i_zend_is_true(val)) {
+ opline = OP_JMP_ADDR(opline, opline->op2);
+ } else {
+ opline++;
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_JMP(opline);
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *val;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ SAVE_OPLINE();
+ if (i_zend_is_true(val)) {
+ opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
+ } else {
+ opline = OP_JMP_ADDR(opline, opline->op2);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_JMP(opline);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *val;
+ int ret;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ SAVE_OPLINE();
+ ret = i_zend_is_true(val);
+ zval_ptr_dtor_nogc(free_op1);
+ if (ret) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ opline++;
+ } else {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ opline = OP_JMP_ADDR(opline, opline->op2);
+ }
+ ZEND_VM_JMP(opline);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *val;
+ int ret;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
ZEND_VM_NEXT_OPCODE();
}
- } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
+ }
+
+ SAVE_OPLINE();
+ ret = i_zend_is_true(val);
+ zval_ptr_dtor_nogc(free_op1);
+ if (ret) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ opline = OP_JMP_ADDR(opline, opline->op2);
+ } else {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ opline++;
+ }
+ ZEND_VM_JMP(opline);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *var;
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ var = EX_VAR(opline->op1.var);
+ if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
+ zend_hash_iterator_del(Z_FE_ITER_P(var));
+ }
+ zval_ptr_dtor_nogc(var);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value, *arg;
+ zend_free_op free_op1;
+
+ value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
+ ZVAL_COPY_VALUE(arg, value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) {
+ Z_ADDREF_P(arg);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *val;
+ zend_free_op free_op1;
+
+ val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (Z_TYPE_INFO_P(val) == IS_TRUE) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
-fetch_dim_r_index_slow:
SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
-
+ ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val));
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *obj;
+ zend_class_entry *ce, *scope;
+ zend_function *clone;
+ zend_object_clone_obj_t clone_call;
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ obj = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ do {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+ obj = Z_REFVAL_P(obj);
+ if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
+ break;
+ }
+ }
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(obj, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "__clone method called on non-object");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ } while (0);
+
+ ce = Z_OBJCE_P(obj);
+ clone = ce->clone;
+ clone_call = Z_OBJ_HT_P(obj)->clone_obj;
+ if (UNEXPECTED(clone_call == NULL)) {
+ zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
+ zval_ptr_dtor_nogc(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+
+ if (clone) {
+ if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
+ /* Ensure that if we're calling a private function, we're allowed to do so.
+ */
+ scope = EX(func)->op_array.scope;
+ if (!zend_check_private(clone, scope, clone->common.function_name)) {
+ zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+ zval_ptr_dtor_nogc(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
+ /* Ensure that if we're calling a protected function, we're allowed to do so.
+ */
+ scope = EX(func)->op_array.scope;
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+ zval_ptr_dtor_nogc(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ }
+ }
+
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_op_array *new_op_array;
+ zend_free_op free_op1;
+ zval *inc_filename;
+
+ SAVE_OPLINE();
+ inc_filename = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
+ zval_ptr_dtor_nogc(free_op1);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
+ destroy_op_array(new_op_array);
+ efree_size(new_op_array, sizeof(zend_op_array));
+ }
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ }
+ } else if (EXPECTED(new_op_array != NULL)) {
+ zval *return_value = NULL;
+ zend_execute_data *call;
+
+ if (RETURN_VALUE_USED(opline)) {
+ return_value = EX_VAR(opline->result.var);
+ ZVAL_NULL(return_value);
+ }
+
+ new_op_array->scope = EX(func)->op_array.scope;
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+ (zend_function*)new_op_array, 0,
+ Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
+ Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
+
+ if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
+ call->symbol_table = EX(symbol_table);
+ } else {
+ call->symbol_table = zend_rebuild_symbol_table();
+ }
+
+ call->prev_execute_data = execute_data;
+ i_init_code_execute_data(call, new_op_array, return_value);
+ if (EXPECTED(zend_execute_ex == execute_ex)) {
+ ZEND_VM_ENTER();
+ } else {
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+ zend_execute_ex(call);
+ zend_vm_stack_free_call_frame(call);
+ }
+
+ destroy_op_array(new_op_array);
+ efree_size(new_op_array, sizeof(zend_op_array));
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_rethrow_exception(execute_data);
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+ } else if (RETURN_VALUE_USED(opline)) {
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op1;
+ zval *ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ do {
+ if (Z_TYPE_P(ptr) == IS_LONG) {
+ EG(exit_status) = Z_LVAL_P(ptr);
+ } else {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(ptr)) {
+ ptr = Z_REFVAL_P(ptr);
+ if (Z_TYPE_P(ptr) == IS_LONG) {
+ EG(exit_status) = Z_LVAL_P(ptr);
+ break;
+ }
+ }
+ zend_print_zval(ptr, 0);
+ }
+ } while (0);
+ zval_ptr_dtor_nogc(free_op1);
+ }
+ zend_bailout();
+ ZEND_VM_NEXT_OPCODE(); /* Never reached */
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value;
+ zval *ref = NULL;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if ((IS_TMP_VAR|IS_VAR) & IS_VAR) {
+ ref = value;
+ }
+ value = Z_REFVAL_P(value);
+ }
+
+ if (Z_TYPE_P(value) > IS_NULL) {
+ zval *result = EX_VAR(opline->result.var);
+ ZVAL_COPY_VALUE(result, value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
+ } else if (((IS_TMP_VAR|IS_VAR) & IS_VAR) && ref) {
+ zend_reference *r = Z_REF_P(ref);
+
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
+ efree_size(r, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(result)) {
+ Z_ADDREF_P(result);
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value;
+ zend_free_op free_op1;
+
+ value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_bool strict;
+
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+ value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ }
+ strict = EX_USES_STRICT_TYPES();
+ do {
+ if (EXPECTED(!strict)) {
+ zend_string *str;
+ zval tmp;
+
+ ZVAL_COPY(&tmp, value);
+ if (zend_parse_arg_str_weak(&tmp, &str)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
+ zval_ptr_dtor(&tmp);
+ break;
+ }
+ zval_ptr_dtor(&tmp);
+ }
+ zend_internal_type_error(strict, "strlen() expects parameter 1 to be string, %s given", zend_get_type_by_const(Z_TYPE_P(value)));
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } while (0);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value;
+ int result = 0;
+ zend_free_op free_op1;
+
+ value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+type_check_resource:
+ if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
+ || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
+ result = 1;
+ }
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+ goto type_check_resource;
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+ result = ((1 << IS_NULL) & opline->extended_value) != 0;
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -10313,26 +12708,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -10356,26 +12751,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -10402,49 +12797,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -10456,26 +12848,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -10484,26 +12876,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_left_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -10512,105 +12904,103 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(Z
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_right_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
pow_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
- if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ zval_ptr_dtor_nogc(free_op1);
+ } else if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
concat_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -10632,19 +13022,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
} else {
break;
}
@@ -10657,28 +13037,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN
} while (0);
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -10700,19 +13080,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
} else {
break;
}
@@ -10725,28 +13095,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR
} while (0);
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -10775,28 +13145,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_H
} while (0);
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -10825,43 +13195,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST
} while (0);
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
compare_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
@@ -10869,26 +13239,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLE
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
@@ -10896,26 +13266,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDL
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
@@ -10923,48 +13293,174 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDL
}
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
SAVE_OPLINE();
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
+
+ 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 (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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;
+ }
+ }
+
+ 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 (EG(exception)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ } else {
+ ZEND_ASSERT(type == BP_VAR_IS);
+ retval = &EG(uninitialized_zval);
+ }
+ }
+
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
zval *container, *dim, *value, *result;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (IS_CONST != IS_CONST) {
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CONST, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -10974,98 +13470,68 @@ fetch_dim_r_array:
}
} else {
fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, IS_CONST OPLINE_CC EXECUTE_DATA_CC);
}
- zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *container;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_IS(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *container;
- zend_free_op free_op1, free_op2;
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op2);
-
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
-
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *container;
- zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|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));
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ offset = RT_CONSTANT(opline, opline->op2);
- if (IS_CONST == IS_CONST ||
- (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -11073,73 +13539,97 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
-
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op1;
zval *container;
- zend_free_op free_op2;
+
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|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));
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ offset = RT_CONSTANT(opline, opline->op2);
- if (IS_CONST == IS_CONST ||
- (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -11147,21 +13637,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -11171,7 +13683,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -11179,150 +13691,102 @@ fetch_obj_is_no_object:
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- /* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_CONST == 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));
- }
- if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *op1, *op2;
zend_string *op1_str, *op2_str, *str;
- op1 = EX_CONSTANT(opline->op1);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ zval_ptr_dtor_nogc(free_op1);
+ } else if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+
+ }
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
- if (IS_CONST == IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
op1_str = Z_STR_P(op1);
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
op1_str = zend_string_copy(Z_STR_P(op1));
} else {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (IS_CONST == IS_CONST) {
op2_str = Z_STR_P(op2);
} else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
op2_str = zend_string_copy(Z_STR_P(op2));
} else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
- if (IS_CONST != IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op2_str);
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (IS_CONST != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if (IS_CONST == IS_CONST) {
- zend_string_addref(op1_str);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -11330,23 +13794,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_
memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if (IS_CONST != IS_CONST) {
- zend_string_release(op1_str);
- }
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op2_str);
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
- zend_free_op free_op2;
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -11356,55 +13820,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
SAVE_OPLINE();
- object = EX_CONSTANT(opline->op1);
+ object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (IS_CONST != IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ if (IS_CONST != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
-
+ zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
}
}
zend_throw_error(NULL, "Method name must be a string");
- zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
} while (0);
}
- if (IS_CONST != IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
do {
- if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
object = Z_REFVAL_P(object);
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
break;
}
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_CONST != IS_CONST) {
+
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+ zend_invalid_method_call(object, function_name);
+ zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
}
} while (0);
@@ -11413,53 +13884,69 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
obj = Z_OBJ_P(object);
called_scope = obj->ce;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ if (IS_CONST == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
zend_throw_error(NULL, "Object does not support method calls");
- zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
}
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
- zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CONST != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else if (IS_CONST & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
- zval_ptr_dtor_nogc(free_op2);
-
- if ((IS_CONST & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
+ zval_ptr_dtor_nogc(free_op1);
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -11470,245 +13957,787 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *function_name;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
- zend_object *object;
- zend_function *fbc;
- zend_execute_data *call;
+ zend_free_op free_op1;
SAVE_OPLINE();
if (IS_CONST == IS_CONST) {
- /* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ /*CACHE_PTR(opline->extended_value, ce);*/
}
} else if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
+ ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
HANDLE_EXCEPTION();
}
} else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- if (IS_CONST == IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
- /* nothing to do */
- } else if (IS_CONST != IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
- } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
-
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Function name must be a string");
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- } while (0);
- }
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
- if (ce->get_static_method) {
- fbc = ce->get_static_method(ce, Z_STR_P(function_name));
- } else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- }
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_std_unset_static_property(ce, name);
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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)), 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();
}
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_CONST == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
}
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ } 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) {
- zval_ptr_dtor_nogc(free_op2);
+ 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;
}
+ }
+
+ 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 (UNEXPECTED(ce->constructor == NULL)) {
- zend_throw_error(NULL, "Cannot call constructor");
- HANDLE_EXCEPTION();
+ 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 &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = !value || !i_zend_is_true(value);
+ }
+
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container;
+ int result;
+ zend_ulong hval;
+ zval *offset;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ offset = RT_CONSTANT(opline, opline->op2);
+
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ HashTable *ht;
+ zval *value;
+ zend_string *str;
+
+isset_dim_obj_array:
+ ht = Z_ARRVAL_P(container);
+isset_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CONST != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
+ }
+ value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index_prop:
+ value = zend_hash_index_find(ht, hval);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
+ offset = Z_REFVAL_P(offset);
+ goto isset_again;
+ } else {
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
- HANDLE_EXCEPTION();
+
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+ result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = (value == NULL || !i_zend_is_true(value));
}
- fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ goto isset_dim_obj_exit;
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto isset_dim_obj_array;
}
}
- object = NULL;
- if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
- object = Z_OBJ(EX(This));
- ce = object->ce;
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
+ } else {
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
+ }
+
+isset_dim_obj_exit:
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container;
+ int result;
+ zval *offset;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
+ }
+
+ offset = RT_CONSTANT(opline, opline->op2);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ goto isset_no_object;
+ }
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
+ goto isset_no_object;
+ }
+ }
+ if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
+ zend_wrong_property_check(offset);
+isset_no_object:
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ result =
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *expr;
+ zend_bool result;
+
+ SAVE_OPLINE();
+ expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+try_instanceof:
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ zend_class_entry *ce;
+
+ if (IS_CONST == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (EXPECTED(ce)) {
+ CACHE_PTR(opline->extended_value, ce);
}
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ }
+ } 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(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
}
+ result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
+ expr = Z_REFVAL_P(expr);
+ goto try_instanceof;
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ }
+ result = 0;
}
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- if (IS_CONST == IS_UNUSED) {
- /* previous opcode is ZEND_FETCH_CLASS */
- if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
- (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- ce = Z_OBJCE(EX(This));
- } else {
- ce = Z_CE(EX(This));
- }
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container, *dim, *value;
+ zend_long offset;
+ HashTable *ht;
+
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_index_array:
+ if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
+ offset = Z_LVAL_P(dim);
+ } else {
+ offset = zval_get_long(dim);
}
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, fetch_dim_r_index_undef);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_index_array;
+ } else {
+ goto fetch_dim_r_index_slow;
+ }
+ } else {
+fetch_dim_r_index_slow:
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
- call->prev_execute_data = EX(call);
- EX(call) = call;
+fetch_dim_r_index_undef:
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ SAVE_OPLINE();
+ zend_undefined_offset(offset);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- ZEND_VM_NEXT_OPCODE();
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container, *dim, *value;
+ zend_long offset;
+ HashTable *ht;
+
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_index_array:
+ if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
+ offset = Z_LVAL_P(dim);
+ } else {
+ offset = zval_get_long(dim);
+ }
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, fetch_dim_r_index_undef);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_index_array;
+ } else {
+ goto fetch_dim_r_index_slow;
+ }
+ } else {
+fetch_dim_r_index_slow:
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+
+fetch_dim_r_index_undef:
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ SAVE_OPLINE();
+ zend_undefined_offset(offset);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *function_name;
- zend_fcall_info_cache fcc;
- char *error = NULL;
- zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
- zend_execute_data *call;
- uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_add_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
SAVE_OPLINE();
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
- func = fcc.function_handler;
- called_scope = fcc.called_scope;
- object = fcc.object;
- if (error) {
- efree(error);
- /* This is the only soft error is_callable() can generate */
- zend_error(E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ add_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
}
- if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
- /* Delay closure destruction until its invocation */
- ZEND_ASSERT(GC_TYPE((zend_object*)func->common.prototype) == IS_OBJECT);
- GC_REFCOUNT((zend_object*)func->common.prototype)++;
- call_info |= ZEND_CALL_CLOSURE;
- if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
- call_info |= ZEND_CALL_FAKE_CLOSURE;
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ sub_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ zend_long overflow;
+
+ result = EX_VAR(opline->result.var);
+ ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
+ Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ mul_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ fast_div_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
+ /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
+ ZVAL_LONG(result, 0);
+ } else {
+ ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
}
- } else if (object) {
- call_info |= ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(object)++; /* For $this pointer */
+ ZEND_VM_NEXT_OPCODE();
}
+ }
- zval_ptr_dtor_nogc(free_op2);
- if (((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
- if (call_info & ZEND_CALL_CLOSURE) {
- zend_object_release((zend_object*)func->common.prototype);
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ mod_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_left_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_right_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ pow_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (call_info & ZEND_CALL_RELEASE_THIS) {
- zend_object_release(object);
+ zval_ptr_dtor_nogc(free_op1);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- HANDLE_EXCEPTION();
- }
+ zval_ptr_dtor_nogc(free_op2);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
- init_func_run_time_cache(&func->op_array);
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
}
+ ZEND_VM_NEXT_OPCODE();
} else {
- zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
- efree(error);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ SAVE_OPLINE();
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ concat_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-
- call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
- call->prev_execute_data = EX(call);
- EX(call) = call;
-
- ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1, free_op2;
zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
int result;
@@ -11731,17 +14760,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op1);
zval_ptr_dtor_nogc(free_op2);
} else {
break;
@@ -11755,7 +14775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER
} while (0);
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
@@ -11764,141 +14784,860 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+ zval_ptr_dtor_nogc(free_op1);
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
- zval *expr_ptr, new_expr;
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
SAVE_OPLINE();
- if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
- UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
- expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ compare_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container, *dim, *value, *result;
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_array:
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
+ result = EX_VAR(opline->result.var);
+ ZVAL_COPY_DEREF(result, value);
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_array;
+ } else {
+ goto fetch_dim_r_slow;
+ }
+ } else {
+fetch_dim_r_slow:
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ }
} else {
- expr_ptr = EX_CONSTANT(opline->op1);
- if (IS_CONST == IS_TMP_VAR) {
- /* pass */
- } else if (IS_CONST == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
+ zend_fetch_dimension_address_read_R(container, dim, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_IS(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container;
+ zend_free_op free_op2;
+ zval *offset;
+ void **cache_slot = NULL;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
+ }
+
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else if (IS_CONST == IS_CV) {
- ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
}
- } else /* if (IS_CONST == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+ goto fetch_obj_r_no_object;
+ } while (0);
+ }
- expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_r_no_object:
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
+ }
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container;
+ zend_free_op free_op2;
+ zval *offset;
+ void **cache_slot = NULL;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
- zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_string *str;
- zend_ulong hval;
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-add_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
}
}
-str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto add_again;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
+ goto fetch_obj_is_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
+ }
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_is_no_object:
+ ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ }
}
- zval_ptr_dtor_nogc(free_op2);
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2;
+ zend_string *op1_str, *op2_str, *str;
+
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ op1_str = Z_STR_P(op1);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ op1_str = zend_string_copy(Z_STR_P(op1));
} else {
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
+ op1_str = zval_get_string_func(op1);
}
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ op2_str = Z_STR_P(op2);
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ op2_str = zend_string_copy(Z_STR_P(op2));
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ op2_str = zval_get_string_func(op2);
+ }
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ zend_string_release_ex(op1_str, 0);
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ zend_string_release_ex(op2_str, 0);
+ break;
+ }
+ }
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
+ }
+ } while (0);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- zval *array;
- uint32_t size;
USE_OPLINE
+ zval *function_name;
+ zend_free_op free_op1, free_op2;
+ zval *object;
+ zend_function *fbc;
+ zend_class_entry *called_scope;
+ zend_object *obj;
+ zend_execute_data *call;
+ uint32_t call_info;
- array = EX_VAR(opline->result.var);
- if (IS_CONST != IS_UNUSED) {
- size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
+ SAVE_OPLINE();
+
+ object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Method name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ do {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ HANDLE_EXCEPTION();
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+ zend_invalid_method_call(object, function_name);
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ } while (0);
+ }
+
+ obj = Z_OBJ_P(object);
+ called_scope = obj->ce;
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
- size = 0;
+ zend_object *orig_obj = obj;
+
+ if (UNEXPECTED(obj->handlers->get_method == NULL)) {
+ zend_throw_error(NULL, "Object does not support method calls");
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
+ /* First, locate the function. */
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
+ EXPECTED(obj == orig_obj)) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
}
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
- if (IS_CONST != IS_UNUSED) {
- /* Explicitly initialize array as not-packed if flag is set */
- if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+
+ call_info = ZEND_CALL_NESTED_FUNCTION;
+ if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
+ obj = NULL;
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
+ zval_ptr_dtor_nogc(free_op1);
}
}
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1, free_op2;
+ zval *op1, *op2, *result;
+
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
zval *container;
int result;
zend_ulong hval;
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -11916,8 +15655,7 @@ isset_again:
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -11925,121 +15663,62 @@ num_index_prop:
} else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if ((IS_TMP_VAR|IS_VAR) & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
zval_ptr_dtor_nogc(free_op2);
-
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
+ zend_free_op free_op1, free_op2;
zval *container;
int result;
zval *offset;
SAVE_OPLINE();
- container = EX_CONSTANT(opline->op1);
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|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));
}
offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (IS_CONST == IS_CONST ||
- (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
goto isset_no_object;
@@ -12049,516 +15728,1900 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
zval_ptr_dtor_nogc(free_op2);
-
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container, *dim, *value;
- zend_long offset;
+ zend_free_op free_op1;
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- container = EX_CONSTANT(opline->op1);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
+ 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 (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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 {
- offset = zval_get_long(dim);
+ 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_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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 {
- ZEND_VM_NEXT_OPCODE();
+ 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);
}
- } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
+
+ 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 (EG(exception)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
} else {
- goto fetch_dim_r_index_slow;
+ ZEND_ASSERT(type == BP_VAR_IS);
+ retval = &EG(uninitialized_zval);
}
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
+ }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
+ zend_free_op free_op1;
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ if (IS_VAR == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
+ }
+ /*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_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *value;
+ int result;
+ zend_free_op free_op1;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ 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)), 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;
+ }
+ }
+
+ 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 &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = !value || !i_zend_is_true(value);
+ }
+
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zend_free_op free_op1;
+ zval *expr;
+ zend_bool result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+try_instanceof:
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ zend_class_entry *ce;
+
+ if (IS_VAR == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (EXPECTED(ce)) {
+ 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_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+ result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
+ expr = Z_REFVAL_P(expr);
+ goto try_instanceof;
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ }
+ result = 0;
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zend_free_op free_op1;
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ 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)) {
+ GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ retval = zend_hash_find_ex(target_symbol_table, name, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+ if (retval == NULL) {
+ if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
+fetch_this:
+ zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ if (type == BP_VAR_W) {
+ retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
+ retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
+ }
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
+ retval = Z_INDIRECT_P(retval);
+ if (Z_TYPE_P(retval) == IS_UNDEF) {
+ if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
+ goto fetch_this;
+ }
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(retval);
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
+ ZVAL_NULL(retval);
+ } else {
+ retval = &EG(uninitialized_zval);
+ }
+ }
+ }
+ }
+
+ if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
+ zval_ptr_dtor_nogc(free_op1);
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+
+ ZEND_ASSERT(retval != NULL);
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *op1, *op2, *result;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *op1, *op2, *result;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *op1, *op2, *result;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zend_free_op free_op1;
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) * Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ 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), 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 (EG(exception)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ } else {
+ ZEND_ASSERT(type == BP_VAR_IS);
+ retval = &EG(uninitialized_zval);
+ }
+ }
+
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *op1, *op2, *result;
- zend_long overflow;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
+ zend_free_op free_op1;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ zend_hash_del_ind(target_symbol_table, name);
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
+ zend_free_op free_op1;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ SAVE_OPLINE();
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (IS_UNUSED == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
+ }
+ /*CACHE_PTR(opline->extended_value, 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));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
+ zval *value;
int result;
+ zend_free_op free_op1;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ SAVE_OPLINE();
+ 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);
+ }
+
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ value = zend_hash_find_ex(target_symbol_table, name, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (!value) {
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ if (Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ }
+ result = Z_TYPE_P(value) > IS_NULL;
+ } else {
+ result = !i_zend_is_true(value);
+ }
+ }
+
+ ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
+ zval *value;
int result;
+ zend_free_op free_op1;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ 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)), 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;
+ }
+ }
+
+ 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 &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = !value || !i_zend_is_true(value);
+ }
+
+ ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *expr;
+ zend_bool result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ SAVE_OPLINE();
+ expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+try_instanceof:
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ zend_class_entry *ce;
+ if (IS_UNUSED == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (EXPECTED(ce)) {
+ CACHE_PTR(opline->extended_value, 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(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+ result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
+ expr = Z_REFVAL_P(expr);
+ goto try_instanceof;
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ }
+ result = 0;
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_add_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ add_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ fast_long_sub_function(result, op1, op2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ sub_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ fast_div_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
+ /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
+ ZVAL_LONG(result, 0);
+ } else {
+ ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ mod_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_left_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
+ && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
+ ZEND_VM_NEXT_OPCODE();
+ }
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ shift_right_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ pow_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ }
+
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+
+ }
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ SAVE_OPLINE();
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ concat_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ do {
+ int result;
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ do {
+ int result;
+
+ if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ compare_function(EX_VAR(opline->result.var), op1, op2);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *container, *dim, *value, *result;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_array:
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CV, BP_VAR_R EXECUTE_DATA_CC);
+ result = EX_VAR(opline->result.var);
+ ZVAL_COPY_DEREF(result, value);
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_array;
+ } else {
+ goto fetch_dim_r_slow;
+ }
+ } else {
+fetch_dim_r_slow:
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ zend_fetch_dimension_address_read_R(container, dim, IS_CV OPLINE_CC EXECUTE_DATA_CC);
+ }
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *container;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_IS(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *container;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ zval *offset;
+ void **cache_slot = NULL;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
+ }
+
+ offset = EX_VAR(opline->op2.var);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+ goto fetch_obj_r_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_r_no_object:
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
+ }
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *container;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ zval *offset;
+ void **cache_slot = NULL;
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
+ }
+
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ goto fetch_obj_is_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
+ }
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_is_no_object:
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ }
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op1;
zval *op1, *op2;
- int result;
+ zend_string *op1_str, *op2_str, *str;
+
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ zend_string *op1_str = Z_STR_P(op1);
+ zend_string *op2_str = Z_STR_P(op2);
+ zend_string *str;
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ }
+ zval_ptr_dtor_nogc(free_op1);
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ }
+
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op1);
+
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ op1_str = Z_STR_P(op1);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ op1_str = zend_string_copy(Z_STR_P(op1));
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ op1_str = zval_get_string_func(op1);
+ }
+ if (IS_CV == IS_CONST) {
+ op2_str = Z_STR_P(op2);
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ op2_str = zend_string_copy(Z_STR_P(op2));
+ } else {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ op2_str = zval_get_string_func(op2);
+ }
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
+ zend_string_release_ex(op1_str, 0);
+ break;
+ }
+ }
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
+ }
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
+ zend_string_release_ex(op2_str, 0);
+ break;
+ }
+ }
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
+ }
+ } while (0);
+ zval_ptr_dtor_nogc(free_op1);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zval *function_name;
+ zend_free_op free_op1;
+ zval *object;
+ zend_function *fbc;
+ zend_class_entry *called_scope;
+ zend_object *obj;
+ zend_execute_data *call;
+ uint32_t call_info;
+
+ SAVE_OPLINE();
+
+ object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ if (IS_CV != IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+
+ if (IS_CV != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Method name must be a string");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ do {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CV != IS_CONST) {
+
+ }
+ HANDLE_EXCEPTION();
+ }
+ }
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+ zend_invalid_method_call(object, function_name);
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ } while (0);
+ }
+
+ obj = Z_OBJ_P(object);
+ called_scope = obj->ce;
+
+ if (IS_CV == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else {
+ zend_object *orig_obj = obj;
+
+ if (UNEXPECTED(obj->handlers->get_method == NULL)) {
+ zend_throw_error(NULL, "Object does not support method calls");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+
+ /* First, locate the function. */
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
+ }
+ if (IS_CV == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
+ EXPECTED(obj == orig_obj)) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ }
+
+ if (IS_CV != IS_CONST) {
+
+ }
+
+ call_info = ZEND_CALL_NESTED_FUNCTION;
+ if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
+ obj = NULL;
+ zval_ptr_dtor_nogc(free_op1);
+
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
+ zval_ptr_dtor_nogc(free_op1);
+ }
+ }
+
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
- int result;
+ zend_free_op free_op1;
+ zval *op1, *op2, *result;
- op1 = EX_CONSTANT(opline->op1);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ do {
+ int result;
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+ } else {
+ break;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ } while (0);
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ }
+ result = EX_VAR(opline->result.var);
+ compare_function(result, op1, op2);
+ ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
+ zend_free_op free_op1;
+ zval *container;
int result;
+ zend_ulong hval;
+ zval *offset;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ offset = EX_VAR(opline->op2.var);
+
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ HashTable *ht;
+ zval *value;
+ zend_string *str;
+
+isset_dim_obj_array:
+ ht = Z_ARRVAL_P(container);
+isset_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
+ }
+ value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index_prop:
+ value = zend_hash_index_find(ht, hval);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
+ offset = Z_REFVAL_P(offset);
+ goto isset_again;
+ } else {
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ }
+
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+ result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = (value == NULL || !i_zend_is_true(value));
+ }
+ goto isset_dim_obj_exit;
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto isset_dim_obj_array;
+ }
+ }
+
+ if (IS_CV == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
+ } else {
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
+ }
+
+isset_dim_obj_exit:
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2;
+ zend_free_op free_op1;
+ zval *container;
int result;
+ zval *offset;
- op1 = EX_CONSTANT(opline->op1);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
+ SAVE_OPLINE();
+ container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|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));
+ }
+
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+ ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ goto isset_no_object;
+ }
+ } else {
+ goto isset_no_object;
+ }
+ }
+ if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
+ zend_wrong_property_check(offset);
+isset_no_object:
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ result =
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -12580,7 +17643,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
if (IS_TMP_VAR & (IS_VAR|IS_TMP_VAR)) {
if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
SAVE_OPLINE();
- zval_dtor_func(Z_COUNTED_P(free_op1));
+ rc_dtor_func(Z_COUNTED_P(free_op1));
}
}
} else {
@@ -12613,7 +17676,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
retval_ptr = Z_REFVAL_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
Z_ADDREF_P(retval_ptr);
@@ -12651,7 +17714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
ZVAL_NEW_REF(EX(return_value), retval_ptr);
if (IS_TMP_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
+ Z_TRY_ADDREF_P(retval_ptr);
}
}
break;
@@ -12673,8 +17736,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
}
if (EX(return_value)) {
- ZVAL_MAKE_REF(retval_ptr);
- Z_ADDREF_P(retval_ptr);
+ if (Z_ISREF_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(retval_ptr, 2);
+ }
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
}
@@ -12703,15 +17769,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_TMP_HAND
}
}
} else if (IS_TMP_VAR == IS_CV) {
- ZVAL_DEREF(retval);
- ZVAL_COPY(&generator->retval, retval);
+ ZVAL_COPY_DEREF(&generator->retval, retval);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval))) {
zend_refcounted *ref = Z_COUNTED_P(retval);
retval = Z_REFVAL_P(retval);
ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval)) {
Z_ADDREF_P(retval);
@@ -12759,7 +17824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP
zend_exception_save();
if (IS_TMP_VAR != IS_TMP_VAR) {
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
}
zend_throw_exception_object(value);
@@ -12768,7 +17833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP
HANDLE_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value, *arg;
@@ -12781,12 +17846,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_T
}
} else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
send_val_by_ref:
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -12812,12 +17872,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_T
}
} else if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
send_val_by_ref:
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_UNDEF(arg);
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
@@ -12841,11 +17896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEN
param = ZEND_CALL_VAR(EX(call), opline->result.var);
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- opline->op2.num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
+ zend_param_must_be_ref(EX(call)->func, opline->op2.num);
}
ZVAL_COPY(param, arg);
@@ -12860,6 +17911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
zend_free_op free_op1;
zval *expr;
zval *result = EX_VAR(opline->result.var);
+ HashTable *ht;
SAVE_OPLINE();
expr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -12897,16 +17949,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
- ZVAL_NEW_ARR(result);
- zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (IS_TMP_VAR == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
+ ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
} else {
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -12914,19 +17979,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
convert_to_array(result);
}
} else {
- if (Z_TYPE_P(expr) != IS_ARRAY) {
- object_init(result);
- if (Z_TYPE_P(expr) != IS_NULL) {
- expr = zend_hash_add_new(Z_OBJPROP_P(result), ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (IS_TMP_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
+ ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
+ if (Z_TYPE_P(expr) == IS_ARRAY) {
+ ht = zend_symtable_to_proptable(Z_ARR_P(expr));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ /* TODO: try not to duplicate immutable arrays as well ??? */
+ ht = zend_array_dup(ht);
+ }
+ Z_OBJ_P(result)->properties = ht;
+ } else if (Z_TYPE_P(expr) != IS_NULL) {
+ Z_OBJ_P(result)->properties = ht = zend_new_array(1);
+ expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
+ if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
+ } else {
+ if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
- } else {
- ZVAL_COPY(result, expr);
- convert_to_object(result);
}
}
}
@@ -12963,7 +18031,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -12971,52 +18039,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- zval_ptr_dtor_nogc(free_op1);
- if (iter) {
- OBJ_RELEASE(&iter->std);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op1);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -13061,12 +18090,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
array_ptr = Z_REFVAL_P(array_ref);
}
if (IS_TMP_VAR == IS_CONST) {
- zval_copy_ctor_func(array_ptr);
+ ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
} else {
SEPARATE_ARRAY(array_ptr);
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
+ if (IS_TMP_VAR == IS_VAR) {
+
+ }
ZEND_VM_NEXT_OPCODE();
} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -13084,7 +18116,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -13092,54 +18124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (IS_TMP_VAR == IS_VAR) {
-
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_TMP_VAR == IS_VAR) {
-
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_TMP_VAR == IS_VAR) {
-
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_VAR) {
@@ -13149,8 +18134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -13215,55 +18199,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
} else if (IS_TMP_VAR == IS_VAR && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
- efree_size(r, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- }
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- }
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *ref = NULL;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) {
- if (IS_TMP_VAR == IS_VAR) {
- ref = value;
- }
- value = Z_REFVAL_P(value);
- }
-
- if (Z_TYPE_P(value) > IS_NULL) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, value);
- if (IS_TMP_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if (IS_TMP_VAR == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (IS_TMP_VAR == IS_VAR && ref) {
- zend_reference *r = Z_REF_P(ref);
-
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
zval_ptr_dtor_nogc(free_op1);
@@ -13286,8 +18228,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP
}
if (IS_TMP_VAR == IS_CV) {
- ZVAL_DEREF(value);
- ZVAL_COPY(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (IS_TMP_VAR == IS_VAR) {
if (UNEXPECTED(Z_ISREF_P(value))) {
ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
@@ -13415,35 +18356,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result = 0;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) {
- if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) {
- const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value));
-
- if (EXPECTED(type_name != NULL)) {
- result = 1;
- }
- } else {
- result = 1;
- }
- } else if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -13453,7 +18365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HA
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_identical_function(op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -13471,7 +18383,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_not_identical_function(op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -13482,149 +18394,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if (IS_TMP_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));
- }
-
- offset = EX_CONSTANT(opline->op2);
-
- if (IS_TMP_VAR == IS_CONST ||
- (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_TMP_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));
- }
if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
@@ -13638,10 +18431,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CONST_HANDLE
/* op1 and result are the same */
rope = (zend_string**)EX_VAR(opline->op1.var);
if (IS_CONST == IS_CONST) {
- var = EX_CONSTANT(opline->op2);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ var = RT_CONSTANT(opline, opline->op2);
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = EX_CONSTANT(opline->op2);
+ var = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
if (IS_CONST == IS_CV) {
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
@@ -13653,7 +18449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CONST_HANDLE
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -13673,10 +18469,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CONST_HANDLE
rope = (zend_string**)EX_VAR(opline->op1.var);
if (IS_CONST == IS_CONST) {
- var = EX_CONSTANT(opline->op2);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ var = RT_CONSTANT(opline, opline->op2);
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = EX_CONSTANT(opline->op2);
+ var = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
if (IS_CONST == IS_CV) {
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
@@ -13688,11 +18487,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CONST_HANDLE
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
if (UNEXPECTED(EG(exception))) {
for (i = 0; i <= opline->extended_value; i++) {
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -13708,7 +18507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CONST_HANDLE
for (i = 0; i <= opline->extended_value; i++) {
memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
target += ZSTR_LEN(rope[i]);
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
*target = '\0';
@@ -13725,28 +18524,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_TMP_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -13759,7 +18557,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON
if (IS_CONST != IS_UNUSED) {
- zval *offset = EX_CONSTANT(opline->op2);
+ zval *offset = RT_CONSTANT(opline, opline->op2);
zend_string *str;
zend_ulong hval;
@@ -13797,14 +18595,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -13819,20 +18617,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HAND
array = EX_VAR(opline->result.var);
if (IS_TMP_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_TMP_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -13843,11 +18637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -13885,10 +18675,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -13920,7 +18715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
/* Set the new yielded key */
if (IS_CONST != IS_UNUSED) {
- zval *key = EX_CONSTANT(opline->op2);
+ zval *key = RT_CONSTANT(opline, opline->op2);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -13976,7 +18771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLE
USE_OPLINE
zend_free_op free_op1;
zval *op1;
- HashTable *ht = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
int result;
SAVE_OPLINE();
@@ -14011,6 +18806,243 @@ 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_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)) {
+ 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 {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ /* Behave like FETCH_OBJ_W */
+ 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));
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zend_string **rope;
+ zval *var;
+
+ /* op1 and result are the same */
+ rope = (zend_string**)EX_VAR(opline->op1.var);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
+ } else {
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ } else {
+ rope[opline->extended_value] = Z_STR_P(var);
+ }
+ } else {
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ }
+ rope[opline->extended_value] = zval_get_string_func(var);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zend_string **rope;
+ zval *var, *ret;
+ uint32_t i;
+ size_t len = 0;
+ char *target;
+
+ rope = (zend_string**)EX_VAR(opline->op1.var);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
+ } else {
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+ rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ } else {
+ rope[opline->extended_value] = Z_STR_P(var);
+ }
+ } else {
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ }
+ rope[opline->extended_value] = zval_get_string_func(var);
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(EG(exception))) {
+ for (i = 0; i <= opline->extended_value; i++) {
+ zend_string_release_ex(rope[i], 0);
+ }
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ }
+ }
+ for (i = 0; i <= opline->extended_value; i++) {
+ len += ZSTR_LEN(rope[i]);
+ }
+ ret = EX_VAR(opline->result.var);
+ ZVAL_STR(ret, zend_string_alloc(len, 0));
+ target = Z_STRVAL_P(ret);
+ for (i = 0; i <= opline->extended_value; i++) {
+ memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
+ target += ZSTR_LEN(rope[i]);
+ zend_string_release_ex(rope[i], 0);
+ }
+ *target = '\0';
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *expr_ptr, new_expr;
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ expr_ptr = NULL;
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
+
+ } else {
+ expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_TMP_VAR) {
+ /* pass */
+ } else if (IS_TMP_VAR == IS_CONST) {
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else if (IS_TMP_VAR == IS_CV) {
+ ZVAL_DEREF(expr_ptr);
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else /* if (IS_TMP_VAR == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+
+ expr_ptr = Z_REFVAL_P(expr_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ expr_ptr = &new_expr;
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
+ }
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zend_string *str;
+ zend_ulong hval;
+
+add_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
+ }
+str_index:
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else {
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_TMP_VAR != IS_UNUSED) {
+ size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
+ ZVAL_ARR(array, zend_new_array(size));
+ /* Explicitly initialize array as not-packed if flag is set */
+ if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -14055,11 +19087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -14097,10 +19125,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -14183,42 +19216,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -14227,11 +19224,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -14269,10 +19262,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -14357,41 +19355,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -14454,28 +19428,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_TMP_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -14526,14 +19499,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -14548,20 +19521,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HAN
array = EX_VAR(opline->result.var);
if (IS_TMP_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_TMP_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -14572,11 +19541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -14614,10 +19579,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -14796,187 +19766,32 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_TMP_UNUSED_HANDL
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if (IS_TMP_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));
- }
-
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
-
- if (IS_TMP_VAR == IS_CONST ||
- (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_TMP_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));
- }
if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
@@ -14991,9 +19806,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CV_HANDLER(Z
rope = (zend_string**)EX_VAR(opline->op1.var);
if (IS_CV == IS_CONST) {
var = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ var = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
if (IS_CV == IS_CV) {
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
@@ -15005,7 +19823,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CV_HANDLER(Z
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -15026,9 +19844,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(Z
rope = (zend_string**)EX_VAR(opline->op1.var);
if (IS_CV == IS_CONST) {
var = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
+ rope[opline->extended_value] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ var = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
if (IS_CV == IS_CV) {
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
@@ -15040,11 +19861,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(Z
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[opline->extended_value] = _zval_get_string_func(var);
+ rope[opline->extended_value] = zval_get_string_func(var);
if (UNEXPECTED(EG(exception))) {
for (i = 0; i <= opline->extended_value; i++) {
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -15060,7 +19881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(Z
for (i = 0; i <= opline->extended_value; i++) {
memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
target += ZSTR_LEN(rope[i]);
- zend_string_release(rope[i]);
+ zend_string_release_ex(rope[i], 0);
}
*target = '\0';
@@ -15077,28 +19898,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_TMP_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -15111,7 +19931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_
if (IS_CV != IS_UNUSED) {
- zval *offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ zval *offset = EX_VAR(opline->op2.var);
zend_string *str;
zend_ulong hval;
@@ -15149,14 +19969,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -15171,20 +19991,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER
array = EX_VAR(opline->result.var);
if (IS_TMP_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_TMP_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -15195,11 +20011,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -15237,10 +20049,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -15328,16 +20145,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL
USE_OPLINE
zend_free_op free_op1;
zval *closure, *var;
- zend_string *var_name;
closure = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (opline->extended_value) {
+ if (opline->extended_value & ZEND_BIND_REF) {
/* By-ref binding */
var = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(var);
- Z_ADDREF_P(var);
+ if (Z_ISREF_P(var)) {
+ Z_ADDREF_P(var);
+ } else {
+ ZVAL_MAKE_REF_EX(var, 2);
+ }
} else {
- var = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ var = EX_VAR(opline->op2.var);
if (UNEXPECTED(Z_ISUNDEF_P(var))) {
SAVE_OPLINE();
var = GET_OP2_UNDEF_CV(var, BP_VAR_R);
@@ -15349,367 +20168,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL
Z_TRY_ADDREF_P(var);
}
- var_name = CV_DEF_OF(EX_VAR_TO_NUM(opline->op2.var));
- zend_closure_bind_var(closure, var_name, var);
+ zend_closure_bind_var_ex(closure, (opline->extended_value & ~ZEND_BIND_REF), var);
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = NULL;
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op2);
-
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- zend_free_op free_op2;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if (IS_TMP_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));
- }
-
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if (IS_TMP_VAR == IS_CONST ||
- (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- /* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
-
- SAVE_OPLINE();
- container = NULL;
-
- if (IS_TMP_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));
- }
- if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var;
-
- /* op1 and result are the same */
- rope = (zend_string**)EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[opline->extended_value] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[opline->extended_value] = _zval_get_string_func(var);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var, *ret;
- uint32_t i;
- size_t len = 0;
- char *target;
-
- rope = (zend_string**)EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
- rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[opline->extended_value] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[opline->extended_value] = _zval_get_string_func(var);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(EG(exception))) {
- for (i = 0; i <= opline->extended_value; i++) {
- zend_string_release(rope[i]);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- }
- for (i = 0; i <= opline->extended_value; i++) {
- len += ZSTR_LEN(rope[i]);
- }
- ret = EX_VAR(opline->result.var);
- ZVAL_STR(ret, zend_string_alloc(len, 0));
- target = Z_STRVAL_P(ret);
- for (i = 0; i <= opline->extended_value; i++) {
- memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
- target += ZSTR_LEN(rope[i]);
- zend_string_release(rope[i]);
- }
- *target = '\0';
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr_ptr, new_expr;
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
- UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
- expr_ptr = NULL;
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
-
- } else {
- expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_TMP_VAR == IS_TMP_VAR) {
- /* pass */
- } else if (IS_TMP_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else if (IS_TMP_VAR == IS_CV) {
- ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else /* if (IS_TMP_VAR == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
-
- expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- }
- }
- }
-
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
- zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_string *str;
- zend_ulong hval;
-
-add_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
- }
-str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto add_again;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- }
- zval_ptr_dtor_nogc(free_op2);
- } else {
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
- }
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zval *array;
- uint32_t size;
- USE_OPLINE
-
- array = EX_VAR(opline->result.var);
- if (IS_TMP_VAR != IS_UNUSED) {
- size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_TMP_VAR != IS_UNUSED) {
- /* Explicitly initialize array as not-packed if flag is set */
- if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
- }
- }
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -15738,7 +20200,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
increment_function(var_ptr);
@@ -15778,7 +20239,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
increment_function(var_ptr);
@@ -15818,7 +20278,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
decrement_function(var_ptr);
@@ -15858,7 +20317,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
decrement_function(var_ptr);
@@ -15879,7 +20337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -15894,8 +20352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
increment_function(var_ptr);
@@ -15912,7 +20369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -15927,8 +20384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
decrement_function(var_ptr);
@@ -15955,7 +20411,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
if (IS_VAR & (IS_VAR|IS_TMP_VAR)) {
if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
SAVE_OPLINE();
- zval_dtor_func(Z_COUNTED_P(free_op1));
+ rc_dtor_func(Z_COUNTED_P(free_op1));
}
}
} else {
@@ -15988,7 +20444,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
retval_ptr = Z_REFVAL_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
Z_ADDREF_P(retval_ptr);
@@ -16026,7 +20482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER
ZVAL_NEW_REF(EX(return_value), retval_ptr);
if (IS_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
+ Z_TRY_ADDREF_P(retval_ptr);
}
}
break;
@@ -16048,8 +20504,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER
}
if (EX(return_value)) {
- ZVAL_MAKE_REF(retval_ptr);
- Z_ADDREF_P(retval_ptr);
+ if (Z_ISREF_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(retval_ptr, 2);
+ }
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
}
@@ -16079,15 +20538,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_VAR_HAND
}
}
} else if (IS_VAR == IS_CV) {
- ZVAL_DEREF(retval);
- ZVAL_COPY(&generator->retval, retval);
+ ZVAL_COPY_DEREF(&generator->retval, retval);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval))) {
zend_refcounted *ref = Z_COUNTED_P(retval);
retval = Z_REFVAL_P(retval);
ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval)) {
Z_ADDREF_P(retval);
@@ -16135,7 +20593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OP
zend_exception_save();
if (IS_VAR != IS_TMP_VAR) {
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
}
zend_throw_exception_object(value);
@@ -16162,15 +20620,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_VAR == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -16242,7 +20699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HA
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -16300,18 +20757,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND
if (Z_ISREF_P(varptr)) {
Z_ADDREF_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
} else {
- ZVAL_NEW_REF(arg, varptr);
- Z_ADDREF_P(arg);
- ZVAL_REF(varptr, Z_REF_P(arg));
+ ZVAL_MAKE_REF_EX(varptr, 2);
}
+ ZVAL_REF(arg, Z_REF_P(varptr));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *varptr, *arg;
@@ -16339,15 +20794,14 @@ send_var_by_ref:
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_VAR == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -16388,15 +20842,14 @@ send_var_by_ref:
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_VAR == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -16409,100 +20862,54 @@ send_var_by_ref:
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_FUNC_ARG_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *arg, *param;
+ zval *varptr, *arg;
zend_free_op free_op1;
- SAVE_OPLINE();
- arg = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- param = ZEND_CALL_VAR(EX(call), opline->result.var);
-
- if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- opline->op2.num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZVAL_COPY(param, arg);
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *result;
- zend_function *constructor;
- zend_class_entry *ce;
- zend_execute_data *call;
+ if (UNEXPECTED(Z_ISREF_P(varptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(varptr);
- SAVE_OPLINE();
- if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
- }
- } else if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ varptr = Z_REFVAL_P(varptr);
+ ZVAL_COPY_VALUE(arg, varptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(arg)) {
+ Z_ADDREF_P(arg);
}
} else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
+ ZVAL_COPY_VALUE(arg, varptr);
}
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
- ZVAL_UNDEF(result);
- HANDLE_EXCEPTION();
- }
+ ZEND_VM_NEXT_OPCODE();
+}
- constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
- if (constructor == NULL) {
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *arg, *param;
+ zend_free_op free_op1;
- /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
- * opcode is DO_FCALL in case EXT instructions are used. */
- if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
- }
+ SAVE_OPLINE();
+ arg = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
- /* Perform a dummy function call */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
- opline->extended_value, NULL, NULL);
- } else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
- init_func_run_time_cache(&constructor->op_array);
- }
- /* We are not handling overloaded classes right now */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
- constructor,
- opline->extended_value,
- ce,
- Z_OBJ_P(result));
- Z_ADDREF_P(result);
+ if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
+ zend_param_must_be_ref(EX(call)->func, opline->op2.num);
}
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
+ ZVAL_COPY(param, arg);
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -16511,6 +20918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
zend_free_op free_op1;
zval *expr;
zval *result = EX_VAR(opline->result.var);
+ HashTable *ht;
SAVE_OPLINE();
expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -16549,16 +20957,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
- ZVAL_NEW_ARR(result);
- zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (IS_VAR == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
+ ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
if (IS_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
} else {
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -16566,19 +20987,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
convert_to_array(result);
}
} else {
- if (Z_TYPE_P(expr) != IS_ARRAY) {
- object_init(result);
- if (Z_TYPE_P(expr) != IS_NULL) {
- expr = zend_hash_add_new(Z_OBJPROP_P(result), ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (IS_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
+ ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
+ if (Z_TYPE_P(expr) == IS_ARRAY) {
+ ht = zend_symtable_to_proptable(Z_ARR_P(expr));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ /* TODO: try not to duplicate immutable arrays as well ??? */
+ ht = zend_array_dup(ht);
+ }
+ Z_OBJ_P(result)->properties = ht;
+ } else if (Z_TYPE_P(expr) != IS_NULL) {
+ Z_OBJ_P(result)->properties = ht = zend_new_array(1);
+ expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
+ if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
+ } else {
+ if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
- } else {
- ZVAL_COPY(result, expr);
- convert_to_object(result);
}
}
}
@@ -16616,7 +21040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -16625,52 +21049,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- zval_ptr_dtor_nogc(free_op1);
- if (iter) {
- OBJ_RELEASE(&iter->std);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op1);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -16715,13 +21100,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
array_ptr = Z_REFVAL_P(array_ref);
}
if (IS_VAR == IS_CONST) {
- zval_copy_ctor_func(array_ptr);
+ ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
} else {
SEPARATE_ARRAY(array_ptr);
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ if (IS_VAR == IS_VAR) {
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ }
ZEND_VM_NEXT_OPCODE();
} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -16739,7 +21126,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -16748,54 +21135,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (IS_VAR == IS_VAR) {
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_VAR == IS_VAR) {
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_VAR == IS_VAR) {
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- } else {
- zval_ptr_dtor_nogc(free_op1);
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -16805,8 +21145,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -16843,7 +21182,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
while (1) {
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
/* reached end of iteration */
- goto fe_fetch_r_exit;
+fe_fetch_r_exit:
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
}
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
@@ -16862,20 +21203,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
p++;
}
Z_FE_POS_P(array) = pos + 1;
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (!p->key) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else {
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
}
}
- } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
+ } else {
zend_object_iterator *iter;
+ ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
if ((iter = zend_iterator_unwrap(array)) == NULL) {
/* plain object */
- fe_ht = Z_OBJPROP_P(array);
+ fe_ht = Z_OBJPROP_P(array);
pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
p = fe_ht->arData + pos;
while (1) {
@@ -16901,7 +21243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (UNEXPECTED(!p->key)) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else if (ZSTR_VAL(p->key)[0]) {
@@ -16914,10 +21256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos + 1;
} else {
if (EXPECTED(++iter->index > 0)) {
/* This could cause an endless loop if index becomes zero again.
@@ -16945,7 +21284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
/* failure in get_current_data */
goto fe_fetch_r_exit;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (iter->funcs->get_current_key) {
iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -16958,27 +21297,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
}
value_type = Z_TYPE_INFO_P(value);
}
- } else {
- zend_error(E_WARNING, "Invalid argument supplied for foreach()");
- if (UNEXPECTED(EG(exception))) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-fe_fetch_r_exit:
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
}
if (EXPECTED(opline->op2_type == IS_CV)) {
- zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ zval *variable_ptr = EX_VAR(opline->op2.var);
zend_assign_to_variable(variable_ptr, value, IS_CV);
} else {
zval *res = EX_VAR(opline->op2.var);
zend_refcounted *gc = Z_COUNTED_P(value);
ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
- if (EXPECTED((value_type & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0)) {
- GC_REFCOUNT(gc)++;
+ if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
+ GC_ADDREF(gc);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -17023,24 +21353,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (!p->key) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else {
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
} else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
zend_object_iterator *iter;
if ((iter = zend_iterator_unwrap(array)) == NULL) {
/* plain object */
- fe_ht = Z_OBJPROP_P(array);
+ fe_ht = Z_OBJPROP_P(array);
pos = zend_hash_iterator_pos(Z_FE_ITER_P(EX_VAR(opline->op1.var)), fe_ht);
p = fe_ht->arData + pos;
while (1) {
@@ -17066,7 +21393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
pos++;
p++;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (UNEXPECTED(!p->key)) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else if (ZSTR_VAL(p->key)[0]) {
@@ -17079,10 +21406,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
}
}
- if (++pos >= fe_ht->nNumUsed) {
- pos = HT_INVALID_IDX;
- }
- EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
} else {
if (++iter->index > 0) {
/* This could cause an endless loop if index becomes zero again.
@@ -17110,7 +21434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
/* failure in get_current_data */
goto fe_fetch_w_exit;
}
- if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
+ if (RETURN_VALUE_USED(opline)) {
if (iter->funcs->get_current_key) {
iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -17142,12 +21466,12 @@ fe_fetch_w_exit:
ZVAL_COPY_VALUE_EX(ref, value, gc, value_type);
}
if (EXPECTED(opline->op2_type == IS_CV)) {
- zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ zval *variable_ptr = EX_VAR(opline->op2.var);
if (EXPECTED(variable_ptr != value)) {
zend_reference *ref;
ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+ GC_ADDREF(ref);
zval_ptr_dtor(variable_ptr);
ZVAL_REF(variable_ptr, ref);
}
@@ -17195,55 +21519,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
} else if (IS_VAR == IS_VAR && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- }
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *ref = NULL;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) {
- if (IS_VAR == IS_VAR) {
- ref = value;
- }
- value = Z_REFVAL_P(value);
- }
-
- if (Z_TYPE_P(value) > IS_NULL) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, value);
- if (IS_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if (IS_VAR == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (IS_VAR == IS_VAR && ref) {
- zend_reference *r = Z_REF_P(ref);
-
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
- efree_size(r, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- }
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
zval_ptr_dtor_nogc(free_op1);
@@ -17266,8 +21548,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR
}
if (IS_VAR == IS_CV) {
- ZVAL_DEREF(value);
- ZVAL_COPY(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (IS_VAR == IS_VAR) {
if (UNEXPECTED(Z_ISREF_P(value))) {
ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
@@ -17397,35 +21678,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result = 0;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) {
- if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) {
- const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value));
-
- if (EXPECTED(type_name != NULL)) {
- result = 1;
- }
- } else {
- result = 1;
- }
- } else if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -17451,40 +21703,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE
zend_free_op free_op1;
uint32_t arg_num = opline->op2.num;
- if (EXPECTED(0)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- goto send_var_by_ref_simple;
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-send_var_by_ref_simple:
- ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-
- varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
-
- if (IS_VAR == IS_CV) {
- ZVAL_COPY(arg, varptr);
- } else /* if (IS_VAR == IS_VAR) */ {
- ZVAL_COPY_VALUE(arg, varptr);
- }
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varptr, *arg;
- zend_free_op free_op1;
- uint32_t arg_num = opline->op2.num;
-
- if (EXPECTED(1)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- goto send_var_by_ref_simple;
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-send_var_by_ref_simple:
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -17509,7 +21728,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HA
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_identical_function(op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -17527,7 +21746,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_not_identical_function(op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -17552,34 +21771,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
- value = get_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_data1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -17587,7 +21805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
@@ -17612,15 +21830,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = EX_CONSTANT(opline->op2);
-
if (IS_CONST == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
@@ -17630,10 +21847,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -17649,39 +21865,39 @@ assign_dim_op_new_array:
} else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
@@ -17698,7 +21914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
zval *value;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
+ value = RT_CONSTANT(opline, opline->op2);
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
@@ -17707,7 +21923,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
}
} else {
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
binary_op(var_ptr, var_ptr, value);
@@ -17726,7 +21941,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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(1)) {
ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -17746,7 +21964,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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));
@@ -17766,7 +21987,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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));
@@ -17975,25 +22199,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -18007,7 +22231,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -18020,7 +22243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -18053,29 +22276,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -18083,8 +22307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -18093,7 +22316,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -18119,13 +22342,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HAN
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_W(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -18137,53 +22359,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HA
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_RW(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -18194,86 +22391,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_UNSET(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_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));
- }
-
- offset = EX_CONSTANT(opline->op2);
-
- if (IS_VAR == IS_CONST ||
- (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -18281,8 +22404,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
@@ -18291,13 +22413,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
+ 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);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -18305,8 +22427,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -18314,49 +22435,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
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 = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
+ 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);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- 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));
- }
if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
@@ -18364,7 +22463,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
{
USE_OPLINE
zend_free_op free_op1;
- zval *container, *property;
+ zval *container, *property, *result;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -18373,14 +22472,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ 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(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container, *dim;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(container, dim, IS_CONST OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_W(container, dim, IS_CONST OPLINE_CC EXECUTE_DATA_CC);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -18397,58 +22518,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
+ property = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -18462,11 +22555,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -18485,24 +22578,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -18515,12 +22604,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -18529,7 +22613,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -18555,58 +22639,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -18620,11 +22676,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -18643,24 +22699,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -18673,12 +22725,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -18687,7 +22734,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -18713,58 +22760,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -18778,11 +22797,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -18801,24 +22820,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -18831,12 +22846,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -18845,7 +22855,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -18871,58 +22881,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -18936,11 +22918,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -18959,24 +22941,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -18989,12 +22967,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -19003,7 +22976,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -19021,7 +22994,7 @@ 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;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -19033,13 +23006,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -19048,9 +23041,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -19062,37 +23055,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ dim = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -19125,13 +23116,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -19140,9 +23151,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -19154,38 +23165,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -19218,13 +23227,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -19233,9 +23262,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -19247,38 +23276,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -19299,7 +23326,7 @@ 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;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -19311,13 +23338,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -19326,9 +23373,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -19340,37 +23387,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -19394,7 +23439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U
zval *variable_ptr;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
+ value = RT_CONSTANT(opline, opline->op2);
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
@@ -19422,7 +23467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U
zval *variable_ptr;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
+ value = RT_CONSTANT(opline, opline->op2);
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
@@ -19455,14 +23500,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CONST != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_VAR == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -19477,16 +23524,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST &&
IS_CONST == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_VAR != IS_CONST &&
IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_CONST != IS_UNUSED) {
- function_name = EX_CONSTANT(opline->op2);
+ function_name = RT_CONSTANT(opline, opline->op2);
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
@@ -19505,17 +23552,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -19523,11 +23570,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_VAR == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -19556,22 +23599,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -19601,29 +23630,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
{
zend_class_entry *ce, *scope;
zend_class_constant *c;
- zval *value;
+ zval *value, *zv;
USE_OPLINE
SAVE_OPLINE();
do {
if (IS_VAR == IS_CONST) {
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-#ifdef ZTS
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
-#endif
+ if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
- } else if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ } else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+ ce = CACHED_PTR(opline->extended_value);
} else {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
} else {
if (IS_VAR == IS_UNUSED) {
@@ -19636,48 +23661,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
} else {
ce = Z_CE_P(EX_VAR(opline->op1.var));
}
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
break;
}
}
- if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ if (EXPECTED(zv != NULL)) {
+ c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
if (!zend_verify_const_access(c, scope)) {
- zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
value = &c->value;
- if (Z_CONSTANT_P(value)) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
zval_update_constant_ex(value, c->ce);
if (UNEXPECTED(EG(exception) != NULL)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
}
- if (IS_VAR == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), value);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
- }
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
} else {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
} while (0);
-#ifdef ZTS
- if (ce->type == ZEND_INTERNAL_CLASS) {
- ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), value);
-#endif
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
ZEND_VM_NEXT_OPCODE();
}
@@ -19692,28 +23707,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CON
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -19726,7 +23740,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CON
if (IS_CONST != IS_UNUSED) {
- zval *offset = EX_CONSTANT(opline->op2);
+ zval *offset = RT_CONSTANT(opline, opline->op2);
zend_string *str;
zend_ulong hval;
@@ -19764,14 +23778,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -19786,20 +23800,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HAND
array = EX_VAR(opline->result.var);
if (IS_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -19813,7 +23823,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDL
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
do {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -19880,8 +23890,11 @@ num_index_dim:
}
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
} else {
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
}
} else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -19905,7 +23918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL
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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -19919,11 +23932,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
@@ -19939,11 +23950,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -19981,10 +23988,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -20017,7 +24029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
/* Set the new yielded key */
if (IS_CONST != IS_UNUSED) {
- zval *key = EX_CONSTANT(opline->op2);
+ zval *key = RT_CONSTANT(opline, opline->op2);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -20073,7 +24085,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE
USE_OPLINE
zend_free_op free_op1;
zval *op1;
- HashTable *ht = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
int result;
SAVE_OPLINE();
@@ -20108,6 +24120,2073 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+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;
+ zval *object;
+ zval *property;
+ zval *value;
+ zval *zptr;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+
+ do {
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+
+ if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
+ }
+ }
+
+ /* here we are sure we are dealing with an object */
+assign_op_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ if (UNEXPECTED(Z_ISERROR_P(zptr))) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ ZVAL_DEREF(zptr);
+
+ 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);
+ }
+ } while (0);
+
+ FREE_OP(free_op_data1);
+ 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_dim_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;
+ zval *var_ptr;
+ zval *value, *container, *dim;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+assign_dim_op_array:
+ SEPARATE_ARRAY(container);
+assign_dim_op_new_array:
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
+ if (UNEXPECTED(!var_ptr)) {
+ zend_cannot_add_element();
+ goto assign_dim_op_ret_null;
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
+ } else {
+ var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
+ }
+ 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 (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(container))) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto assign_dim_op_array;
+ }
+ } else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
+assign_dim_op_convert_to_array:
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
+ }
+
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
+ } else {
+ if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
+ } else {
+ zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
+ zend_wrong_string_offset(EXECUTE_DATA_C);
+ }
+ UNDEF_RESULT();
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ goto assign_dim_op_convert_to_array;
+ } else {
+ if (UNEXPECTED(IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
+ zend_use_scalar_as_array();
+ }
+assign_dim_op_ret_null:
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ }
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ FREE_OP(free_op_data1);
+ 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_binary_assign_op_simple_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *var_ptr;
+ zval *value;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ ZVAL_DEREF(var_ptr);
+
+ binary_op(var_ptr, var_ptr, value);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+ }
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+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));
+#else
+# if 0 || IS_VAR != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
+ USE_OPLINE
+# endif
+
+ if (EXPECTED(1)) {
+ 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));
+ }
+# 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_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));
+#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(1)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ }
+# 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_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));
+#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));
+ }
+# 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_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));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_pre_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *object;
+ zval *property;
+ zval *zptr;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+
+ do {
+ if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
+ }
+ }
+
+ /* here we are sure we are dealing with an object */
+pre_incdec_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ 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);
+ }
+ } 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);
+ }
+ }
+ } 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);
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *object;
+ zval *property;
+ zval *zptr;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+
+ do {
+ if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
+ }
+ }
+
+ /* here we are sure we are dealing with an object */
+post_incdec_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ 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);
+ }
+ } else {
+ ZVAL_DEREF(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ if (inc) {
+ increment_function(zptr);
+ } else {
+ decrement_function(zptr);
+ }
+ }
+ }
+ } 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);
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_W(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_RW(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ 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_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_UNSET(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
+
+ 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);
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
+
+ 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);
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ /* Behave like FETCH_OBJ_W */
+ 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));
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container, *property, *result;
+
+ 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);
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container, *dim;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(container, dim, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_W(container, dim, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *object, *property, *value, tmp;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ 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)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+
+ goto exit_assign_obj;
+ }
+ }
+
+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*));
+ 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) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_CONST);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
+
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_CONST == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ }
+ }
+
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+
+ goto exit_assign_obj;
+ }
+
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ 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);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+exit_assign_obj:
+ 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2, free_op_data;
+ zval *object, *property, *value, tmp;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ 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)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
+ }
+
+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*));
+ 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) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
+
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_TMP_VAR == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ }
+ }
+
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
+
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ 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);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+exit_assign_obj:
+ 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2, free_op_data;
+ zval *object, *property, *value, tmp;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ 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)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
+ }
+
+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*));
+ 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) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_VAR);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
+
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_VAR == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ }
+ }
+
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
+
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ 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);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+exit_assign_obj:
+ 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *object, *property, *value, tmp;
+
+ SAVE_OPLINE();
+ object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ 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)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+
+ goto exit_assign_obj;
+ }
+ }
+
+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*));
+ 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) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_CV);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
+
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_CV == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ }
+ }
+
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+
+ goto exit_assign_obj;
+ }
+
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ 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);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+exit_assign_obj:
+ 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_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *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);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ }
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ goto assign_dim_error;
+ }
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+assign_dim_error:
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *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);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ }
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ zval_ptr_dtor_nogc(free_op_data);
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+assign_dim_error:
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *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);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ }
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ zval_ptr_dtor_nogc(free_op_data);
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+assign_dim_error:
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *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);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ }
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+assign_dim_error:
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ /* assign_dim has two opcodes! */
+ 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
+ zval *function_name;
+ zend_class_entry *ce;
+ zend_object *object;
+ zend_function *fbc;
+ zend_execute_data *call;
+
+ SAVE_OPLINE();
+
+ if (IS_VAR == IS_CONST) {
+ /* no function found. try a static method in class */
+ ce = CACHED_PTR(opline->result.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
+ }
+ } else if (IS_VAR == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op1.var));
+ }
+
+ if (IS_VAR == IS_CONST &&
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
+ /* nothing to do */
+ } else if (IS_VAR != IS_CONST &&
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Function name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+ }
+
+ if (ce->get_static_method) {
+ fbc = ce->get_static_method(ce, Z_STR_P(function_name));
+ } else {
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ }
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(ce, Z_STR_P(function_name));
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+ } else {
+ if (UNEXPECTED(ce->constructor == NULL)) {
+ zend_throw_error(NULL, "Cannot call constructor");
+ HANDLE_EXCEPTION();
+ }
+ if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+ zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
+ HANDLE_EXCEPTION();
+ }
+ fbc = ce->constructor;
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ }
+
+ object = NULL;
+ if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
+ if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+ object = Z_OBJ(EX(This));
+ ce = object->ce;
+ } else {
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ }
+
+ if (IS_VAR == IS_UNUSED) {
+ /* previous opcode is ZEND_FETCH_CLASS */
+ if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
+ (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
+ if (Z_TYPE(EX(This)) == IS_OBJECT) {
+ ce = Z_OBJCE(EX(This));
+ } else {
+ ce = Z_CE(EX(This));
+ }
+ }
+ }
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, ce, object);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *expr_ptr, new_expr;
+
+ SAVE_OPLINE();
+ if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ } else {
+ expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (IS_VAR == IS_TMP_VAR) {
+ /* pass */
+ } else if (IS_VAR == IS_CONST) {
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else if (IS_VAR == IS_CV) {
+ ZVAL_DEREF(expr_ptr);
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else /* if (IS_VAR == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+
+ expr_ptr = Z_REFVAL_P(expr_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ expr_ptr = &new_expr;
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
+ }
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zend_string *str;
+ zend_ulong hval;
+
+add_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
+ }
+str_index:
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else {
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_VAR != IS_UNUSED) {
+ size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
+ ZVAL_ARR(array, zend_new_array(size));
+ /* Explicitly initialize array as not-packed if flag is set */
+ if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+ zval *offset;
+ zend_ulong hval;
+ zend_string *key;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ do {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ HashTable *ht;
+
+unset_dim_array:
+ SEPARATE_ARRAY(container);
+ ht = Z_ARRVAL_P(container);
+offset_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ key = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(key, hval)) {
+ goto num_index_dim;
+ }
+ }
+str_index_dim:
+ if (ht == &EG(symbol_table)) {
+ zend_delete_global_variable(key);
+ } else {
+ zend_hash_del(ht, key);
+ }
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index_dim:
+ zend_hash_index_del(ht, hval);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ key = ZSTR_EMPTY_ALLOC();
+ goto str_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index_dim;
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ key = ZSTR_EMPTY_ALLOC();
+ goto str_index_dim;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ }
+ break;
+ } else if (Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto unset_dim_array;
+ }
+ }
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_use_object_as_array();
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
+ } else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ zend_throw_error(NULL, "Cannot unset string offsets");
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *container;
+ zval *offset;
+
+ 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));
+ }
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ do {
+ if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ if (Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (Z_TYPE_P(container) != IS_OBJECT) {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
+ } else {
+ zend_wrong_property_unset(offset);
+ }
+ } while (0);
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -20208,11 +26287,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -20250,10 +26325,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -20440,49 +26520,40 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE
value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) &&
- UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) {
+ if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } 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");
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
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))) {
- zend_error(E_NOTICE, "Only variables should be assigned by reference");
- if (UNEXPECTED(EG(exception) != NULL)) {
+
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) {
if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
- }
- /* zend_assign_to_variable() always takes care of op2, never free it! */
-
+ /* op2 freed by assign_to_variable */
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE();
} else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
+ }
- if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) ||
- (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr)))) {
- variable_ptr = &EG(uninitialized_zval);
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
-
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
+ if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20495,11 +26566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -20537,10 +26604,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -20638,15 +26710,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
+ dim = NULL;
if (IS_UNUSED == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = NULL;
-
if (IS_UNUSED == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
@@ -20656,10 +26727,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -20675,39 +26745,39 @@ assign_dim_op_new_array:
} else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
dim = NULL;
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
@@ -20722,7 +26792,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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));
@@ -20804,13 +26877,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HA
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_W(container, NULL, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20822,53 +26894,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_H
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_RW(container, NULL, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -20876,7 +26923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
USE_OPLINE
zend_free_op free_op1;
zval *object_ptr;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -20888,10 +26935,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
dim = NULL;
@@ -20903,9 +26970,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -20918,34 +26985,32 @@ try_assign_dim_array:
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
dim = NULL;
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
dim = NULL;
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = NULL;
assign_dim_error:
@@ -20980,10 +27045,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
dim = NULL;
@@ -20995,9 +27080,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -21012,16 +27097,15 @@ try_assign_dim_array:
dim = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -21029,16 +27113,15 @@ try_assign_dim_array:
} else {
dim = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = NULL;
assign_dim_error:
@@ -21073,10 +27156,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
dim = NULL;
@@ -21088,9 +27191,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -21105,16 +27208,15 @@ try_assign_dim_array:
dim = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -21122,16 +27224,15 @@ try_assign_dim_array:
} else {
dim = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = NULL;
assign_dim_error:
@@ -21154,7 +27255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
USE_OPLINE
zend_free_op free_op1;
zval *object_ptr;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -21166,10 +27267,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
dim = NULL;
@@ -21181,9 +27302,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -21198,15 +27319,14 @@ try_assign_dim_array:
dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -21214,16 +27334,15 @@ try_assign_dim_array:
} else {
dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = NULL;
assign_dim_error:
@@ -21254,14 +27373,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_UNUSED != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_VAR == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -21276,12 +27397,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_VAR != IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_UNUSED != IS_UNUSED) {
@@ -21304,17 +27425,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -21322,11 +27443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_UNUSED == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_VAR == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -21355,22 +27472,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -21446,6 +27549,78 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *result;
+ zend_function *constructor;
+ zend_class_entry *ce;
+ zend_execute_data *call;
+
+ SAVE_OPLINE();
+ if (IS_VAR == IS_CONST) {
+ ce = CACHED_PTR(opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
+ }
+ CACHE_PTR(opline->op2.num, ce);
+ }
+ } else if (IS_VAR == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
+ }
+
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+ ZVAL_UNDEF(result);
+ HANDLE_EXCEPTION();
+ }
+
+ constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
+ if (constructor == NULL) {
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+
+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
+ * opcode is DO_FCALL in case EXT instructions are used. */
+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ }
+
+ /* Perform a dummy function call */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
+ opline->extended_value, NULL, NULL);
+ } else {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ init_func_run_time_cache(&constructor->op_array);
+ }
+ /* We are not handling overloaded classes right now */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
+ constructor,
+ opline->extended_value,
+ ce,
+ Z_OBJ_P(result));
+ Z_ADDREF_P(result);
+ }
+
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -21456,28 +27631,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNU
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -21528,14 +27702,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -21550,20 +27724,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HAN
array = EX_VAR(opline->result.var);
if (IS_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -21589,11 +27759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -21631,10 +27797,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -21730,15 +27901,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDL
ZVAL_NULL(Z_REFVAL_P(op1));
ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
} else {
- ZVAL_MAKE_REF(op1);
- ZVAL_COPY(EX_VAR(opline->result.var), op1);
+ if (Z_ISREF_P(op1)) {
+ Z_ADDREF_P(op1);
+ } else {
+ ZVAL_MAKE_REF_EX(op1, 2);
+ }
+ ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
op1 = Z_INDIRECT_P(op1);
if (EXPECTED(!Z_ISREF_P(op1))) {
- ZVAL_MAKE_REF(op1);
+ ZVAL_MAKE_REF_EX(op1, 2);
+ } else {
+ GC_ADDREF(Z_REF_P(op1));
}
- GC_REFCOUNT(Z_REF_P(op1))++;
ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
@@ -21842,42 +28018,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDL
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
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
@@ -21897,31 +28037,30 @@ 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_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_data1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -21929,7 +28068,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
@@ -21954,15 +28093,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
+ dim = EX_VAR(opline->op2.var);
if (IS_CV == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
-
if (IS_CV == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
@@ -21972,10 +28110,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -21991,39 +28128,39 @@ assign_dim_op_new_array:
} else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
@@ -22049,7 +28186,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
}
} else {
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
binary_op(var_ptr, var_ptr, value);
@@ -22068,7 +28204,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(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(1)) {
ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -22088,7 +28227,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -22108,7 +28250,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -22321,21 +28466,21 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -22349,7 +28494,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -22362,7 +28506,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -22399,25 +28543,26 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -22425,8 +28570,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -22435,7 +28579,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -22461,13 +28605,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLE
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_W(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -22479,53 +28622,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDL
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_RW(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -22536,86 +28654,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HA
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_UNSET(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_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));
- }
-
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_CONST ||
- (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
- }
+ if (IS_VAR == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -22623,8 +28667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
@@ -22634,12 +28677,12 @@ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
+ 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);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -22647,8 +28690,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -22657,48 +28699,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
+ 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);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- 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));
- }
if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
@@ -22706,7 +28726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA
{
USE_OPLINE
zend_free_op free_op1;
- zval *container, *property;
+ zval *container, *property, *result;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -22716,13 +28736,35 @@ 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(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
+ if (IS_VAR == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *container, *dim;
+
+ SAVE_OPLINE();
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
+
+ if (IS_VAR == IS_VAR
+ && Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT
+ && UNEXPECTED(!Z_ISREF_P(container))
+ ) {
+ zend_error(E_NOTICE, "Attempting to set reference to non referenceable value");
+ zend_fetch_dimension_address_LIST_r(container, dim, IS_CV OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_fetch_dimension_address_W(container, dim, IS_CV OPLINE_CC EXECUTE_DATA_CC);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -22740,57 +28782,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
}
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -22804,11 +28818,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -22827,24 +28841,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -22857,12 +28867,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -22871,7 +28876,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -22901,54 +28906,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -22962,11 +28939,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -22985,24 +28962,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -23015,12 +28988,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -23029,7 +28997,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -23059,54 +29027,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -23120,11 +29060,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -23143,24 +29083,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -23173,12 +29109,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -23187,7 +29118,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -23217,54 +29148,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -23278,11 +29181,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -23301,24 +29204,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -23331,12 +29230,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -23345,7 +29239,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -23363,7 +29257,7 @@ 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;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -23375,13 +29269,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
if (IS_CV == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -23390,9 +29304,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23405,34 +29319,32 @@ try_assign_dim_array:
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
assign_dim_error:
@@ -23467,13 +29379,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
if (IS_CV == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -23482,9 +29414,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23499,16 +29431,15 @@ try_assign_dim_array:
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -23516,16 +29447,15 @@ try_assign_dim_array:
} else {
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
assign_dim_error:
@@ -23560,13 +29490,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
if (IS_CV == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -23575,9 +29525,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23592,16 +29542,15 @@ try_assign_dim_array:
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -23609,16 +29558,15 @@ try_assign_dim_array:
} else {
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
assign_dim_error:
@@ -23641,7 +29589,7 @@ 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;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
@@ -23653,13 +29601,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ dim = EX_VAR(opline->op2.var);
if (IS_CV == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -23668,9 +29636,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23685,15 +29653,14 @@ try_assign_dim_array:
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
@@ -23701,16 +29668,15 @@ try_assign_dim_array:
} else {
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
assign_dim_error:
@@ -23795,46 +29761,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER
value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) &&
- UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) {
+ if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } 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");
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))) {
- zend_error(E_NOTICE, "Only variables should be assigned by reference");
- if (UNEXPECTED(EG(exception) != NULL)) {
+
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
- }
- /* zend_assign_to_variable() always takes care of op2, never free it! */
-
+ /* op2 freed by assign_to_variable */
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ ZEND_VM_NEXT_OPCODE();
} else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
+ }
- if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) ||
- (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr)))) {
- variable_ptr = &EG(uninitialized_zval);
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
-
+ 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);};
@@ -23854,14 +29811,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CV != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_VAR == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -23876,16 +29835,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_VAR == IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_VAR != IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_CV != IS_UNUSED) {
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ function_name = EX_VAR(opline->op2.var);
if (IS_CV != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
@@ -23904,17 +29863,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -23922,11 +29881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_VAR == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -23955,22 +29910,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -24006,28 +29947,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_TMP_VAR) {
/* pass */
} else if (IS_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_VAR == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -24040,7 +29980,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_
if (IS_CV != IS_UNUSED) {
- zval *offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ zval *offset = EX_VAR(opline->op2.var);
zend_string *str;
zend_ulong hval;
@@ -24078,14 +30018,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -24100,20 +30040,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER
array = EX_VAR(opline->result.var);
if (IS_VAR != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_VAR != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -24127,7 +30063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ offset = EX_VAR(opline->op2.var);
do {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -24194,8 +30130,11 @@ num_index_dim:
}
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
} else {
+ if (IS_CV == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
}
} else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -24233,11 +30172,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
@@ -24253,11 +30190,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -24295,10 +30228,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -24428,7 +30366,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
}
}
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op2.var);
zend_assign_to_variable(variable_ptr, value, IS_CV);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -24480,472 +30418,379 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
}
}
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op2.var);
zend_assign_to_variable(variable_ptr, value, IS_CV);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
- zval *object;
- zval *property;
- zval *value;
- zval *zptr;
-
- SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
-
- do {
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ uint32_t arg_num = opline->op2.num;
- if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- break;
- }
+ if (EXPECTED(0)) {
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ } else {
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
}
+ } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ } else {
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
- /* here we are sure we are dealing with an object */
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ uint32_t arg_num = opline->op2.num;
- binary_op(zptr, zptr, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
- }
+ if (EXPECTED(1)) {
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
} else {
- zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
}
- } while (0);
-
- FREE_OP(free_op_data1);
- 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);
+ } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
+ ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ } else {
+ ZEND_DEL_CALL_FLAG(EX(call), ZEND_CALL_SEND_ARG_BY_REF);
+ }
+ ZEND_VM_NEXT_OPCODE();
}
-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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
- zval *var_ptr;
- zval *value, *container, *dim;
+
+ zval *obj;
+ zend_class_entry *ce, *scope;
+ zend_function *clone;
+ zend_object_clone_obj_t clone_call;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ obj = &EX(This);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-assign_dim_op_array:
- SEPARATE_ARRAY(container);
-assign_dim_op_new_array:
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
- if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_op_ret_null;
- }
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
- } else {
- var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
+ do {
+ if (IS_UNUSED == IS_CONST ||
+ (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+ obj = Z_REFVAL_P(obj);
+ if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
+ break;
+ }
}
- if (UNEXPECTED(!var_ptr)) {
- goto assign_dim_op_ret_null;
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(obj, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
}
- ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ zend_throw_error(NULL, "__clone method called on non-object");
+
+ HANDLE_EXCEPTION();
}
+ } while (0);
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ ce = Z_OBJCE_P(obj);
+ clone = ce->clone;
+ clone_call = Z_OBJ_HT_P(obj)->clone_obj;
+ if (UNEXPECTED(clone_call == NULL)) {
+ zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
- binary_op(var_ptr, var_ptr, value);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(container))) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto assign_dim_op_array;
- }
- } else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
-assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto assign_dim_op_new_array;
- }
+ if (clone) {
+ if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
+ /* Ensure that if we're calling a private function, we're allowed to do so.
+ */
+ scope = EX(func)->op_array.scope;
+ if (!zend_check_private(clone, scope, clone->common.function_name)) {
+ zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
+ /* Ensure that if we're calling a protected function, we're allowed to do so.
+ */
+ scope = EX(func)->op_array.scope;
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
- } else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- } else {
- zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
- }
- UNDEF_RESULT();
- } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
- goto assign_dim_op_convert_to_array;
- } else {
- if (UNEXPECTED(IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
-assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
}
}
- zval_ptr_dtor_nogc(free_op2);
- FREE_OP(free_op_data1);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *var_ptr;
- zval *value;
SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (IS_UNUSED != IS_UNUSED) {
- if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ zval *ptr = NULL;
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (Z_TYPE_P(ptr) == IS_LONG) {
+ EG(exit_status) = Z_LVAL_P(ptr);
+ } else {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(ptr)) {
+ ptr = Z_REFVAL_P(ptr);
+ if (Z_TYPE_P(ptr) == IS_LONG) {
+ EG(exit_status) = Z_LVAL_P(ptr);
+ break;
+ }
+ }
+ zend_print_zval(ptr, 0);
+ }
+ } while (0);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
}
-
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ zend_bailout();
+ ZEND_VM_NEXT_OPCODE(); /* Never reached */
}
-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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
-#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));
-#else
-# if 0 || IS_VAR != IS_UNUSED
+ uint32_t fetch_type;
+ zend_class_entry *called_scope, *scope;
USE_OPLINE
- if (EXPECTED(1)) {
- 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));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
+ fetch_type = opline->op1.num;
-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));
-#else
-# if 0 || IS_VAR != IS_UNUSED
- USE_OPLINE
-
- 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(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ scope = EX(func)->op_array.scope;
+ if (UNEXPECTED(scope == NULL)) {
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use \"%s\" when no class scope is active",
+ fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
+ fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
-# 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_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));
-#else
-# if 0 || IS_VAR != IS_UNUSED
- USE_OPLINE
- 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));
+ switch (fetch_type) {
+ case ZEND_FETCH_CLASS_SELF:
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
+ break;
+ case ZEND_FETCH_CLASS_PARENT:
+ if (UNEXPECTED(scope->parent == NULL)) {
+ SAVE_OPLINE();
+ zend_throw_error(NULL,
+ "Cannot use \"parent\" when current class scope has no parent");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
+ break;
+ case ZEND_FETCH_CLASS_STATIC:
+ if (Z_TYPE(EX(This)) == IS_OBJECT) {
+ called_scope = Z_OBJCE(EX(This));
+ } else {
+ called_scope = Z_CE(EX(This));
+ }
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
}
-# 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ USE_OPLINE
+ zend_free_op free_op_data1;
+ zval *object;
+ zval *property;
+ zval *value;
+ zval *zptr;
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ SAVE_OPLINE();
+ object = &EX(This);
-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));
-}
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ property = RT_CONSTANT(opline, opline->op2);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ do {
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
-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));
-}
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
+ }
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ /* here we are sure we are dealing with an object */
+assign_op_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ if (UNEXPECTED(Z_ISERROR_P(zptr))) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ ZVAL_DEREF(zptr);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ 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);
+ }
+ } while (0);
-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));
-}
+ FREE_OP(free_op_data1);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+#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));
+#else
+# if 0 || IS_UNUSED != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
+ USE_OPLINE
+# endif
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ }
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ }
+# endif
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_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));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(mul_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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_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));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(shift_left_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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_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));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_or_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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_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));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *object;
zval *property;
zval *zptr;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = RT_CONSTANT(opline, opline->op2);
do {
- if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -24959,7 +30804,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -24972,63 +30816,63 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *object;
zval *property;
zval *zptr;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = RT_CONSTANT(opline, opline->op2);
do {
- if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -25036,8 +30880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -25046,145 +30889,59 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
zval *container;
- zend_free_op free_op2;
+
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ container = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ 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));
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ offset = RT_CONSTANT(opline, opline->op2);
- if (IS_VAR == IS_CONST ||
- (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ if (IS_UNUSED == IS_CONST ||
+ (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -25192,218 +30949,281 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
+ zend_free_op free_op1;
+ zval *property, *container, *result;
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)) {
+ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
+ zend_free_op free_op1;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ container = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+
zval *container;
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- /* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
+ zval *offset;
+ void **cache_slot = NULL;
- SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ SAVE_OPLINE();
+ container = &EX(This);
- 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));
+ 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));
+ }
+
+ offset = RT_CONSTANT(opline, opline->op2);
+
+ if (IS_UNUSED == IS_CONST ||
+ (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ goto fetch_obj_is_no_object;
+ } while (0);
+ }
+
+ /* here we are sure we are dealing with an object */
+ do {
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
+
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
+
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ }
+ }
}
- if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_is_no_object:
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ } else {
+
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
+
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ }
}
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ } while (0);
+
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ /* Behave like FETCH_OBJ_W */
+ 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));
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+
+ 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_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *property;
+ zend_free_op free_op1;
+ zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ container = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ 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);
+ 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(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- value = EX_CONSTANT((opline+1)->op1);
+ property = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -25417,11 +31237,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -25440,24 +31260,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -25470,12 +31286,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -25484,84 +31295,56 @@ 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(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data;
+ zend_free_op free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -25575,11 +31358,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -25598,24 +31381,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -25628,12 +31407,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -25642,84 +31416,56 @@ 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(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data;
+ zend_free_op free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -25733,11 +31479,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -25756,24 +31502,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -25786,12 +31528,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -25800,84 +31537,56 @@ 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(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = &EX(This);
- if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -25891,11 +31600,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -25914,24 +31623,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -25944,12 +31649,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -25958,390 +31658,249 @@ 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(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
- 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_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *object_ptr;
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
- zval *dim;
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_string **rope;
+ zval *var;
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- goto assign_dim_error;
- }
- }
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ /* Compiler allocates the necessary number of zval slots to keep the rope */
+ rope = (zend_string**)EX_VAR(opline->result.var);
+ if (IS_CONST == IS_CONST) {
+ var = RT_CONSTANT(opline, opline->op2);
+ rope[0] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
}
} else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ var = RT_CONSTANT(opline, opline->op2);
+ if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
+ if (IS_CONST == IS_CV) {
+ rope[0] = zend_string_copy(Z_STR_P(var));
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
-
+ rope[0] = Z_STR_P(var);
}
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
} else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ SAVE_OPLINE();
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-assign_dim_error:
+ rope[0] = zval_get_string_func(var);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- /* assign_dim has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+
+ zval *class_name;
USE_OPLINE
- zend_free_op free_op1;
- zval *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);
+ if (IS_CONST == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else if (IS_CONST == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(opline->extended_value);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (UNEXPECTED(ce == NULL)) {
+ class_name = RT_CONSTANT(opline, opline->op2);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ CACHE_PTR(opline->extended_value, ce);
}
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
} else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- zval_ptr_dtor_nogc(free_op_data);
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op_data);
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
+ class_name = RT_CONSTANT(opline, opline->op2);
+try_class_name:
+ if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
} else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-assign_dim_error:
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
}
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- /* assign_dim has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zval *function_name;
zend_free_op free_op1;
- zval *object_ptr;
- zend_free_op free_op2, free_op_data;
- zval *value;
- zval *variable_ptr;
- zval *dim;
+ zval *object;
+ zend_function *fbc;
+ zend_class_entry *called_scope;
+ zend_object *obj;
+ zend_execute_data *call;
+ uint32_t call_info;
SAVE_OPLINE();
- 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:
- SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ object = &EX(This);
- zend_assign_to_object_dim(object_ptr, dim, value);
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST != IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+
+ if (IS_CONST != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ do {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ function_name = Z_REFVAL_P(function_name);
+ if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
+ break;
+ }
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+
+ HANDLE_EXCEPTION();
+ }
}
+ zend_throw_error(NULL, "Method name must be a string");
+
+
+ HANDLE_EXCEPTION();
+ } while (0);
+ }
+
+ if (IS_UNUSED != IS_UNUSED) {
+ do {
+ if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CONST != IS_CONST) {
+
+ }
+ HANDLE_EXCEPTION();
+ }
+ }
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+ zend_invalid_method_call(object, function_name);
+
- zval_ptr_dtor_nogc(free_op_data);
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- UNDEF_RESULT();
HANDLE_EXCEPTION();
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op_data);
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-assign_dim_error:
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
+ } while (0);
}
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- /* assign_dim has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *object_ptr;
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
- zval *dim;
+ obj = Z_OBJ_P(object);
+ called_scope = obj->ce;
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else {
+ zend_object *orig_obj = obj;
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- goto assign_dim_error;
- }
+ if (UNEXPECTED(obj->handlers->get_method == NULL)) {
+ zend_throw_error(NULL, "Object does not support method calls");
+
+
+ HANDLE_EXCEPTION();
}
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
}
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
+
+ /* First, locate the function. */
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
+ if (UNEXPECTED(fbc == NULL)) {
+ if (EXPECTED(!EG(exception))) {
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
+ HANDLE_EXCEPTION();
+ }
+ if (IS_CONST == IS_CONST &&
+ EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
+ EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
+ EXPECTED(obj == orig_obj)) {
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
+ }
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ init_func_run_time_cache(&fbc->op_array);
+ }
+ }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ }
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-assign_dim_error:
+ call_info = ZEND_CALL_NESTED_FUNCTION;
+ if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
+ obj = NULL;
+
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
+ if (IS_UNUSED == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
- }
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- /* assign_dim has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, called_scope, obj);
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
@@ -26352,87 +31911,85 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
SAVE_OPLINE();
- if (IS_VAR == IS_CONST) {
+ if (IS_UNUSED == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CONST != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
- } else if (IS_VAR == IS_UNUSED) {
+ } else if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op1.var));
}
- if (IS_VAR == IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ if (IS_UNUSED == IS_CONST &&
+ IS_CONST == IS_CONST &&
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
- } else if (IS_VAR != IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
- } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
+ } else if (IS_UNUSED != IS_CONST &&
+ IS_CONST == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else if (IS_CONST != IS_UNUSED) {
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+
+ function_name = RT_CONSTANT(opline, opline->op2);
+ if (IS_CONST != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
+ if (IS_CONST & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
zend_throw_error(NULL, "Function name must be a string");
- zval_ptr_dtor_nogc(free_op2);
+
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
- zval_ptr_dtor_nogc(free_op2);
+
HANDLE_EXCEPTION();
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_VAR == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_CONST != IS_CONST) {
+
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
@@ -26455,28 +32012,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
}
- if (IS_VAR == IS_UNUSED) {
+ if (IS_UNUSED == IS_UNUSED) {
/* previous opcode is ZEND_FETCH_CLASS */
if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
(opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
@@ -26496,234 +32039,109 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *expr_ptr, new_expr;
-
- SAVE_OPLINE();
- if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
- UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
- expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- } else {
- expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (IS_VAR == IS_TMP_VAR) {
- /* pass */
- } else if (IS_VAR == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else if (IS_VAR == IS_CV) {
- ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else /* if (IS_VAR == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+ zend_constant *c;
- expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- }
- }
+ c = CACHED_PTR(opline->extended_value);
+ if (EXPECTED(c != NULL) && EXPECTED(!IS_SPECIAL_CACHE_VAL(c))) {
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value);
+ ZEND_VM_NEXT_OPCODE();
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
- zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_string *str;
- zend_ulong hval;
-
-add_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
- }
-str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto add_again;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- }
- zval_ptr_dtor_nogc(free_op2);
- } else {
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
- }
- }
+ SAVE_OPLINE();
+ zend_quick_get_constant(RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zval *array;
- uint32_t size;
- USE_OPLINE
-
- array = EX_VAR(opline->result.var);
- if (IS_VAR != IS_UNUSED) {
- size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_VAR != IS_UNUSED) {
- /* Explicitly initialize array as not-packed if flag is set */
- if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
- }
- }
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+ zend_class_entry *ce, *scope;
+ zend_class_constant *c;
+ zval *value, *zv;
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- zval *offset;
- zend_ulong hval;
- zend_string *key;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
-
-unset_dim_array:
- SEPARATE_ARRAY(container);
- ht = Z_ARRVAL_P(container);
-offset_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- key = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(key, hval)) {
- goto num_index_dim;
- }
+ if (IS_UNUSED == IS_CONST) {
+ if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
+ break;
+ } else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+ ce = CACHED_PTR(opline->extended_value);
+ } else {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
}
-str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
+ }
+ } else {
+ if (IS_UNUSED == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index_dim:
- zend_hash_index_del(ht, hval);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- key = ZSTR_EMPTY_ALLOC();
- goto str_index_dim;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_dim;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- key = ZSTR_EMPTY_ALLOC();
- goto str_index_dim;
} else {
- zend_error(E_WARNING, "Illegal offset type in unset");
+ ce = Z_CE_P(EX_VAR(opline->op1.var));
}
- break;
- } else if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto unset_dim_array;
+ if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+ value = CACHED_PTR(opline->extended_value + sizeof(void*));
+ break;
}
}
- if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
- } else {
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+
+ zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ if (EXPECTED(zv != NULL)) {
+ c = Z_PTR_P(zv);
+ scope = EX(func)->op_array.scope;
+ if (!zend_verify_const_access(c, scope)) {
+ zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- } else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_throw_error(NULL, "Cannot unset string offsets");
+ value = &c->value;
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
+ zval_update_constant_ex(value, c->ce);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ }
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+ } else {
+ zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
+
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *container;
zval *offset;
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)) {
+ 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));
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ offset = RT_CONSTANT(opline, opline->op2);
do {
- if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
@@ -26734,241 +32152,240 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *result;
- zend_function *constructor;
- zend_class_entry *ce;
- zend_execute_data *call;
+
+ zval *container;
+ int result;
+ zval *offset;
SAVE_OPLINE();
- if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
- }
- } else if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
- }
+ container = &EX(This);
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
- ZVAL_UNDEF(result);
- HANDLE_EXCEPTION();
+ 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));
}
- constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
- if (constructor == NULL) {
- if (UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
+ offset = RT_CONSTANT(opline, opline->op2);
- /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
- * opcode is DO_FCALL in case EXT instructions are used. */
- if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ if (IS_UNUSED == IS_CONST ||
+ (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ goto isset_no_object;
+ }
+ } else {
+ goto isset_no_object;
}
-
- /* Perform a dummy function call */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
- opline->extended_value, NULL, NULL);
+ }
+ if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
+ zend_wrong_property_check(offset);
+isset_no_object:
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
- init_func_run_time_cache(&constructor->op_array);
- }
- /* We are not handling overloaded classes right now */
- call = zend_vm_stack_push_call_frame(
- ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
- constructor,
- opline->extended_value,
- ce,
- Z_OBJ_P(result));
- Z_ADDREF_P(result);
+ result =
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
- call->prev_execute_data = EX(call);
- EX(call) = call;
- ZEND_VM_NEXT_OPCODE();
+
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *obj;
- zend_class_entry *ce, *scope;
- zend_function *clone;
- zend_object_clone_obj_t clone_call;
+ zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
SAVE_OPLINE();
- obj = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- do {
- if (IS_UNUSED == IS_CONST ||
- (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
+ /* Destroy the previously yielded value */
+ zval_ptr_dtor(&generator->value);
+
+ /* Destroy the previously yielded key */
+ zval_ptr_dtor(&generator->key);
+
+ /* Set the new yielded value */
+ if (IS_UNUSED != IS_UNUSED) {
+
+
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ /* Constants and temporary variables aren't yieldable by reference,
+ * but we still allow them with a notice. */
+ if (IS_UNUSED & (IS_CONST|IS_TMP_VAR)) {
+ zval *value;
+
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+
+ value = NULL;
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_UNUSED == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
}
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
+ } else {
+ zval *value_ptr = NULL;
+
+ /* If a function call result is yielded and the function did
+ * not return by reference we throw a notice. */
+ if (IS_UNUSED == IS_VAR &&
+ (value_ptr == &EG(uninitialized_zval) ||
+ (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !Z_ISREF_P(value_ptr)))) {
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
+ } else {
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- }
- zend_throw_error(NULL, "__clone method called on non-object");
- HANDLE_EXCEPTION();
- }
- } while (0);
+ }
+ } else {
+ zval *value = NULL;
- ce = Z_OBJCE_P(obj);
- clone = ce->clone;
- clone_call = Z_OBJ_HT_P(obj)->clone_obj;
- if (UNEXPECTED(clone_call == NULL)) {
- zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
+ /* Consts, temporary variables and references need copying */
+ if (IS_UNUSED == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ } else if (IS_UNUSED == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ } else {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_UNUSED == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ }
+ }
+ }
+ } else {
+ /* If no value was specified yield null */
+ ZVAL_NULL(&generator->value);
}
- if (clone) {
- if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- /* Ensure that if we're calling a private function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (!zend_check_private(clone, scope, clone->common.function_name)) {
- zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+ /* Set the new yielded key */
+ if (IS_CONST != IS_UNUSED) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ zval *key = RT_CONSTANT(opline, opline->op2);
+
+ /* Consts, temporary variables and references need copying */
+ if (IS_CONST == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
+ Z_ADDREF(generator->key);
}
- } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
- /* Ensure that if we're calling a protected function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
- zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+ } else if (IS_CONST == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ } else {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (IS_CONST == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
}
- }
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+ if (Z_TYPE(generator->key) == IS_LONG
+ && Z_LVAL(generator->key) > generator->largest_used_integer_key
+ ) {
+ generator->largest_used_integer_key = Z_LVAL(generator->key);
+ }
+ } else {
+ /* If no key was specified we use auto-increment keys */
+ generator->largest_used_integer_key++;
+ ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
+ }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (RETURN_VALUE_USED(opline)) {
+ /* If the return value of yield is used set the send
+ * target and initialize it to NULL */
+ generator->send_target = EX_VAR(opline->result.var);
+ ZVAL_NULL(generator->send_target);
+ } else {
+ generator->send_target = NULL;
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
SAVE_OPLINE();
- if (IS_UNUSED != IS_UNUSED) {
- zval *ptr = NULL;
-
- do {
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- } else {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(ptr)) {
- ptr = Z_REFVAL_P(ptr);
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- break;
- }
- }
- zend_print_variable(ptr);
- }
- } while (0);
-
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
+ ZEND_VM_RETURN();
}
-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)
+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_op_data1;
+ zend_free_op free_op2, free_op_data1;
zval *object;
zval *property;
zval *value;
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- value = get_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_data1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -26976,131 +32393,134 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
FREE_OP(free_op_data1);
-
+ zval_ptr_dtor_nogc(free_op2);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-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)
+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_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_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));
#else
# if 0 || IS_UNUSED != 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_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
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_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
# endif
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -27114,7 +32534,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -27127,62 +32546,64 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -27190,8 +32611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -27200,51 +32620,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ 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);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
-
+ zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_UNUSED == IS_CONST ||
(IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -27252,119 +32681,143 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *property;
- zval *container;
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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 = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *property;
- zval *container;
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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 = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
-
+ zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_UNUSED == IS_CONST ||
(IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -27372,21 +32825,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -27396,7 +32871,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -27404,135 +32879,85 @@ fetch_obj_is_no_object:
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container, *property;
+ zend_free_op free_op1, free_op2;
+ zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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 = EX_CONSTANT(opline->op2);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -27546,11 +32971,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -27569,24 +32994,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -27599,12 +33020,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -27613,84 +33029,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -27704,11 +33092,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -27727,24 +33115,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -27757,12 +33141,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -27771,84 +33150,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -27862,11 +33213,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -27885,24 +33236,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -27915,12 +33262,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -27929,84 +33271,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -28020,11 +33334,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -28043,24 +33357,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -28073,12 +33383,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -28087,57 +33392,104 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
-
+ 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_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zend_string **rope;
zval *var;
/* Compiler allocates the necessary number of zval slots to keep the rope */
rope = (zend_string**)EX_VAR(opline->result.var);
- if (IS_CONST == IS_CONST) {
- var = EX_CONSTANT(opline->op2);
- rope[0] = zend_string_copy(Z_STR_P(var));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ rope[0] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = EX_CONSTANT(opline->op2);
+ var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if (IS_CONST == IS_CV) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
rope[0] = zend_string_copy(Z_STR_P(var));
} else {
rope[0] = Z_STR_P(var);
}
} else {
SAVE_OPLINE();
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[0] = _zval_get_string_func(var);
-
+ rope[0] = zval_get_string_func(var);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+ zend_free_op free_op2;
+ zval *class_name;
USE_OPLINE
- zval *function_name;
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(opline->extended_value);
+
+ if (UNEXPECTED(ce == NULL)) {
+ class_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ CACHE_PTR(opline->extended_value, ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else {
+ class_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+try_class_name:
+ if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *function_name;
+ zend_free_op free_op1, free_op2;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -28147,23 +33499,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = EX_CONSTANT(opline->op2);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
- if (IS_CONST != IS_CONST &&
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -28171,7 +33525,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
}
}
zend_throw_error(NULL, "Method name must be a string");
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
} while (0);
@@ -28189,12 +33543,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+ zend_invalid_method_call(object, function_name);
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
@@ -28204,52 +33563,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
obj = Z_OBJ_P(object);
called_scope = obj->ce;
- if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
zend_throw_error(NULL, "Object does not support method calls");
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
- if (IS_CONST == IS_CONST &&
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
+ if (IS_UNUSED == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -28260,7 +33635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
@@ -28273,20 +33648,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
-
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
HANDLE_EXCEPTION();
}
} else {
@@ -28294,64 +33671,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
}
if (IS_UNUSED == IS_CONST &&
- IS_CONST == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_UNUSED != IS_CONST &&
- IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
- } else if (IS_CONST != IS_UNUSED) {
-
+ (IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
- function_name = EX_CONSTANT(opline->op2);
- if (IS_CONST != IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if (IS_CONST & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
+ if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
zend_throw_error(NULL, "Function name must be a string");
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
- if (IS_CONST == IS_CONST &&
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_UNUSED == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
- if (IS_CONST != IS_CONST) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
@@ -28374,22 +33747,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -28415,149 +33774,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_constant *c;
-
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- c = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- } else if ((c = zend_quick_get_constant(EX_CONSTANT(opline->op2) + 1, opline->extended_value)) == NULL) {
- SAVE_OPLINE();
-
- if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
- char *actual = (char *)zend_memrchr(Z_STRVAL_P(EX_CONSTANT(opline->op2)), '\\', Z_STRLEN_P(EX_CONSTANT(opline->op2)));
- if (!actual) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_STR_P(EX_CONSTANT(opline->op2)));
- } else {
- actual++;
- ZVAL_STRINGL(EX_VAR(opline->result.var),
- actual, Z_STRLEN_P(EX_CONSTANT(opline->op2)) - (actual - Z_STRVAL_P(EX_CONSTANT(opline->op2))));
- }
- /* non-qualified constant - allow text substitution */
- zend_error(E_WARNING, "Use of undefined constant %s - assumed '%s' (this will throw an Error in a future version of PHP)",
- Z_STRVAL_P(EX_VAR(opline->result.var)), Z_STRVAL_P(EX_VAR(opline->result.var)));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_throw_error(NULL, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), c);
- }
-
-#ifdef ZTS
- if (c->flags & CONST_PERSISTENT) {
- ZVAL_DUP(EX_VAR(opline->result.var), &c->value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), &c->value);
- }
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), &c->value);
-#endif
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zend_class_entry *ce, *scope;
- zend_class_constant *c;
- zval *value;
- USE_OPLINE
-
- SAVE_OPLINE();
-
- do {
- if (IS_UNUSED == IS_CONST) {
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-#ifdef ZTS
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
-#endif
- break;
- } else if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))))) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- } else {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
- }
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
- }
- if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
- break;
- }
- }
-
- if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) {
- scope = EX(func)->op_array.scope;
- if (!zend_verify_const_access(c, scope)) {
- zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- value = &c->value;
- if (Z_CONSTANT_P(value)) {
- zval_update_constant_ex(value, c->ce);
- if (UNEXPECTED(EG(exception) != NULL)) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- if (IS_UNUSED == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), value);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
- }
- } else {
- zend_throw_error(NULL, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } while (0);
-
-#ifdef ZTS
- if (ce->type == ZEND_INTERNAL_CLASS) {
- ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-#else
- ZVAL_COPY(EX_VAR(opline->result.var), value);
-#endif
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -28571,34 +33800,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
int result;
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_UNUSED == IS_CONST ||
(IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -28612,159 +33840,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
-
- SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- /* Destroy the previously yielded value */
- zval_ptr_dtor(&generator->value);
-
- /* Destroy the previously yielded key */
- zval_ptr_dtor(&generator->key);
-
- /* Set the new yielded value */
- if (IS_UNUSED != IS_UNUSED) {
-
-
- if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- /* Constants and temporary variables aren't yieldable by reference,
- * but we still allow them with a notice. */
- if (IS_UNUSED & (IS_CONST|IS_TMP_VAR)) {
- zval *value;
-
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
-
- value = NULL;
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_UNUSED == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- }
- } else {
- zval *value_ptr = NULL;
-
- /* If a function call result is yielded and the function did
- * not return by reference we throw a notice. */
- if (IS_UNUSED == IS_VAR &&
- (value_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION &&
- !Z_ISREF_P(value_ptr)))) {
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- } else {
- ZVAL_MAKE_REF(value_ptr);
- }
- ZVAL_COPY(&generator->value, value_ptr);
-
- }
- } else {
- zval *value = NULL;
-
- /* Consts, temporary variables and references need copying */
- if (IS_UNUSED == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- } else if (IS_UNUSED == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
-
- } else {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_UNUSED == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- }
- }
- }
- } else {
- /* If no value was specified yield null */
- ZVAL_NULL(&generator->value);
- }
-
- /* Set the new yielded key */
- if (IS_CONST != IS_UNUSED) {
-
- zval *key = EX_CONSTANT(opline->op2);
-
- /* Consts, temporary variables and references need copying */
- if (IS_CONST == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
- Z_ADDREF(generator->key);
- }
- } else if (IS_CONST == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
- ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
-
- } else {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (IS_CONST == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
- }
- }
-
- if (Z_TYPE(generator->key) == IS_LONG
- && Z_LVAL(generator->key) > generator->largest_used_integer_key
- ) {
- generator->largest_used_integer_key = Z_LVAL(generator->key);
- }
- } else {
- /* If no key was specified we use auto-increment keys */
- generator->largest_used_integer_key++;
- ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
- }
-
- if (RETURN_VALUE_USED(opline)) {
- /* If the return value of yield is used set the send
- * target and initialize it to NULL */
- generator->send_target = EX_VAR(opline->result.var);
- ZVAL_NULL(generator->send_target);
- } else {
- generator->send_target = NULL;
- }
-
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
-
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
-
- ZEND_VM_RETURN();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -28773,11 +33864,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -28815,10 +33902,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -28909,11 +34001,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -28951,10 +34039,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -29037,6 +34130,49 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
ZEND_VM_RETURN();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+
+ zval *class_name;
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (IS_UNUSED == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else if (IS_UNUSED == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(opline->extended_value);
+
+ if (UNEXPECTED(ce == NULL)) {
+ class_name = NULL;
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ CACHE_PTR(opline->extended_value, ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else {
+ class_name = NULL;
+try_class_name:
+ if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -29050,14 +34186,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_UNUSED != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -29072,12 +34210,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_UNUSED != IS_CONST &&
IS_UNUSED == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_UNUSED != IS_UNUSED) {
@@ -29100,17 +34238,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -29118,11 +34256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_UNUSED == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -29151,22 +34285,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -29242,6 +34362,78 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *result;
+ zend_function *constructor;
+ zend_class_entry *ce;
+ zend_execute_data *call;
+
+ SAVE_OPLINE();
+ if (IS_UNUSED == IS_CONST) {
+ ce = CACHED_PTR(opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 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();
+ }
+ CACHE_PTR(opline->op2.num, ce);
+ }
+ } else if (IS_UNUSED == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op1.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->op1.var));
+ }
+
+ result = EX_VAR(opline->result.var);
+ if (UNEXPECTED(object_init_ex(result, ce) != SUCCESS)) {
+ ZVAL_UNDEF(result);
+ HANDLE_EXCEPTION();
+ }
+
+ constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
+ if (constructor == NULL) {
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+
+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
+ * opcode is DO_FCALL in case EXT instructions are used. */
+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ }
+
+ /* Perform a dummy function call */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
+ opline->extended_value, NULL, NULL);
+ } else {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ init_func_run_time_cache(&constructor->op_array);
+ }
+ /* We are not handling overloaded classes right now */
+ call = zend_vm_stack_push_call_frame(
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
+ constructor,
+ opline->extended_value,
+ ce,
+ Z_OBJ_P(result));
+ Z_ADDREF_P(result);
+ }
+
+ call->prev_execute_data = EX(call);
+ EX(call) = call;
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -29250,11 +34442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -29292,10 +34480,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -29398,9 +34591,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED
USE_OPLINE
ZVAL_BOOL(EX_VAR(opline->result.var),
- (opline->extended_value & ZEND_ISSET) ?
- (Z_TYPE(EX(This)) == IS_OBJECT) :
- (Z_TYPE(EX(This)) != IS_OBJECT));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ (Z_TYPE(EX(This)) == IS_OBJECT));
ZEND_VM_NEXT_OPCODE();
}
@@ -29470,7 +34662,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
arg_count = EX_NUM_ARGS();
if (IS_UNUSED == IS_CONST) {
- skip = Z_LVAL_P(EX_CONSTANT(opline->op1));
+ skip = Z_LVAL_P(RT_CONSTANT(opline, opline->op1));
if (arg_count < skip) {
result_size = 0;
} else {
@@ -29481,13 +34673,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
result_size = arg_count;
}
- ht = (zend_array *) emalloc(sizeof(zend_array));
- zend_hash_init(ht, result_size, NULL, ZVAL_PTR_DTOR, 0);
- ZVAL_ARR(EX_VAR(opline->result.var), ht);
-
if (result_size) {
uint32_t first_extra_arg = EX(func)->op_array.num_args;
- zend_hash_real_init(ht, 1);
+
+ ht = zend_new_array(result_size);
+ ZVAL_ARR(EX_VAR(opline->result.var), ht);
+ zend_hash_real_init_packed(ht);
ZEND_HASH_FILL_PACKED(ht) {
zval *p, *q;
uint32_t i = skip;
@@ -29530,6 +34721,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
}
} ZEND_HASH_FILL_END();
ht->nNumOfElements = result_size;
+ } else {
+ ZVAL_EMPTY_ARRAY(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
}
@@ -29544,7 +34737,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -29553,31 +34746,30 @@ 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_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_data1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -29585,7 +34777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
@@ -29602,7 +34794,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
#else
# if 0 || IS_UNUSED != 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_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -29685,7 +34880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -29695,21 +34890,21 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -29723,7 +34918,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -29736,7 +34930,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -29763,7 +34957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
zval *zptr;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -29773,25 +34967,26 @@ 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)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -29799,8 +34994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -29809,7 +35003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -29834,26 +35028,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = EX_VAR(opline->op2.var);
if (IS_UNUSED == IS_CONST ||
(IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -29861,37 +35063,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
@@ -29904,23 +35129,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
+ 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);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -29928,22 +35152,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
+ 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);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -29954,26 +35177,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
if (IS_UNUSED == IS_CONST ||
(IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -29981,21 +35206,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -30005,7 +35252,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -30019,35 +35266,13 @@ fetch_obj_is_no_object:
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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));
}
@@ -30057,23 +35282,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV
{
USE_OPLINE
zend_free_op free_op1;
- zval *container, *property;
+ zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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);
+ 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(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
-
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_UNUSED == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -30084,64 +35308,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- value = EX_CONSTANT((opline+1)->op1);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -30155,11 +35351,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -30178,24 +35374,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -30208,12 +35400,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -30222,7 +35409,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -30242,7 +35429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -30252,54 +35439,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -30313,11 +35472,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -30336,24 +35495,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -30366,12 +35521,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -30380,7 +35530,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -30400,7 +35550,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -30410,54 +35560,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -30471,11 +35593,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -30494,24 +35616,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -30524,12 +35642,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -30538,7 +35651,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -30558,7 +35671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -30568,54 +35681,26 @@ 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -30629,11 +35714,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -30652,24 +35737,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -30682,12 +35763,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -30696,7 +35772,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -30720,9 +35796,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL
rope = (zend_string**)EX_VAR(opline->result.var);
if (IS_CV == IS_CONST) {
var = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- rope[0] = zend_string_copy(Z_STR_P(var));
+ rope[0] = Z_STR_P(var);
+ if (UNEXPECTED(Z_REFCOUNTED_P(var))) {
+ Z_ADDREF_P(var);
+ }
} else {
- var = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ var = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
if (IS_CV == IS_CV) {
rope[0] = zend_string_copy(Z_STR_P(var));
@@ -30734,7 +35813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(var, BP_VAR_R);
}
- rope[0] = _zval_get_string_func(var);
+ rope[0] = zval_get_string_func(var);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -30742,11 +35821,54 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+
+ zval *class_name;
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (IS_CV == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else if (IS_CV == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(opline->extended_value);
+
+ if (UNEXPECTED(ce == NULL)) {
+ class_name = EX_VAR(opline->op2.var);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ CACHE_PTR(opline->extended_value, ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else {
+ class_name = EX_VAR(opline->op2.var);
+try_class_name:
+ if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
-
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -30756,13 +35878,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ object = &EX(This);
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ if (IS_CV != IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
if (IS_CV != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
@@ -30798,11 +35922,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CV != IS_CONST) {
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+ zend_invalid_method_call(object, function_name);
HANDLE_EXCEPTION();
@@ -30814,8 +35943,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
called_scope = obj->ce;
if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
@@ -30826,11 +35955,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
HANDLE_EXCEPTION();
}
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
@@ -30840,25 +35973,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CV != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
+ if (IS_UNUSED == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -30882,14 +36027,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST) {
/* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
+ ce = CACHED_PTR(opline->result.num);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), RT_CONSTANT(opline, opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
+ if (IS_CV != IS_CONST) {
+ CACHE_PTR(opline->result.num, ce);
+ }
}
} else if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
@@ -30904,16 +36051,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_UNUSED == IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
+ EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
/* nothing to do */
} else if (IS_UNUSED != IS_CONST &&
IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else if (IS_CV != IS_UNUSED) {
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ function_name = EX_VAR(opline->op2.var);
if (IS_CV != IS_CONST) {
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
@@ -30932,17 +36079,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
} while (0);
- }
+ }
}
if (ce->get_static_method) {
fbc = ce->get_static_method(ce, Z_STR_P(function_name));
} else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(ce, Z_STR_P(function_name));
}
HANDLE_EXCEPTION();
@@ -30950,11 +36097,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_UNUSED == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
+ CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
@@ -30983,22 +36126,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
object = Z_OBJ(EX(This));
ce = object->ce;
} else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+ zend_non_static_method_call(fbc);
+ if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
}
@@ -31032,7 +36161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
}
@@ -31050,11 +36179,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
@@ -31071,7 +36198,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
zval *offset;
SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
+ 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));
@@ -31091,15 +36218,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
@@ -31116,11 +36241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -31158,10 +36279,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -31244,1594 +36370,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
ZEND_VM_RETURN();
}
-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;
- zval *object;
- zval *property;
- zval *value;
- zval *zptr;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
-
- do {
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
-
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- break;
- }
- }
-
- /* here we are sure we are dealing with an object */
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
-
- 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(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
- }
- } while (0);
-
- FREE_OP(free_op_data1);
- zval_ptr_dtor_nogc(free_op2);
-
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
-}
-
-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));
-#else
-# if 0 || IS_UNUSED != IS_UNUSED
- USE_OPLINE
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object;
- zval *property;
- zval *zptr;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
-
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- break;
- }
- }
-
- /* here we are sure we are dealing with an object */
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != 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);
- }
- } else {
- ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
- }
- } else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object;
- zval *property;
- zval *zptr;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
-
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- break;
- }
- }
-
- /* here we are sure we are dealing with an object */
-
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
- } else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- }
- } else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *container;
- zend_free_op free_op2;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
-
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if (IS_UNUSED == IS_CONST ||
- (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
- }
- } else {
- goto fetch_obj_r_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
-
- SAVE_OPLINE();
-
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
- 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *container;
- zend_free_op free_op2;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
-
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if (IS_UNUSED == IS_CONST ||
- (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
- }
- } else {
- goto fetch_obj_is_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-fetch_obj_is_no_object:
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
-
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- /* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
- if ((IS_UNUSED & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *property;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- value = EX_CONSTANT((opline+1)->op1);
-
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_CONST);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_CONST == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_CONST != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_CONST == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
-
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
-exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2, free_op_data;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_TMP_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_TMP_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_TMP_VAR != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_TMP_VAR == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
-
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- zval_ptr_dtor_nogc(free_op_data);
-exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2, free_op_data;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_VAR != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_VAR == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
-
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- zval_ptr_dtor_nogc(free_op_data);
-exit_assign_obj:
- 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_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_CV);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_CV != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_CV == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
-
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
-exit_assign_obj:
- 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_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zend_string **rope;
- zval *var;
-
- /* Compiler allocates the necessary number of zval slots to keep the rope */
- rope = (zend_string**)EX_VAR(opline->result.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- rope[0] = zend_string_copy(Z_STR_P(var));
- } else {
- var = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
- rope[0] = zend_string_copy(Z_STR_P(var));
- } else {
- rope[0] = Z_STR_P(var);
- }
- } else {
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
- }
- rope[0] = _zval_get_string_func(var);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *function_name;
- zend_free_op free_op2;
- zval *object;
- zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *obj;
- zend_execute_data *call;
- uint32_t call_info;
-
- SAVE_OPLINE();
-
- object = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
-
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Method name must be a string");
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- } while (0);
- }
-
- if (IS_UNUSED != IS_UNUSED) {
- do {
- if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- }
- } while (0);
- }
-
- obj = Z_OBJ_P(object);
- called_scope = obj->ce;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
- } else {
- zend_object *orig_obj = obj;
-
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- }
-
- /* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
- }
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
- EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- }
-
- call_info = ZEND_CALL_NESTED_FUNCTION;
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- obj = NULL;
- } else if (IS_UNUSED & (IS_VAR|IS_TMP_VAR|IS_CV)) {
- /* CV may be changed indirectly (e.g. when it's a reference) */
- call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
- zval_ptr_dtor_nogc(free_op2);
-
- if ((IS_UNUSED & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
-
- call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
- call->prev_execute_data = EX(call);
- EX(call) = call;
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *function_name;
- zend_class_entry *ce;
- zend_object *object;
- zend_function *fbc;
- zend_execute_data *call;
-
- SAVE_OPLINE();
-
- if (IS_UNUSED == IS_CONST) {
- /* no function found. try a static method in class */
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
- }
- } else if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op1.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op1.var));
- }
-
- if (IS_UNUSED == IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED((fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) != NULL)) {
- /* nothing to do */
- } else if (IS_UNUSED != IS_CONST &&
- (IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) == ce)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)) + sizeof(void*));
- } else if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
-
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Function name must be a string");
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- } while (0);
- }
- }
-
- if (ce->get_static_method) {
- fbc = ce->get_static_method(ce, Z_STR_P(function_name));
- } else {
- fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- }
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), Z_STRVAL_P(function_name));
- }
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)))) {
- if (IS_UNUSED == IS_CONST) {
- CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
- } else {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
- }
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zval_ptr_dtor_nogc(free_op2);
- }
- } else {
- if (UNEXPECTED(ce->constructor == NULL)) {
- zend_throw_error(NULL, "Cannot call constructor");
- HANDLE_EXCEPTION();
- }
- if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
- HANDLE_EXCEPTION();
- }
- fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
- }
-
- object = NULL;
- if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
- if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
- object = Z_OBJ(EX(This));
- ce = object->ce;
- } else {
- if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
- /* Allowed for PHP 4 compatibility. */
- zend_error(
- E_DEPRECATED,
- "Non-static method %s::%s() should not be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- } else {
- /* An internal function assumes $this is present and won't check that.
- * So PHP would crash by allowing the call. */
- zend_throw_error(
- zend_ce_error,
- "Non-static method %s::%s() cannot be called statically",
- ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
- HANDLE_EXCEPTION();
- }
- }
- }
-
- if (IS_UNUSED == IS_UNUSED) {
- /* previous opcode is ZEND_FETCH_CLASS */
- if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
- (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- ce = Z_OBJCE(EX(This));
- } else {
- ce = Z_CE(EX(This));
- }
- }
- }
-
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
- call->prev_execute_data = EX(call);
- EX(call) = call;
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
- 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));
- }
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (Z_TYPE_P(container) != IS_OBJECT) {
- break;
- }
- } else {
- break;
- }
- }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
- } else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container;
- int result;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
-
- 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));
- }
-
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if (IS_UNUSED == IS_CONST ||
- (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto isset_no_object;
- }
- } else {
- goto isset_no_object;
- }
- }
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
-isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
- } else {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
- }
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
ZEND_VM_NEXT_OPCODE();
@@ -32850,7 +36395,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
zval *val;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_FALSE(EX_VAR(opline->result.var));
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
@@ -32875,7 +36420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_increment_function(var_ptr);
@@ -32897,7 +36442,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
increment_function(var_ptr);
@@ -32914,7 +36458,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_increment_function(var_ptr);
@@ -32936,7 +36480,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
increment_function(var_ptr);
@@ -32953,7 +36496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_decrement_function(var_ptr);
@@ -32975,7 +36518,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
decrement_function(var_ptr);
@@ -32992,7 +36534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_decrement_function(var_ptr);
@@ -33014,7 +36556,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
decrement_function(var_ptr);
@@ -33031,10 +36572,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -33049,8 +36590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
increment_function(var_ptr);
@@ -33063,10 +36603,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
@@ -33081,8 +36621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_
var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
}
ZVAL_DEREF(var_ptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
decrement_function(var_ptr);
@@ -33096,7 +36635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCO
zval *z;
SAVE_OPLINE();
- z = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ z = EX_VAR(opline->op1.var);
if (Z_TYPE_P(z) == IS_STRING) {
zend_string *str = Z_STR_P(z);
@@ -33105,14 +36644,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCO
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
}
} else {
- zend_string *str = _zval_get_string_func(z);
+ zend_string *str = zval_get_string_func(z);
if (ZSTR_LEN(str) != 0) {
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(z, BP_VAR_R);
}
- zend_string_release(str);
+ zend_string_release_ex(str, 0);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -33124,20 +36663,19 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDL
zval *val;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -33156,19 +36694,19 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HAND
zval *val;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
@@ -33187,7 +36725,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HAN
zval *val;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
@@ -33196,11 +36734,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HAN
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -33220,7 +36758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O
zval *val;
int ret;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
@@ -33230,11 +36768,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
SAVE_OPLINE();
@@ -33257,12 +36795,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_
zval *val;
int ret;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
@@ -33294,7 +36831,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
zval *return_value;
zend_free_op free_op1;
- retval_ptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ retval_ptr = EX_VAR(opline->op1.var);
return_value = EX(return_value);
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
SAVE_OPLINE();
@@ -33306,7 +36843,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
SAVE_OPLINE();
- zval_dtor_func(Z_COUNTED_P(free_op1));
+ rc_dtor_func(Z_COUNTED_P(free_op1));
}
}
} else {
@@ -33339,7 +36876,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
retval_ptr = Z_REFVAL_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
Z_ADDREF_P(retval_ptr);
@@ -33377,7 +36914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(
ZVAL_NEW_REF(EX(return_value), retval_ptr);
if (IS_CV == IS_CONST) {
- if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
+ Z_TRY_ADDREF_P(retval_ptr);
}
}
break;
@@ -33399,8 +36936,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(
}
if (EX(return_value)) {
- ZVAL_MAKE_REF(retval_ptr);
- Z_ADDREF_P(retval_ptr);
+ if (Z_ISREF_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(retval_ptr, 2);
+ }
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
}
@@ -33429,15 +36969,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CV_HANDL
}
}
} else if (IS_CV == IS_CV) {
- ZVAL_DEREF(retval);
- ZVAL_COPY(&generator->retval, retval);
+ ZVAL_COPY_DEREF(&generator->retval, retval);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval))) {
zend_refcounted *ref = Z_COUNTED_P(retval);
retval = Z_REFVAL_P(retval);
ZVAL_COPY_VALUE(&generator->retval, retval);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(retval)) {
Z_ADDREF_P(retval);
@@ -33461,7 +37000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
SAVE_OPLINE();
- value = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ value = EX_VAR(opline->op1.var);
do {
if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
@@ -33485,7 +37024,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
zend_exception_save();
if (IS_CV != IS_TMP_VAR) {
- if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
}
zend_throw_exception_object(value);
@@ -33500,7 +37039,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_H
zval *varptr, *arg;
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ varptr = EX_VAR(opline->op1.var);
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
@@ -33512,15 +37051,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_H
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -33551,17 +37089,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_
if (Z_ISREF_P(varptr)) {
Z_ADDREF_P(varptr);
- ZVAL_COPY_VALUE(arg, varptr);
} else {
- ZVAL_NEW_REF(arg, varptr);
- Z_ADDREF_P(arg);
- ZVAL_REF(varptr, Z_REF_P(arg));
+ ZVAL_MAKE_REF_EX(varptr, 2);
}
+ ZVAL_REF(arg, Z_REF_P(varptr));
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *varptr, *arg;
@@ -33577,7 +37113,7 @@ send_var_by_ref:
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ varptr = EX_VAR(opline->op1.var);
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
@@ -33589,15 +37125,14 @@ send_var_by_ref:
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -33626,7 +37161,7 @@ send_var_by_ref:
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ varptr = EX_VAR(opline->op1.var);
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
@@ -33638,15 +37173,14 @@ send_var_by_ref:
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
- ZVAL_OPT_DEREF(varptr);
- ZVAL_COPY(arg, varptr);
+ ZVAL_COPY_DEREF(arg, varptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(varptr))) {
zend_refcounted *ref = Z_COUNTED_P(varptr);
varptr = Z_REFVAL_P(varptr);
ZVAL_COPY_VALUE(arg, varptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
efree_size(ref, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
@@ -33670,11 +37204,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
param = ZEND_CALL_VAR(EX(call), opline->result.var);
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- opline->op2.num,
- EX(call)->func->common.scope ? ZSTR_VAL(EX(call)->func->common.scope->name) : "",
- EX(call)->func->common.scope ? "::" : "",
- ZSTR_VAL(EX(call)->func->common.function_name));
+ zend_param_must_be_ref(EX(call)->func, opline->op2.num);
}
ZVAL_COPY(param, arg);
@@ -33688,7 +37218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
zval *val;
- val = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ val = EX_VAR(opline->op1.var);
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
ZVAL_TRUE(EX_VAR(opline->result.var));
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
@@ -33717,7 +37247,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
zend_object_clone_obj_t clone_call;
SAVE_OPLINE();
- obj = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ obj = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -33727,9 +37257,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
+ obj = Z_REFVAL_P(obj);
+ if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
+ break;
}
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -33790,6 +37320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
zval *expr;
zval *result = EX_VAR(opline->result.var);
+ HashTable *ht;
SAVE_OPLINE();
expr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -33827,16 +37358,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
- ZVAL_NEW_ARR(result);
- zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0);
+ if (IS_CV == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
+ ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
if (IS_CV == IS_CONST) {
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
} else {
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -33844,19 +37388,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
convert_to_array(result);
}
} else {
- if (Z_TYPE_P(expr) != IS_ARRAY) {
- object_init(result);
- if (Z_TYPE_P(expr) != IS_NULL) {
- expr = zend_hash_add_new(Z_OBJPROP_P(result), ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
- } else {
- if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
- }
+ ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
+ if (Z_TYPE_P(expr) == IS_ARRAY) {
+ ht = zend_symtable_to_proptable(Z_ARR_P(expr));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ /* TODO: try not to duplicate immutable arrays as well ??? */
+ ht = zend_array_dup(ht);
+ }
+ Z_OBJ_P(result)->properties = ht;
+ } else if (Z_TYPE_P(expr) != IS_NULL) {
+ Z_OBJ_P(result)->properties = ht = zend_new_array(1);
+ expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
+ } else {
+ if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
}
- } else {
- ZVAL_COPY(result, expr);
- convert_to_object(result);
}
}
}
@@ -33928,8 +37475,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
} else if (RETURN_VALUE_USED(opline)) {
ZVAL_FALSE(EX_VAR(opline->result.var));
}
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
+ ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -33960,7 +37506,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -33968,51 +37514,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 0);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
-
- if (iter) {
- OBJ_RELEASE(&iter->std);
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -34057,12 +37564,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
array_ptr = Z_REFVAL_P(array_ref);
}
if (IS_CV == IS_CONST) {
- zval_copy_ctor_func(array_ptr);
+ ZVAL_ARR(array_ptr, zend_array_dup(Z_ARRVAL_P(array_ptr)));
} else {
SEPARATE_ARRAY(array_ptr);
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
+ if (IS_CV == IS_VAR) {
+
+ }
ZEND_VM_NEXT_OPCODE();
} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -34080,7 +37590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
if (Z_OBJ_P(array_ptr)->properties
&& UNEXPECTED(GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(Z_OBJ_P(array_ptr)->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(Z_OBJ_P(array_ptr)->properties)--;
+ GC_DELREF(Z_OBJ_P(array_ptr)->properties);
}
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
}
@@ -34088,54 +37598,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_class_entry *ce = Z_OBJCE_P(array_ptr);
- zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1);
- zend_bool is_empty;
-
- if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
- if (IS_CV == IS_VAR) {
-
- } else {
-
- }
- if (!EG(exception)) {
- zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- iter->index = 0;
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_CV == IS_VAR) {
-
- } else {
-
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
-
- is_empty = iter->funcs->valid(iter) != SUCCESS;
-
- if (UNEXPECTED(EG(exception) != NULL)) {
- OBJ_RELEASE(&iter->std);
- if (IS_CV == IS_VAR) {
-
- } else {
-
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- iter->index = -1; /* will be set to 0 before using next handler */
-
- ZVAL_OBJ(EX_VAR(opline->result.var), &iter->std);
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
+ zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
@@ -34145,8 +37608,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
} else {
ZEND_VM_NEXT_OPCODE();
}
@@ -34164,7 +37626,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -34184,7 +37646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCO
break;
}
}
- zend_print_variable(ptr);
+ zend_print_zval(ptr, 0);
}
} while (0);
@@ -34230,14 +37692,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_O
} else if (IS_CV == IS_VAR && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
ZEND_VM_NEXT_OPCODE();
@@ -34253,8 +37714,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
SAVE_OPLINE();
value = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) {
- if (IS_CV == IS_VAR) {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if (IS_CV & IS_VAR) {
ref = value;
}
value = Z_REFVAL_P(value);
@@ -34267,17 +37728,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
} else if (IS_CV == IS_CV) {
if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (IS_CV == IS_VAR && ref) {
+ } else if ((IS_CV & IS_VAR) && ref) {
zend_reference *r = Z_REF_P(ref);
- if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) {
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
efree_size(r, sizeof(zend_reference));
} else if (Z_OPT_REFCOUNTED_P(result)) {
Z_ADDREF_P(result);
}
}
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
}
ZEND_VM_NEXT_OPCODE();
@@ -34290,7 +37750,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_
zval *value;
zval *result = EX_VAR(opline->result.var);
- value = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ value = EX_VAR(opline->op1.var);
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
SAVE_OPLINE();
GET_OP1_UNDEF_CV(value, BP_VAR_R);
@@ -34299,8 +37759,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_
}
if (IS_CV == IS_CV) {
- ZVAL_DEREF(value);
- ZVAL_COPY(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (IS_CV == IS_VAR) {
if (UNEXPECTED(Z_ISREF_P(value))) {
ZVAL_COPY_VALUE(result, Z_REFVAL_P(value));
@@ -34433,7 +37892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
zval *value;
- value = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ value = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
@@ -34476,33 +37935,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value;
int result = 0;
- SAVE_OPLINE();
- value = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) {
- if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) {
- const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value));
-
- if (EXPECTED(type_name != NULL)) {
- result = 1;
- }
- } else {
+ value = EX_VAR(opline->op1.var);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+type_check_resource:
+ if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE)
+ || EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) {
result = 1;
}
- } else if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
+ } else if ((IS_CV & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ if ((opline->extended_value >> (uint32_t)Z_TYPE_P(value)) & 1) {
+ goto type_check_resource;
+ }
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
+ result = ((1 << IS_NULL) & opline->extended_value) != 0;
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -34510,7 +37980,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_NO_OV
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
Z_LVAL_P(var_ptr)++;
if (UNEXPECTED(0)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
@@ -34523,7 +37993,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_NO_OV
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
Z_LVAL_P(var_ptr)++;
if (UNEXPECTED(1)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
@@ -34536,7 +38006,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_SPEC_
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
fast_long_increment_function(var_ptr);
if (UNEXPECTED(0)) {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
@@ -34549,7 +38019,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_SPEC_
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
fast_long_increment_function(var_ptr);
if (UNEXPECTED(1)) {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
@@ -34562,7 +38032,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_OR_DO
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_increment_function(var_ptr);
} else {
@@ -34579,7 +38049,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_OR_DO
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_increment_function(var_ptr);
} else {
@@ -34596,7 +38066,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_NO_OV
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
Z_LVAL_P(var_ptr)--;
if (UNEXPECTED(0)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
@@ -34609,7 +38079,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_NO_OV
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
Z_LVAL_P(var_ptr)--;
if (UNEXPECTED(1)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
@@ -34622,7 +38092,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_SPEC_
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
fast_long_decrement_function(var_ptr);
if (UNEXPECTED(0)) {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
@@ -34635,7 +38105,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_SPEC_
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
fast_long_decrement_function(var_ptr);
if (UNEXPECTED(1)) {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
@@ -34648,7 +38118,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_OR_DO
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_decrement_function(var_ptr);
} else {
@@ -34665,7 +38135,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_OR_DO
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
fast_long_decrement_function(var_ptr);
} else {
@@ -34682,7 +38152,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_NO_O
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
Z_LVAL_P(var_ptr)++;
ZEND_VM_NEXT_OPCODE();
@@ -34693,7 +38163,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_SPEC
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
@@ -34704,11 +38174,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_OR_D
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_increment_function(var_ptr);
} else {
+ ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
Z_DVAL_P(var_ptr)++;
}
ZEND_VM_NEXT_OPCODE();
@@ -34719,7 +38190,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_NO_O
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
Z_LVAL_P(var_ptr)--;
ZEND_VM_NEXT_OPCODE();
@@ -34730,7 +38201,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_SPEC
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ var_ptr = EX_VAR(opline->op1.var);
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
@@ -34741,11 +38212,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_OR_D
USE_OPLINE
zval *var_ptr;
- var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ var_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
fast_long_decrement_function(var_ptr);
} else {
+ ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
Z_DVAL_P(var_ptr)--;
}
ZEND_VM_NEXT_OPCODE();
@@ -34757,7 +38229,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SP
zval *varptr, *arg;
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ varptr = EX_VAR(opline->op1.var);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
@@ -34776,44 +38248,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE
uint32_t arg_num = opline->op2.num;
- if (EXPECTED(0)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- goto send_var_by_ref_simple;
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-send_var_by_ref_simple:
- ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
-
- if (IS_CV == IS_CV) {
- ZVAL_COPY(arg, varptr);
- } else /* if (IS_CV == IS_VAR) */ {
- ZVAL_COPY_VALUE(arg, varptr);
- }
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varptr, *arg;
-
- uint32_t arg_num = opline->op2.num;
-
- if (EXPECTED(1)) {
- if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- goto send_var_by_ref_simple;
- }
- } else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
-send_var_by_ref_simple:
+ if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ varptr = EX_VAR(opline->op1.var);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (IS_CV == IS_CV) {
@@ -34831,8 +38270,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -34874,8 +38313,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -34917,8 +38356,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -34965,7 +38404,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
@@ -34978,16 +38417,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -35017,8 +38453,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -35045,8 +38481,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -35075,7 +38511,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CONST_HANDLER(ZEND
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
pow_function(EX_VAR(opline->result.var), op1, op2);
@@ -35088,8 +38524,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(Z
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
(IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
@@ -35097,38 +38533,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(Z
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
@@ -35155,7 +38589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HAN
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_identical_function(op1, op2);
@@ -35173,7 +38607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
result = fast_is_not_identical_function(op1, op2);
@@ -35188,8 +38622,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -35211,17 +38645,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
} else {
@@ -35256,8 +38680,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -35279,17 +38703,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
} else {
@@ -35324,8 +38738,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDL
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -35374,8 +38788,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CO
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
do {
int result;
@@ -35426,7 +38840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CONST_HANDLE
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
compare_function(EX_VAR(opline->result.var), op1, op2);
@@ -35439,8 +38853,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZE
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
@@ -35466,8 +38880,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(Z
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
@@ -35493,8 +38907,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(Z
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
@@ -35522,7 +38936,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op2 = RT_CONSTANT(opline, opline->op2);
boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
@@ -35545,34 +38959,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
- value = get_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_data1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -35580,7 +38993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
@@ -35599,21 +39012,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
zval *value, *container, *dim;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = EX_CONSTANT(opline->op2);
-
if (IS_CONST == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
@@ -35623,10 +39035,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -35642,39 +39053,39 @@ assign_dim_op_new_array:
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
@@ -35691,7 +39102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
zval *value;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
+ value = RT_CONSTANT(opline, opline->op2);
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
@@ -35700,7 +39111,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
}
} else {
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
binary_op(var_ptr, var_ptr, value);
@@ -35719,7 +39129,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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(1)) {
ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
@@ -35739,7 +39152,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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));
@@ -35759,7 +39175,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S
ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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));
@@ -35968,25 +39387,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -36000,7 +39419,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -36013,7 +39431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -36046,29 +39464,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -36076,8 +39495,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -36086,7 +39504,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -36110,15 +39528,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
zval *varname;
zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- retval = zend_fetch_static_property_address(varname, IS_CV, opline->op2, IS_CONST, type EXECUTE_DATA_CC);
+ 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 (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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_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_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 (EG(exception)) {
-
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
} else {
@@ -36128,7 +39607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
} else {
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
@@ -36152,13 +39631,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_C
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -36178,14 +39654,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HAND
zval *container, *dim, *value, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = EX_CONSTANT(opline->op2);
+ container = EX_VAR(opline->op1.var);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CV != IS_CONST) {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_array:
value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CONST, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -36195,12 +39671,13 @@ fetch_dim_r_array:
}
} else {
fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CONST EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, IS_CONST OPLINE_CC EXECUTE_DATA_CC);
}
@@ -36214,14 +39691,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HAND
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_W(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36232,14 +39708,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HAN
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_RW(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36250,8 +39725,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HAN
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_read_IS(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -36259,41 +39734,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HAN
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -36303,44 +39754,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_UNSET(container, RT_CONSTANT(opline, opline->op2), IS_CONST OPLINE_CC EXECUTE_DATA_CC);
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ 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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -36348,37 +39806,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
@@ -36391,23 +39872,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ 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 = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
+ 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);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36415,8 +39895,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
+ zval *property, *container, *result;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
@@ -36424,13 +39903,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
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 = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
+ 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);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36441,6 +39920,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
@@ -36449,18 +39929,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -36468,21 +39949,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -36492,7 +39995,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -36506,35 +40009,13 @@ fetch_obj_is_no_object:
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- 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));
- }
if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = EX_CONSTANT(opline->op2);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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));
}
@@ -36544,7 +40025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
{
USE_OPLINE
zend_free_op free_op1;
- zval *container, *property;
+ zval *container, *property, *result;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
@@ -36553,27 +40034,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
+ 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);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2) EXECUTE_DATA_CC);
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36584,64 +40051,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
+ property = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -36655,11 +40094,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -36678,24 +40117,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -36708,12 +40143,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -36722,7 +40152,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -36742,64 +40172,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -36813,11 +40215,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -36836,24 +40238,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -36866,12 +40264,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -36880,7 +40273,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -36900,64 +40293,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -36971,11 +40336,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -36994,24 +40359,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -37024,12 +40385,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -37038,7 +40394,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -37058,64 +40414,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- property = EX_CONSTANT(opline->op2);
+ property = RT_CONSTANT(opline, opline->op2);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
+assign_object:
if (IS_CONST == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+ EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -37129,11 +40457,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -37152,24 +40480,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -37182,12 +40506,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -37196,7 +40515,7 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
@@ -37214,25 +40533,45 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
USE_OPLINE
zval *object_ptr;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -37241,9 +40580,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -37255,37 +40594,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ dim = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ dim = RT_CONSTANT(opline, opline->op2);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -37312,19 +40649,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -37333,9 +40690,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -37347,38 +40704,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -37405,19 +40760,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -37426,9 +40801,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -37440,38 +40815,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -37492,25 +40865,45 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
USE_OPLINE
zval *object_ptr;
-
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
if (IS_CONST == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
@@ -37519,9 +40912,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -37533,37 +40926,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (IS_CONST == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = EX_CONSTANT(opline->op2);
+ dim = RT_CONSTANT(opline, opline->op2);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -37587,8 +40978,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN
zval *variable_ptr;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ value = RT_CONSTANT(opline, opline->op2);
+ variable_ptr = EX_VAR(opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
@@ -37615,8 +41006,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US
zval *variable_ptr;
SAVE_OPLINE();
- value = EX_CONSTANT(opline->op2);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ value = RT_CONSTANT(opline, opline->op2);
+ variable_ptr = EX_VAR(opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
@@ -37643,46 +41034,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
zend_string *op1_str, *op2_str, *str;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
(IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- } while (0);
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+
+ }
ZEND_VM_NEXT_OPCODE();
}
@@ -37695,7 +41084,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
if (IS_CONST == IS_CONST) {
op2_str = Z_STR_P(op2);
@@ -37705,26 +41094,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
if (IS_CV != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
if (IS_CONST == IS_CONST) {
- zend_string_addref(op2_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
if (IS_CONST != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
if (IS_CV == IS_CONST) {
- zend_string_addref(op1_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -37733,10 +41126,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
if (IS_CV != IS_CONST) {
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
}
if (IS_CONST != IS_CONST) {
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
@@ -37744,11 +41137,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
-
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -37758,13 +41151,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = EX_CONSTANT(opline->op2);
+ if (IS_CONST != IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
if (IS_CONST != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
@@ -37800,11 +41195,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
+ if (IS_CONST != IS_CONST) {
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+ zend_invalid_method_call(object, function_name);
HANDLE_EXCEPTION();
@@ -37816,8 +41216,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
called_scope = obj->ce;
if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
@@ -37828,11 +41228,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
HANDLE_EXCEPTION();
}
+ if (IS_CONST == IS_CONST) {
+ function_name = RT_CONSTANT(opline, opline->op2);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
@@ -37842,25 +41246,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CONST != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
+ if (IS_CV == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -37871,72 +41287,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -37947,28 +41297,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONS
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_TMP_VAR) {
/* pass */
} else if (IS_CV == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CV == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -37981,7 +41330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONS
if (IS_CONST != IS_UNUSED) {
- zval *offset = EX_CONSTANT(opline->op2);
+ zval *offset = RT_CONSTANT(opline, opline->op2);
zend_string *str;
zend_ulong hval;
@@ -38019,14 +41368,14 @@ num_index:
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -38041,73 +41390,67 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDL
array = EX_VAR(opline->result.var);
if (IS_CV != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CV != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ /*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_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
HANDLE_EXCEPTION();
}
} else {
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -38123,8 +41466,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLE
zend_string *key;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
- offset = EX_CONSTANT(opline->op2);
+ container = EX_VAR(opline->op1.var);
+ offset = RT_CONSTANT(opline, opline->op2);
do {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -38191,8 +41534,11 @@ num_index_dim:
}
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
} else {
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
}
} else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -38216,7 +41562,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE
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));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -38230,11 +41576,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
@@ -38248,44 +41592,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
zval *value;
int result;
- zval tmp, *varname;
+ zval *varname;
+ zend_string *name, *tmp_name;
zend_class_entry *ce;
SAVE_OPLINE();
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
if (IS_CONST == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ } 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)), 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();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ 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));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -38294,34 +41625,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
+ value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
goto is_static_prop_return;
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+ 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
result = value && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = !value || !i_zend_is_true(value);
}
@@ -38340,8 +41672,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- offset = EX_CONSTANT(opline->op2);
+ container = EX_VAR(opline->op1.var);
+ offset = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht;
@@ -38358,8 +41690,7 @@ isset_again:
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -38367,91 +41698,32 @@ num_index_prop:
} else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if (IS_CONST & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
@@ -38477,7 +41749,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = EX_CONSTANT(opline->op2);
+ offset = RT_CONSTANT(opline, opline->op2);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -38491,15 +41763,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
@@ -38516,18 +41786,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDL
zend_bool result;
SAVE_OPLINE();
- expr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ expr = EX_VAR(opline->op1.var);
try_instanceof:
if (Z_TYPE_P(expr) == IS_OBJECT) {
zend_class_entry *ce;
if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+ ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ CACHE_PTR(opline->extended_value, ce);
}
}
} else if (IS_CONST == IS_UNUSED) {
@@ -38565,11 +41835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
SAVE_OPLINE();
if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -38607,10 +41873,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -38642,7 +41913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
/* Set the new yielded key */
if (IS_CONST != IS_UNUSED) {
- zval *key = EX_CONSTANT(opline->op2);
+ zval *key = RT_CONSTANT(opline, opline->op2);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
@@ -38700,40 +41971,39 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C
zval *varname;
zval *value;
zval *variable_ptr;
- uint32_t idx;
+ uintptr_t idx;
zend_reference *ref;
ZEND_VM_REPEATABLE_OPCODE
- varname = EX_CONSTANT(opline->op2);
+ varname = RT_CONSTANT(opline, opline->op2);
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- idx = (uint32_t)(uintptr_t)CACHED_PTR(Z_CACHE_SLOT_P(varname)) - 1;
- if (EXPECTED(idx < EG(symbol_table).nNumUsed)) {
- Bucket *p = EG(symbol_table).arData + idx;
+ idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
+ if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
(EXPECTED(p->key == Z_STR_P(varname)) ||
(EXPECTED(p->h == ZSTR_H(Z_STR_P(varname))) &&
EXPECTED(p->key != NULL) &&
- EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(varname)) &&
- EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(varname), Z_STRLEN_P(varname)) == 0)))) {
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) {
- value = &EG(symbol_table).arData[idx].val;
+ value = (zval*)p; /* value = &p->val; */
goto check_indirect;
}
}
- value = zend_hash_find(&EG(symbol_table), Z_STR_P(varname));
+ value = zend_hash_find_ex(&EG(symbol_table), Z_STR_P(varname), 1);
if (UNEXPECTED(value == NULL)) {
value = zend_hash_add_new(&EG(symbol_table), Z_STR_P(varname), &EG(uninitialized_zval));
- idx = ((char*)value - (char*)EG(symbol_table).arData) / sizeof(Bucket);
+ idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(Z_CACHE_SLOT_P(varname), (void*)(uintptr_t)(idx + 1));
+ CACHE_PTR(opline->extended_value, (void*)(idx + 1));
} else {
- idx = ((char*)value - (char*)EG(symbol_table).arData) / sizeof(Bucket);
+ idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
- CACHE_PTR(Z_CACHE_SLOT_P(varname), (void*)(uintptr_t)(idx + 1));
+ CACHE_PTR(opline->extended_value, (void*)(idx + 1));
check_indirect:
/* GLOBAL variable may be an INDIRECT pointer to CV */
if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
@@ -38745,27 +42015,23 @@ check_indirect:
}
if (UNEXPECTED(!Z_ISREF_P(value))) {
- ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_REFCOUNT(ref) = 2;
- GC_TYPE_INFO(ref) = IS_REFERENCE;
- ZVAL_COPY_VALUE(&ref->val, value);
- Z_REF_P(value) = ref;
- Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+ ZVAL_MAKE_REF_EX(value, 2);
+ ref = Z_REF_P(value);
} else {
ref = Z_REF_P(value);
- GC_REFCOUNT(ref)++;
+ GC_ADDREF(ref);
}
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(variable_ptr);
- uint32_t refcnt = --GC_REFCOUNT(ref);
+ uint32_t refcnt = GC_DELREF(ref);
if (EXPECTED(variable_ptr != value)) {
if (refcnt == 0) {
SAVE_OPLINE();
- zval_dtor_func(ref);
+ rc_dtor_func(ref);
if (UNEXPECTED(EG(exception))) {
ZVAL_NULL(variable_ptr);
HANDLE_EXCEPTION();
@@ -38786,27 +42052,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND
USE_OPLINE
HashTable *ht;
- zval *varname;
zval *value;
zval *variable_ptr;
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
zval_ptr_dtor(variable_ptr);
ht = EX(func)->op_array.static_variables;
ZEND_ASSERT(ht != NULL);
if (GC_REFCOUNT(ht) > 1) {
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_REFCOUNT(ht)--;
+ GC_DELREF(ht);
}
EX(func)->op_array.static_variables = ht = zend_array_dup(ht);
}
- varname = EX_CONSTANT(opline->op2);
- value = zend_hash_find(ht, Z_STR_P(varname));
+ value = (zval*)((char*)ht->arData + (opline->extended_value & ~ZEND_BIND_REF));
- if (opline->extended_value) {
- if (Z_CONSTANT_P(value)) {
+ if (opline->extended_value & ZEND_BIND_REF) {
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
SAVE_OPLINE();
if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
ZVAL_NULL(variable_ptr);
@@ -38815,7 +42079,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND
}
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_REFCOUNT(ref) = 2;
+ GC_SET_REFCOUNT(ref, 2);
GC_TYPE_INFO(ref) = IS_REFERENCE;
ZVAL_COPY_VALUE(&ref->val, value);
Z_REF_P(value) = ref;
@@ -38832,70 +42096,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op, *jump_zv;
- HashTable *jumptable;
-
- op = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
-
- if (Z_TYPE_P(op) != IS_LONG) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_LONG) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op, *jump_zv;
- HashTable *jumptable;
-
- op = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
-
- if (Z_TYPE_P(op) != IS_STRING) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_STRING) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- jump_zv = zend_hash_find(jumptable, Z_STR_P(op));
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1;
- HashTable *ht = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
+ HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
int result;
SAVE_OPLINE();
@@ -38936,9 +42142,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_
zval *container, *dim, *value;
zend_long offset;
+ HashTable *ht;
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = EX_CONSTANT(opline->op2);
+ container = EX_VAR(opline->op1.var);
+ dim = RT_CONSTANT(opline, opline->op2);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_index_array:
if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
@@ -38946,8 +42153,9 @@ fetch_dim_r_index_array:
} else {
offset = zval_get_long(dim);
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, fetch_dim_r_index_undef);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -38965,7 +42173,10 @@ fetch_dim_r_index_array:
} else {
fetch_dim_r_index_slow:
SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
+ if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -38973,2387 +42184,72 @@ fetch_dim_r_index_slow:
fetch_dim_r_index_undef:
ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(0)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
- if (UNEXPECTED(0)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(1)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
- if (UNEXPECTED(1)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
-
- SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- /* Destroy the previously yielded value */
- zval_ptr_dtor(&generator->value);
-
- /* Destroy the previously yielded key */
- zval_ptr_dtor(&generator->key);
-
- /* Set the new yielded value */
- if (IS_CV != IS_UNUSED) {
-
-
- if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- /* Constants and temporary variables aren't yieldable by reference,
- * but we still allow them with a notice. */
- if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
- zval *value;
-
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
-
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- }
- } else {
- zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- /* If a function call result is yielded and the function did
- * not return by reference we throw a notice. */
- if (IS_CV == IS_VAR &&
- (value_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION &&
- !Z_ISREF_P(value_ptr)))) {
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- } else {
- ZVAL_MAKE_REF(value_ptr);
- }
- ZVAL_COPY(&generator->value, value_ptr);
-
- }
- } else {
- zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-
- /* Consts, temporary variables and references need copying */
- if (IS_CV == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- } else if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
-
- } else {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- }
- }
- }
- } else {
- /* If no value was specified yield null */
- ZVAL_NULL(&generator->value);
- }
-
- /* Set the new yielded key */
- if (IS_TMP_VAR != IS_UNUSED) {
- zend_free_op free_op2;
- zval *key = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- /* Consts, temporary variables and references need copying */
- if (IS_TMP_VAR == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
- Z_ADDREF(generator->key);
- }
- } else if (IS_TMP_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
- ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
-
- } else {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (IS_TMP_VAR == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
- }
- }
-
- if (Z_TYPE(generator->key) == IS_LONG
- && Z_LVAL(generator->key) > generator->largest_used_integer_key
- ) {
- generator->largest_used_integer_key = Z_LVAL(generator->key);
- }
- } else {
- /* If no key was specified we use auto-increment keys */
- generator->largest_used_integer_key++;
- ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
- }
-
- if (RETURN_VALUE_USED(opline)) {
- /* If the return value of yield is used set the send
- * target and initialize it to NULL */
- generator->send_target = EX_VAR(opline->result.var);
- ZVAL_NULL(generator->send_target);
- } else {
- generator->send_target = NULL;
- }
-
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
-
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
-
- ZEND_VM_RETURN();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- 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)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- retval = zend_fetch_static_property_address(varname, IS_CV, opline->op2, IS_VAR, type EXECUTE_DATA_CC);
-
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
-
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(0)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
- if (UNEXPECTED(0)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- zval_ptr_dtor_nogc(free_op2);
- if (UNEXPECTED(1)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
- if (UNEXPECTED(1)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *variable_ptr;
- zval *value_ptr;
-
- SAVE_OPLINE();
- value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) &&
- UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) {
-
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
-
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
-
- } else if (IS_VAR == IS_VAR &&
- opline->extended_value == ZEND_RETURNS_FUNCTION &&
- UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- zend_error(E_NOTICE, "Only variables should be assigned by reference");
- if (UNEXPECTED(EG(exception) != NULL)) {
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
- }
- /* zend_assign_to_variable() always takes care of op2, never free it! */
-
- } else {
-
- if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) ||
- (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr)))) {
- variable_ptr = &EG(uninitialized_zval);
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
-
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval tmp, *varname;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- zend_std_unset_static_property(ce, Z_STR_P(varname));
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
+ zend_undefined_offset(offset);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *value;
- int result;
-
- zval tmp, *varname;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_VAR == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else {
- if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
- }
- }
-
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
-
- if (IS_CV == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
- }
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
-is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *expr;
- zend_bool result;
-
- SAVE_OPLINE();
- expr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
-try_instanceof:
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
-
- if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), 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));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- goto try_instanceof;
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
-
- SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- /* Destroy the previously yielded value */
- zval_ptr_dtor(&generator->value);
-
- /* Destroy the previously yielded key */
- zval_ptr_dtor(&generator->key);
-
- /* Set the new yielded value */
- if (IS_CV != IS_UNUSED) {
-
-
- if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- /* Constants and temporary variables aren't yieldable by reference,
- * but we still allow them with a notice. */
- if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
- zval *value;
-
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
-
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- }
- } else {
- zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- /* If a function call result is yielded and the function did
- * not return by reference we throw a notice. */
- if (IS_CV == IS_VAR &&
- (value_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION &&
- !Z_ISREF_P(value_ptr)))) {
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- } else {
- ZVAL_MAKE_REF(value_ptr);
- }
- ZVAL_COPY(&generator->value, value_ptr);
-
- }
- } else {
- zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-
- /* Consts, temporary variables and references need copying */
- if (IS_CV == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- } else if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
-
- } else {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- }
- }
- }
- } else {
- /* If no value was specified yield null */
- ZVAL_NULL(&generator->value);
- }
-
- /* Set the new yielded key */
- if (IS_VAR != IS_UNUSED) {
- zend_free_op free_op2;
- zval *key = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- /* Consts, temporary variables and references need copying */
- if (IS_VAR == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
- Z_ADDREF(generator->key);
- }
- } else if (IS_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
- ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
- zval_ptr_dtor_nogc(free_op2);
- } else {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (IS_VAR == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
- }
- }
-
- if (Z_TYPE(generator->key) == IS_LONG
- && Z_LVAL(generator->key) > generator->largest_used_integer_key
- ) {
- generator->largest_used_integer_key = Z_LVAL(generator->key);
- }
- } else {
- /* If no key was specified we use auto-increment keys */
- generator->largest_used_integer_key++;
- ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
- }
-
- if (RETURN_VALUE_USED(opline)) {
- /* If the return value of yield is used set the send
- * target and initialize it to NULL */
- generator->send_target = EX_VAR(opline->result.var);
- ZVAL_NULL(generator->send_target);
- } else {
- generator->send_target = NULL;
- }
-
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
-
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
-
- ZEND_VM_RETURN();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op_data1;
- zval *var_ptr;
- zval *value, *container, *dim;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ zval *container, *dim, *value;
+ zend_long offset;
+ HashTable *ht;
+ container = EX_VAR(opline->op1.var);
+ dim = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-assign_dim_op_array:
- SEPARATE_ARRAY(container);
-assign_dim_op_new_array:
- if (IS_UNUSED == IS_UNUSED) {
- var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
- if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_op_ret_null;
- }
- } else {
- dim = NULL;
-
- if (IS_UNUSED == IS_CONST) {
- var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
- } else {
- var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(!var_ptr)) {
- goto assign_dim_op_ret_null;
- }
- ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
- }
-
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
-
- binary_op(var_ptr, var_ptr, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(container))) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto assign_dim_op_array;
- }
- } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
-assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto assign_dim_op_new_array;
- }
-
- dim = NULL;
-
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
+fetch_dim_r_index_array:
+ if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
+ offset = Z_LVAL_P(dim);
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- } else {
- zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
- }
- UNDEF_RESULT();
- } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
- goto assign_dim_op_convert_to_array;
- } else {
- if (UNEXPECTED(IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
-assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- }
- }
-
- FREE_OP(free_op_data1);
-
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
-}
-
-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));
-#else
-# if 0 || IS_CV != IS_UNUSED
- USE_OPLINE
-
- 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(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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_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_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_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_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_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_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_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_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_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_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_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
- zend_string *name;
- HashTable *target_symbol_table;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- zend_string_addref(name);
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ offset = zval_get_long(dim);
}
- name = zval_get_string(varname);
- }
-
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- retval = zend_hash_find(target_symbol_table, name);
- if (retval == NULL) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- zval *result;
+ ht = Z_ARRVAL_P(container);
+ ZEND_HASH_INDEX_FIND(ht, offset, value, fetch_dim_r_index_undef);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
-fetch_this:
- result = EX_VAR(opline->result.var);
- switch (type) {
- case BP_VAR_R:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- zend_error(E_NOTICE,"Undefined variable: this");
- }
- break;
- case BP_VAR_IS:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- }
- break;
- case BP_VAR_RW:
- case BP_VAR_W:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot re-assign $this");
- break;
- case BP_VAR_UNSET:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot unset $this");
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- if (IS_CV != IS_CONST) {
- zend_string_release(name);
- }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- case BP_VAR_W:
- retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
- } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
- retval = Z_INDIRECT_P(retval);
- if (Z_TYPE_P(retval) == IS_UNDEF) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- goto fetch_this;
- }
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_W:
- ZVAL_NULL(retval);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- }
- }
-
- if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
-
- }
-
- if (IS_CV != IS_CONST) {
- zend_string_release(name);
- }
-
- ZEND_ASSERT(retval != NULL);
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-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;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- retval = zend_fetch_static_property_address(varname, IS_CV, opline->op2, IS_UNUSED, type EXECUTE_DATA_CC);
-
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
-
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED EXECUTE_DATA_CC);
-
-
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-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 *value;
- zval *variable_ptr;
- zval *dim;
-
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = NULL;
- if (IS_UNUSED == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- goto assign_dim_error;
- }
- }
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = NULL;
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = NULL;
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
-
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = NULL;
-assign_dim_error:
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if (IS_UNUSED != IS_UNUSED) {
-
- }
-
- /* assign_dim 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_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *object_ptr;
- zend_free_op free_op_data;
- zval *value;
- zval *variable_ptr;
- zval *dim;
-
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = NULL;
- if (IS_UNUSED == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = NULL;
- value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- zval_ptr_dtor_nogc(free_op_data);
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = NULL;
- value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op_data);
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = NULL;
-assign_dim_error:
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if (IS_UNUSED != IS_UNUSED) {
-
- }
-
- /* assign_dim 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_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *object_ptr;
- zend_free_op free_op_data;
- zval *value;
- zval *variable_ptr;
- zval *dim;
-
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = NULL;
- if (IS_UNUSED == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = NULL;
- value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- zval_ptr_dtor_nogc(free_op_data);
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = NULL;
- value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op_data);
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = NULL;
-assign_dim_error:
- zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if (IS_UNUSED != IS_UNUSED) {
-
- }
-
- /* assign_dim 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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *object_ptr;
-
- zval *value;
- zval *variable_ptr;
- zval *dim;
-
- SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
-try_assign_dim_array:
- SEPARATE_ARRAY(object_ptr);
- if (IS_UNUSED == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
- if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- goto assign_dim_error;
- }
- } else {
- dim = NULL;
- if (IS_UNUSED == IS_CONST) {
- variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- } else {
- variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
- }
- if (UNEXPECTED(variable_ptr == NULL)) {
- 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);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- } else {
- if (EXPECTED(Z_ISREF_P(object_ptr))) {
- object_ptr = Z_REFVAL_P(object_ptr);
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
- goto try_assign_dim_array;
- }
- }
- if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = NULL;
- value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_UNUSED == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else {
- dim = NULL;
- value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
-
- }
- } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
- goto try_assign_dim_array;
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
- }
- dim = NULL;
-assign_dim_error:
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- }
- }
- if (IS_UNUSED != IS_UNUSED) {
-
- }
-
- /* assign_dim has two opcodes! */
- 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
-
- SAVE_OPLINE();
- if (IS_CV == IS_UNUSED) {
- zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
- } else {
-/* prevents "undefined variable opline" errors */
-#if 0 || (IS_CV != IS_UNUSED)
- zval *retval_ref, *retval_ptr;
-
- zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
- retval_ref = retval_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_CONST) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
- retval_ref = retval_ptr = EX_VAR(opline->result.var);
- } else if (IS_CV == IS_VAR) {
- if (UNEXPECTED(Z_TYPE_P(retval_ptr) == IS_INDIRECT)) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- ZVAL_DEREF(retval_ptr);
- } else if (IS_CV == IS_CV) {
- ZVAL_DEREF(retval_ptr);
- }
-
- if (UNEXPECTED(!ZEND_TYPE_IS_CLASS(ret_info->type)
- && ZEND_TYPE_CODE(ret_info->type) != IS_CALLABLE
- && ZEND_TYPE_CODE(ret_info->type) != IS_ITERABLE
- && !ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(ret_info->type), Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
- }
- retval_ptr = retval_ref;
- }
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
-#endif
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *expr_ptr, new_expr;
-
- SAVE_OPLINE();
- if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
- UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
- expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
-
- } else {
- expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- if (IS_CV == IS_TMP_VAR) {
- /* pass */
- } else if (IS_CV == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else if (IS_CV == IS_CV) {
- ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- } else /* if (IS_CV == IS_VAR) */ {
- if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
- zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
-
- expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
- }
- }
- }
-
- if (IS_UNUSED != IS_UNUSED) {
-
- zval *offset = NULL;
- zend_string *str;
- zend_ulong hval;
-
-add_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if (IS_UNUSED != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
- }
-str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto add_again;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index;
- } else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- }
-
- } else {
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
- }
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zval *array;
- uint32_t size;
- USE_OPLINE
-
- array = EX_VAR(opline->result.var);
- if (IS_CV != IS_UNUSED) {
- size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CV != IS_UNUSED) {
- /* Explicitly initialize array as not-packed if flag is set */
- if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
- }
- }
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *var = EX_VAR(opline->op1.var);
-
- if (Z_REFCOUNTED_P(var)) {
- zend_refcounted *garbage = Z_COUNTED_P(var);
-
- ZVAL_UNDEF(var);
- SAVE_OPLINE();
- if (!--GC_REFCOUNT(garbage)) {
- zval_dtor_func(garbage);
- } else {
- gc_check_possible_root(garbage);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZVAL_UNDEF(var);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval tmp, *varname;
- HashTable *target_symbol_table;
-
-
- SAVE_OPLINE();
-
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval tmp, *varname;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- zend_std_unset_static_property(ce, Z_STR_P(varname));
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- value = EX_VAR(opline->op1.var);
- if (opline->extended_value & ZEND_ISSET) {
- result =
- Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- SAVE_OPLINE();
- result = !i_zend_is_true(value);
- if (UNEXPECTED(EG(exception))) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval tmp, *varname;
- HashTable *target_symbol_table;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval tmp, *varname;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_UNUSED == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
- 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
- }
- }
-
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
-
- if (IS_CV == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
- }
-
- if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
-
-is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *expr;
- zend_bool result;
-
- SAVE_OPLINE();
- expr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
-try_instanceof:
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
-
- if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), 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));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- goto try_instanceof;
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
-
- SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- /* Destroy the previously yielded value */
- zval_ptr_dtor(&generator->value);
-
- /* Destroy the previously yielded key */
- zval_ptr_dtor(&generator->key);
-
- /* Set the new yielded value */
- if (IS_CV != IS_UNUSED) {
-
-
- if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- /* Constants and temporary variables aren't yieldable by reference,
- * but we still allow them with a notice. */
- if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
- zval *value;
-
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
-
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- }
- } else {
- zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- /* If a function call result is yielded and the function did
- * not return by reference we throw a notice. */
- if (IS_CV == IS_VAR &&
- (value_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION &&
- !Z_ISREF_P(value_ptr)))) {
- zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- } else {
- ZVAL_MAKE_REF(value_ptr);
- }
- ZVAL_COPY(&generator->value, value_ptr);
-
- }
- } else {
- zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-
- /* Consts, temporary variables and references need copying */
- if (IS_CV == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
- Z_ADDREF(generator->value);
- }
- } else if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
-
- } else {
- ZVAL_COPY_VALUE(&generator->value, value);
- if (IS_CV == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
- }
- }
- }
- } else {
- /* If no value was specified yield null */
- ZVAL_NULL(&generator->value);
- }
-
- /* Set the new yielded key */
- if (IS_UNUSED != IS_UNUSED) {
-
- zval *key = NULL;
-
- /* Consts, temporary variables and references need copying */
- if (IS_UNUSED == IS_CONST) {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
- Z_ADDREF(generator->key);
- }
- } else if (IS_UNUSED == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
- ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
-
- } else {
- ZVAL_COPY_VALUE(&generator->key, key);
- if (IS_UNUSED == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
- }
- }
-
- if (Z_TYPE(generator->key) == IS_LONG
- && Z_LVAL(generator->key) > generator->largest_used_integer_key
- ) {
- generator->largest_used_integer_key = Z_LVAL(generator->key);
- }
- } else {
- /* If no key was specified we use auto-increment keys */
- generator->largest_used_integer_key++;
- ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
- }
-
- if (RETURN_VALUE_USED(opline)) {
- /* If the return value of yield is used set the send
- * target and initialize it to NULL */
- generator->send_target = EX_VAR(opline->result.var);
- ZVAL_NULL(generator->send_target);
- } else {
- generator->send_target = NULL;
- }
-
- /* We increment to the next op, so we are at the correct position when the
- * generator is resumed. */
- ZEND_VM_INC_OPCODE();
-
- /* The GOTO VM uses a local opline variable. We need to set the opline
- * variable in execute_data so we don't resume at an old position. */
- SAVE_OPLINE();
-
- ZEND_VM_RETURN();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1 = EX_VAR(opline->op1.var);
-
- if (UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1 = EX_VAR(opline->op1.var);
-
- if (IS_CV == IS_CV) {
- if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- ZVAL_NEW_EMPTY_REF(op1);
- Z_SET_REFCOUNT_P(op1, 2);
- ZVAL_NULL(Z_REFVAL_P(op1));
- ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
- } else {
- ZVAL_MAKE_REF(op1);
- ZVAL_COPY(EX_VAR(opline->result.var), op1);
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
- op1 = Z_INDIRECT_P(op1);
- if (EXPECTED(!Z_ISREF_P(op1))) {
- ZVAL_MAKE_REF(op1);
- }
- GC_REFCOUNT(Z_REF_P(op1))++;
- ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1;
- zend_long count;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- do {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
- break;
- } else if (Z_TYPE_P(op1) == IS_OBJECT) {
- /* first, we check if the handler is defined */
- if (Z_OBJ_HT_P(op1)->count_elements) {
- if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
- break;
- }
- }
-
- /* if not and the object implements Countable we call its count() method */
- if (instanceof_function(Z_OBJCE_P(op1), zend_ce_countable)) {
- zval retval;
-
- zend_call_method_with_0_params(op1, NULL, NULL, "count", &retval);
- count = zval_get_long(&retval);
- zval_ptr_dtor(&retval);
- break;
- }
-
- /* If There's no handler and it doesn't implement Countable then add a warning */
- count = 1;
- } else if (Z_TYPE_P(op1) == IS_NULL) {
- count = 0;
- } else {
- count = 1;
+ ZEND_VM_NEXT_OPCODE();
}
- zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
- } while (0);
-
- ZVAL_LONG(EX_VAR(opline->result.var), count);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (IS_CV == IS_UNUSED) {
- if (UNEXPECTED(!EX(func)->common.scope)) {
- SAVE_OPLINE();
- zend_error(E_WARNING, "get_class() called without object from outside a class");
- ZVAL_FALSE(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_index_array;
} else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
- ZEND_VM_NEXT_OPCODE();
+ goto fetch_dim_r_index_slow;
}
} else {
-
- zval *op1;
-
+fetch_dim_r_index_slow:
SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- if (Z_TYPE_P(op1) == IS_OBJECT) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
- } else {
- zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
- ZVAL_FALSE(EX_VAR(opline->result.var));
+ if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1;
- zend_string *type;
+fetch_dim_r_index_undef:
+ ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- type = zend_zval_get_type(op1);
- if (EXPECTED(type)) {
- ZVAL_INTERNED_STR(EX_VAR(opline->result.var), type);
- } else {
- ZVAL_STRING(EX_VAR(opline->result.var), "unknown type");
- }
+ zend_undefined_offset(offset);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -41380,23 +42276,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OP
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -41423,23 +42319,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OP
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -41469,46 +42365,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OP
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -41523,23 +42416,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -41551,23 +42444,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPC
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_left_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -41579,77 +42472,75 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPC
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_right_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
pow_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
+ zval_ptr_dtor_nogc(free_op2);
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
- } while (0);
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
@@ -41657,60 +42548,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
concat_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_identical_function(op1, op2);
-
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
- int result;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- result = fast_is_not_identical_function(op1, op2);
-
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
int result;
@@ -41732,19 +42587,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op2);
} else {
break;
}
@@ -41760,25 +42605,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
int result;
@@ -41800,19 +42645,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
-
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op2);
} else {
break;
}
@@ -41828,25 +42663,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
int result;
@@ -41878,25 +42713,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
int result;
@@ -41928,40 +42763,40 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
compare_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
@@ -41972,23 +42807,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
@@ -41999,23 +42834,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
@@ -42026,34 +42861,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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_op_data1;
+ zend_free_op free_op2, free_op_data1;
zval *object;
zval *property;
zval *value;
@@ -42066,34 +42901,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- value = get_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_data1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+assign_op_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -42101,41 +42935,40 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
FREE_OP(free_op_data1);
-
+ 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_dim_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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
- zend_free_op free_op_data1;
+ zend_free_op free_op2, free_op_data1;
zval *var_ptr;
zval *value, *container, *dim;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
- if (IS_CV == IS_UNUSED) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
@@ -42144,10 +42977,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -42163,56 +42995,57 @@ assign_dim_op_new_array:
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
+ zval_ptr_dtor_nogc(free_op2);
FREE_OP(free_op_data1);
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *var_ptr;
zval *value;
SAVE_OPLINE();
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
@@ -42221,7 +43054,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
}
} else {
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
binary_op(var_ptr, var_ptr, value);
@@ -42230,254 +43062,264 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
}
}
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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)
+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_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_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));
#else
# if 0 || IS_CV != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
USE_OPLINE
+# endif
if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
# endif
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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_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_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));
#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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
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_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
# endif
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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_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_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));
#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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
# endif
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_CV(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_pre_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
@@ -42489,25 +43331,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
+pre_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -42521,7 +43363,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
} else {
ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
if (inc) {
increment_function(zptr);
@@ -42534,28 +43375,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
}
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ 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);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
@@ -42567,29 +43409,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
break;
}
}
/* here we are sure we are dealing with an object */
-
+post_incdec_object:
if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
+ && 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)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
if (inc) {
fast_long_increment_function(zptr);
} else {
@@ -42597,8 +43440,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
} else {
ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
if (inc) {
increment_function(zptr);
} else {
@@ -42607,39 +43449,40 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
}
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
+ 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);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container, *dim, *value, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_CV != IS_CONST) {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CV, BP_VAR_R EXECUTE_DATA_CC);
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
+ ZVAL_COPY_DEREF(result, value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -42649,152 +43492,134 @@ fetch_dim_r_array:
}
} else {
fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CV EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read_R(container, dim, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
}
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+ zend_free_op free_op1, free_op2;
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_W(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+ zend_free_op free_op1, free_op2;
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_RW(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_read_IS(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
-
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+ zend_free_op free_op1, free_op2;
zval *container;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_UNSET(container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
-
+ zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- } else {
goto fetch_obj_r_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -42802,75 +43627,97 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_read(offset);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *property;
- zval *container;
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *property;
- zval *container;
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *result;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
@@ -42878,23 +43725,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE
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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *container;
-
+ zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
@@ -42903,18 +43751,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -42922,21 +43771,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -42946,7 +43817,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -42954,51 +43825,30 @@ fetch_obj_is_no_object:
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
- zend_free_op free_op1;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- 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));
- }
if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
-
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container, *property;
+ zend_free_op free_op1, free_op2;
+ zval *container, *property, *result;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
@@ -43007,95 +43857,53 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
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);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
-
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ 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);
+ zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- value = EX_CONSTANT((opline+1)->op1);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -43109,11 +43917,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -43132,24 +43940,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CONST == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -43162,12 +43966,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -43176,84 +43975,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -43267,11 +44038,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -43290,24 +44061,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_TMP_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -43320,12 +44087,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -43334,84 +44096,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
}
- if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -43425,11 +44159,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -43448,24 +44182,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_VAR == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -43478,12 +44208,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
goto exit_assign_obj;
}
@@ -43492,84 +44217,56 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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_ptr_dtor_nogc(free_op_data);
exit_assign_obj:
-
+ 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_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *object, *property, *value, tmp;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- goto exit_assign_obj;
- }
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if (IS_CV == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
+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*));
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
fast_assign_obj:
@@ -43583,11 +44280,11 @@ fast_assign_obj:
if (EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
+ GC_DELREF(zobj->properties);
}
zobj->properties = zend_array_dup(zobj->properties);
}
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
if (property_val) {
goto fast_assign_obj;
}
@@ -43606,24 +44303,20 @@ fast_assign_obj:
if (Z_ISREF_P(value)) {
if (IS_CV == IS_VAR) {
zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
+ if (GC_DELREF(ref) == 0) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
efree_size(ref, sizeof(zend_reference));
value = &tmp;
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
} else {
value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
+ Z_TRY_ADDREF_P(value);
}
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
}
}
zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
@@ -43636,12 +44329,7 @@ fast_assign_obj:
}
if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
goto exit_assign_obj;
}
@@ -43650,44 +44338,64 @@ fast_assign_obj:
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
+ 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);
}
exit_assign_obj:
-
+ 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_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
-
+ zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -43695,9 +44403,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -43709,37 +44417,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -43747,39 +44453,59 @@ assign_dim_error:
}
}
}
- if (IS_CV != IS_UNUSED) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -43787,9 +44513,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -43801,38 +44527,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -43840,39 +44564,59 @@ assign_dim_error:
}
}
}
- if (IS_CV != IS_UNUSED) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
- zend_free_op free_op_data;
+ zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -43880,9 +44624,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -43894,38 +44638,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -43933,39 +44675,59 @@ assign_dim_error:
}
}
}
- if (IS_CV != IS_UNUSED) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
-
+ zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if (IS_CV == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -43973,9 +44735,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -43987,37 +44749,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if (IS_CV == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -44025,174 +44785,60 @@ assign_dim_error:
}
}
}
- if (IS_CV != IS_UNUSED) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zval_ptr_dtor_nogc(free_op2);
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
-
- if (UNEXPECTED(0)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
- if (UNEXPECTED(0)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *value;
- zval *variable_ptr;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
-
- if (UNEXPECTED(1)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
- if (UNEXPECTED(1)) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
- /* zend_assign_to_variable() always takes care of op2, never free it! */
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *variable_ptr;
- zval *value_ptr;
-
- SAVE_OPLINE();
- value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
- variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR &&
- UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
- UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) &&
- UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) {
-
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
-
- } else if (IS_CV == IS_VAR &&
- opline->extended_value == ZEND_RETURNS_FUNCTION &&
- UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- zend_error(E_NOTICE, "Only variables should be assigned by reference");
- if (UNEXPECTED(EG(exception) != NULL)) {
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
-
- value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value_ptr);
- }
- /* zend_assign_to_variable() always takes care of op2, never free it! */
-
- } else {
-
- if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) ||
- (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr)))) {
- variable_ptr = &EG(uninitialized_zval);
- } else {
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
- }
-
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *op1, *op2;
zend_string *op1_str, *op2_str, *str;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
+ zval_ptr_dtor_nogc(free_op2);
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
- } while (0);
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ zval_ptr_dtor_nogc(free_op2);
+ }
ZEND_VM_NEXT_OPCODE();
}
@@ -44205,36 +44851,40 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
- if (IS_CV == IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
op2_str = Z_STR_P(op2);
} else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
op2_str = zend_string_copy(Z_STR_P(op2));
} else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
if (IS_CV != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (IS_CV == IS_CONST) {
- zend_string_addref(op2_str);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
- if (IS_CV != IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
if (IS_CV == IS_CONST) {
- zend_string_addref(op1_str);
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -44243,22 +44893,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
if (IS_CV != IS_CONST) {
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
}
- if (IS_CV != IS_CONST) {
- zend_string_release(op2_str);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
-
+ zend_free_op free_op1, free_op2;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -44268,23 +44918,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
- if (IS_CV != IS_CONST &&
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -44292,7 +44944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
}
}
zend_throw_error(NULL, "Method name must be a string");
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
} while (0);
@@ -44310,12 +44962,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+ zend_invalid_method_call(object, function_name);
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
@@ -44325,52 +44982,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
obj = Z_OBJ_P(object);
called_scope = obj->ce;
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
zend_throw_error(NULL, "Object does not support method calls");
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
-
+ zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
- if (IS_CV == IS_CONST &&
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zval_ptr_dtor_nogc(free_op2);
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
+
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
} else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
+ if (IS_CV == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
-
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -44381,73 +45054,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -44457,28 +45064,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_H
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_TMP_VAR) {
/* pass */
} else if (IS_CV == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CV == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -44489,16 +45095,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_H
}
}
- if (IS_CV != IS_UNUSED) {
-
- zval *offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
zend_string *str;
zend_ulong hval;
add_again:
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(str, hval)) {
goto num_index;
}
@@ -44509,7 +45115,7 @@ str_index:
hval = Z_LVAL_P(offset);
num_index:
zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
offset = Z_REFVAL_P(offset);
goto add_again;
} else if (Z_TYPE_P(offset) == IS_NULL) {
@@ -44524,25 +45130,25 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
- } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
-
+ zval_ptr_dtor_nogc(free_op2);
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zval *array;
uint32_t size;
@@ -44551,34 +45157,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(
array = EX_VAR(opline->result.var);
if (IS_CV != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CV != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
zval *offset;
zend_ulong hval;
zend_string *key;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
- offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -44590,7 +45192,7 @@ unset_dim_array:
offset_again:
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
key = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(key, hval)) {
goto num_index_dim;
}
@@ -44605,7 +45207,7 @@ str_index_dim:
hval = Z_LVAL_P(offset);
num_index_dim:
zend_hash_index_del(ht, hval);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
offset = Z_REFVAL_P(offset);
goto offset_again;
} else if (Z_TYPE_P(offset) == IS_DOUBLE) {
@@ -44623,7 +45225,7 @@ num_index_dim:
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
- } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
@@ -44640,13 +45242,16 @@ num_index_dim:
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
+ zend_use_object_as_array();
} else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
}
} else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -44654,14 +45259,15 @@ num_index_dim:
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
zval *offset;
@@ -44670,7 +45276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z
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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -44684,30 +45290,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z
}
}
if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_unset(offset);
}
} while (0);
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
int result;
zend_ulong hval;
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht;
@@ -44719,119 +45324,59 @@ isset_dim_obj_array:
isset_again:
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(str, hval)) {
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
value = zend_hash_index_find(ht, hval);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if ((IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if (IS_CV & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
-
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
+ zend_free_op free_op2;
zval *container;
int result;
zval *offset;
@@ -44843,7 +45388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_CV == IS_CONST ||
(IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -44857,36 +45402,123 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
+ zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+ int result;
- zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ result = fast_is_identical_function(op1, op2);
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+ int result;
SAVE_OPLINE();
- if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
- zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ result = fast_is_not_identical_function(op1, op2);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *value;
+ zval *variable_ptr;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(0)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ if (UNEXPECTED(0)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *value;
+ zval *variable_ptr;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(1)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ if (UNEXPECTED(1)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
/* Destroy the previously yielded value */
@@ -44924,10 +45556,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
(opline->extended_value == ZEND_RETURNS_FUNCTION &&
!Z_ISREF_P(value_ptr)))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
} else {
- ZVAL_MAKE_REF(value_ptr);
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
}
- ZVAL_COPY(&generator->value, value_ptr);
}
} else {
@@ -44957,24 +45594,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
}
/* Set the new yielded key */
- if (IS_CV != IS_UNUSED) {
-
- zval *key = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ if (IS_TMP_VAR != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *key = _get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
/* Consts, temporary variables and references need copying */
- if (IS_CV == IS_CONST) {
+ if (IS_TMP_VAR == IS_CONST) {
ZVAL_COPY_VALUE(&generator->key, key);
if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
Z_ADDREF(generator->key);
}
- } else if (IS_CV == IS_TMP_VAR) {
+ } else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
- if (IS_CV == IS_CV) {
+ if (IS_TMP_VAR == IS_CV) {
if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
}
@@ -45010,808 +45647,611 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
ZEND_VM_RETURN();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_free_op free_op2;
+ zval *op1, *op2;
+ int result;
- zval *container, *dim, *value;
- zend_long offset;
-
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
- }
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
- }
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ result = fast_is_identical_function(op1, op2);
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ zval *op1, *op2;
+ int result;
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- add_function(EX_VAR(opline->result.var), op1, op2);
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ result = fast_is_not_identical_function(op1, op2);
zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- sub_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ 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);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
+ if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- zend_long overflow;
+ 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)) {
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
+ 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;
+ }
}
- }
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ 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_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
+ retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- fast_div_function(EX_VAR(opline->result.var), op1, op2);
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (IS_CV == IS_CONST && EXPECTED(retval)) {
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
+ } while (0);
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
- /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
- ZVAL_LONG(result, 0);
- } else {
- ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
- }
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(retval == NULL)) {
+ if (EG(exception)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ } else {
+ ZEND_ASSERT(type == BP_VAR_IS);
+ retval = &EG(uninitialized_zval);
}
}
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
- mod_function(EX_VAR(opline->result.var), op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- pow_function(EX_VAR(opline->result.var), op1, op2);
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ 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_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
-
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
+ zval *value;
+ zval *variable_ptr;
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- }
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
- } while (0);
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE();
- } else {
- SAVE_OPLINE();
-
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(0)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ } else {
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ if (UNEXPECTED(0)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- concat_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
}
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval *value;
+ zval *variable_ptr;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
- zval_ptr_dtor_nogc(free_op2);
- } else {
- break;
- }
- } else {
- break;
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(1)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ if (UNEXPECTED(1)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *variable_ptr;
+ zval *value_ptr;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ SAVE_OPLINE();
+ value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else if (IS_CV == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zval_ptr_dtor_nogc(free_op2);
- } else {
- break;
- }
- } else {
- break;
+ zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
+
+ if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+ 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(variable_ptr, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) {
+ if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ /* op2 freed by assign_to_variable */
+
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ SAVE_OPLINE();
+
+ if (IS_VAR == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+
+ HANDLE_EXCEPTION();
}
- } else {
- break;
+ /*CACHE_PTR(opline->extended_value, ce);*/
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ } else if (IS_VAR == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *value;
+ int result;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
- } else {
- break;
+ 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)), 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();
}
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ 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 {
- break;
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ if (IS_CV == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
+ goto is_static_prop_return;
+ }
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- compare_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ 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);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
+ value = zend_std_get_static_property(ce, name, 1);
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ if (IS_CV == IS_CONST && value) {
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
}
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+
+is_static_prop_return:
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = value && 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);
}
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ zval *expr;
+ zend_bool result;
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ expr = EX_VAR(opline->op1.var);
+
+try_instanceof:
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ zend_class_entry *ce;
+
+ if (IS_VAR == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (EXPECTED(ce)) {
+ 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_ASSERT(EG(exception));
+
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+ result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
+ expr = Z_REFVAL_P(expr);
+ goto try_instanceof;
+ } else {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ }
+ result = 0;
}
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ /* Destroy the previously yielded value */
+ zval_ptr_dtor(&generator->value);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
+ /* Destroy the previously yielded key */
+ zval_ptr_dtor(&generator->key);
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
+ /* Set the new yielded value */
+ if (IS_CV != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op2, free_op_data1;
- zval *object;
- zval *property;
- zval *value;
- zval *zptr;
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ /* Constants and temporary variables aren't yieldable by reference,
+ * but we still allow them with a notice. */
+ if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
+ zval *value;
- SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ }
+ } else {
+ zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ /* If a function call result is yielded and the function did
+ * not return by reference we throw a notice. */
+ if (IS_CV == IS_VAR &&
+ (value_ptr == &EG(uninitialized_zval) ||
+ (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !Z_ISREF_P(value_ptr)))) {
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
+ } else {
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
+ }
- do {
- value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ }
+ } else {
+ zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ /* Consts, temporary variables and references need copying */
+ if (IS_CV == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ } else if (IS_CV == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
+
+ } else {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
- break;
}
}
+ } else {
+ /* If no value was specified yield null */
+ ZVAL_NULL(&generator->value);
+ }
- /* here we are sure we are dealing with an object */
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
+ /* Set the new yielded key */
+ if (IS_VAR != IS_UNUSED) {
+ zend_free_op free_op2;
+ zval *key = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- binary_op(zptr, zptr, value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
+ /* Consts, temporary variables and references need copying */
+ if (IS_VAR == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
+ Z_ADDREF(generator->key);
}
+ } else if (IS_VAR == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
+ zval_ptr_dtor_nogc(free_op2);
} else {
- zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (IS_VAR == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
+ }
}
- } while (0);
- FREE_OP(free_op_data1);
- zval_ptr_dtor_nogc(free_op2);
+ if (Z_TYPE(generator->key) == IS_LONG
+ && Z_LVAL(generator->key) > generator->largest_used_integer_key
+ ) {
+ generator->largest_used_integer_key = Z_LVAL(generator->key);
+ }
+ } else {
+ /* If no key was specified we use auto-increment keys */
+ generator->largest_used_integer_key++;
+ ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
+ }
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ if (RETURN_VALUE_USED(opline)) {
+ /* If the return value of yield is used set the send
+ * target and initialize it to NULL */
+ generator->send_target = EX_VAR(opline->result.var);
+ ZVAL_NULL(generator->send_target);
+ } else {
+ generator->send_target = NULL;
+ }
+
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
+
+ ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op_data1;
zval *var_ptr;
zval *value, *container, *dim;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
assign_dim_op_array:
SEPARATE_ARRAY(container);
assign_dim_op_new_array:
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ dim = NULL;
+ if (IS_UNUSED == IS_UNUSED) {
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
if (UNEXPECTED(!var_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zend_cannot_add_element();
goto assign_dim_op_ret_null;
}
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (IS_UNUSED == IS_CONST) {
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
} else {
var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
@@ -45820,10 +46260,9 @@ assign_dim_op_new_array:
goto assign_dim_op_ret_null;
}
ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
}
- value = get_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_data1);
binary_op(var_ptr, var_ptr, value);
@@ -45839,1537 +46278,468 @@ assign_dim_op_new_array:
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
assign_dim_op_convert_to_array:
- ZVAL_NEW_ARR(container);
- zend_hash_init(Z_ARRVAL_P(container), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(container, zend_new_array(8));
goto assign_dim_op_new_array;
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- value = get_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_data1);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
} else {
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_use_new_element_for_string();
} else {
zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
- if (EXPECTED(EG(exception) == NULL)) {
- zend_wrong_string_offset(EXECUTE_DATA_C);
- }
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
UNDEF_RESULT();
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
goto assign_dim_op_convert_to_array;
} else {
if (UNEXPECTED(IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
assign_dim_op_ret_null:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
}
- value = get_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_data1);
}
}
- zval_ptr_dtor_nogc(free_op2);
FREE_OP(free_op_data1);
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *var_ptr;
- zval *value;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- var_ptr = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- } else {
- ZVAL_DEREF(var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
- }
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-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));
-#else
-# if 0 || IS_CV != IS_UNUSED
- USE_OPLINE
-
- if (EXPECTED(1)) {
- 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));
- }
-# 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_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+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_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_UNUSED == IS_UNUSED
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_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_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# 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_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));
-#else
-# if 0 || IS_CV != IS_UNUSED
- USE_OPLINE
-
- 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));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
# endif
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_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));
+ 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_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_POW_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_POW_SPEC_CV_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ 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_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *object;
- zval *property;
- zval *zptr;
+
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ varname = EX_VAR(opline->op1.var);
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ 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)) {
+ GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- break;
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ retval = zend_hash_find_ex(target_symbol_table, name, IS_CV == IS_CONST);
+ if (retval == NULL) {
+ if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
+fetch_this:
+ zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-
- /* here we are sure we are dealing with an object */
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ if (type == BP_VAR_W) {
+ retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
+ } else {
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
+ retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
- } else {
- ZVAL_DEREF(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- }
+ retval = &EG(uninitialized_zval);
}
- } else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
}
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object;
- zval *property;
- zval *zptr;
-
- SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
-
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- ZVAL_DEREF(object);
- if (UNEXPECTED(!make_real_object(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
- break;
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
+ retval = Z_INDIRECT_P(retval);
+ if (Z_TYPE_P(retval) == IS_UNDEF) {
+ if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
+ goto fetch_this;
}
- }
-
- /* here we are sure we are dealing with an object */
-
- if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
- && 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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
- if (UNEXPECTED(Z_ISERROR_P(zptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (type == BP_VAR_W) {
+ ZVAL_NULL(retval);
+ } else if (type == BP_VAR_IS) {
+ retval = &EG(uninitialized_zval);
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
+ if (type == BP_VAR_RW) {
+ ZVAL_NULL(retval);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
- zval_opt_copy_ctor(zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ retval = &EG(uninitialized_zval);
}
}
- } else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
}
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
+ if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container, *dim, *value, *result;
+ }
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
if (IS_CV != IS_CONST) {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
- } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_array;
- } else {
- goto fetch_dim_r_slow;
- }
- } else {
-fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
- }
- } else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
+ zend_tmp_string_release(tmp_name);
}
- zval_ptr_dtor_nogc(free_op2);
+ ZEND_ASSERT(retval != NULL);
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op2);
-
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "Cannot use [] for reading");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
-
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
-
- zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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 *container;
- zend_free_op free_op2;
- zval *offset;
+ zval *varname;
+ zval *retval;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- 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));
- }
+ 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);
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
- if (IS_CV == IS_CONST ||
- (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_r_no_object;
+ retval = NULL;
+ break;
+ }
+ if (IS_CV != IS_CONST) {
+ CACHE_PTR(opline->extended_value, ce);
+ }
+ }
}
} else {
- goto fetch_obj_r_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_UNUSED == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ 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;
}
}
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
- zend_string *property_name;
-fetch_obj_r_no_object:
- property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- ZVAL_NULL(EX_VAR(opline->result.var));
+ 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 {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ 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);
}
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
+ retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
+ if (IS_CV == IS_CONST && EXPECTED(retval)) {
+ CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval);
+ }
- SAVE_OPLINE();
+ } while (0);
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- 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));
+ if (UNEXPECTED(retval == NULL)) {
+ if (EG(exception)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ } else {
+ ZEND_ASSERT(type == BP_VAR_IS);
+ retval = &EG(uninitialized_zval);
+ }
}
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
}
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
-
- 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);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- zval *container;
- zend_free_op free_op2;
- zval *offset;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
-
- 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));
- }
-
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if (IS_CV == IS_CONST ||
- (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
- }
- } else {
- goto fetch_obj_is_no_object;
- }
- }
-
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- }
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-fetch_obj_is_no_object:
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
-
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *container;
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- /* Behave like FETCH_OBJ_W */
- zend_free_op free_op1, free_op2;
- zval *property;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- 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));
- }
- if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
- zend_throw_error(NULL, "Cannot use temporary expression in write context");
- zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *property;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
-
- 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);
-
- zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
- zval_ptr_dtor_nogc(free_op2);
- if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
- EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ int fetch_type =
+ (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
+ BP_VAR_W : BP_VAR_R;
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- value = EX_CONSTANT((opline+1)->op1);
-
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_CONST);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_CONST == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_CONST != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_CONST == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_CONST == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
-
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
-exit_assign_obj:
- zval_ptr_dtor_nogc(free_op2);
-
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2, free_op_data;
- zval *object, *property, *value, tmp;
+ zend_free_op free_op1;
+ zval *container;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_TMP_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_TMP_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_TMP_VAR != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_TMP_VAR == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_TMP_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_W(container, NULL, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC);
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
-
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- zval_ptr_dtor_nogc(free_op_data);
-exit_assign_obj:
- zval_ptr_dtor_nogc(free_op2);
-
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2, free_op_data;
- zval *object, *property, *value, tmp;
+ zend_free_op free_op1;
+ zval *container;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
- } while (0);
- }
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_RW(container, NULL, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_VAR);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_VAR == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_VAR != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_VAR == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_VAR == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
- }
-
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- ZVAL_DEREF(value);
- }
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- zval_ptr_dtor_nogc(free_op_data);
-exit_assign_obj:
- zval_ptr_dtor_nogc(free_op2);
-
- /* assign_obj has two opcodes! */
- ZEND_VM_NEXT_OPCODE_EX(1, 2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op2;
- zval *object, *property, *value, tmp;
-
- SAVE_OPLINE();
- object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
- 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)) {
- do {
- if (Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
- (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zend_object *obj;
-
- zval_ptr_dtor(object);
- object_init(object);
- Z_ADDREF_P(object);
- obj = Z_OBJ_P(object);
- zend_error(E_WARNING, "Creating default object from empty value");
- if (GC_REFCOUNT(obj) == 1) {
- /* the enclosing container was deleted, obj is unreferenced */
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- OBJ_RELEASE(obj);
- goto exit_assign_obj;
- }
- Z_DELREF_P(object);
- } else {
- if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- goto exit_assign_obj;
- }
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*));
- zend_object *zobj = Z_OBJ_P(object);
- zval *property_val;
-
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- property_val = OBJ_PROP(zobj, prop_offset);
- if (Z_TYPE_P(property_val) != IS_UNDEF) {
-fast_assign_obj:
- value = zend_assign_to_variable(property_val, value, IS_CV);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- } else {
- if (EXPECTED(zobj->properties != NULL)) {
- if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
- if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
- GC_REFCOUNT(zobj->properties)--;
- }
- zobj->properties = zend_array_dup(zobj->properties);
- }
- property_val = zend_hash_find(zobj->properties, Z_STR_P(property));
- if (property_val) {
- goto fast_assign_obj;
- }
- }
-
- if (!zobj->ce->__set) {
-
- if (EXPECTED(zobj->properties == NULL)) {
- rebuild_object_properties(zobj);
- }
- if (IS_CV == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
- Z_ADDREF_P(value);
- }
- } else if (IS_CV != IS_TMP_VAR) {
- if (Z_ISREF_P(value)) {
- if (IS_CV == IS_VAR) {
- zend_reference *ref = Z_REF_P(value);
- if (--GC_REFCOUNT(ref) == 0) {
- ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
- efree_size(ref, sizeof(zend_reference));
- value = &tmp;
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else {
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- } else if (IS_CV == IS_CV && Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
- }
- }
- zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- goto exit_assign_obj;
- }
- }
- }
-
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_string *property_name = zval_get_string(property);
- zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ 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_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ if (IS_UNUSED == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-
- goto exit_assign_obj;
- }
-
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- ZVAL_DEREF(value);
+ ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-
- Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
-
-exit_assign_obj:
- 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_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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;
- zend_free_op free_op2;
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if (IS_UNUSED == IS_UNUSED) {
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ dim = NULL;
+ if (IS_UNUSED == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -47377,9 +46747,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
goto assign_dim_error;
}
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- value = EX_CONSTANT((opline+1)->op1);
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -47391,37 +46761,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
-
- zend_assign_to_object_dim(object_ptr, dim, value);
+ dim = NULL;
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- value = EX_CONSTANT((opline+1)->op1);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ dim = NULL;
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -47429,39 +46797,59 @@ assign_dim_error:
}
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED != IS_UNUSED) {
+
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
- zend_free_op free_op2, free_op_data;
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if (IS_UNUSED == IS_UNUSED) {
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ dim = NULL;
+ if (IS_UNUSED == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -47469,9 +46857,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _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);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -47483,38 +46871,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -47522,39 +46908,59 @@ assign_dim_error:
}
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED != IS_UNUSED) {
+
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
- zend_free_op free_op2, free_op_data;
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if (IS_UNUSED == IS_UNUSED) {
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ dim = NULL;
+ if (IS_UNUSED == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -47562,9 +46968,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -47576,38 +46982,36 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op_data);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
assign_dim_error:
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -47615,39 +47019,59 @@ assign_dim_error:
}
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED != IS_UNUSED) {
+
}
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object_ptr;
- zend_free_op free_op2;
+ zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
SEPARATE_ARRAY(object_ptr);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
+ if (IS_UNUSED == IS_UNUSED) {
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
if (UNEXPECTED(variable_ptr == NULL)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+
+ zend_cannot_add_element();
goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ dim = NULL;
+ if (IS_UNUSED == IS_CONST) {
variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
@@ -47655,9 +47079,9 @@ try_assign_dim_array:
if (UNEXPECTED(variable_ptr == NULL)) {
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 = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -47669,37 +47093,35 @@ try_assign_dim_array:
}
}
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_object_dim(object_ptr, dim, value);
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_throw_error(NULL, "[] operator not supported for strings");
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_use_new_element_for_string();
UNDEF_RESULT();
HANDLE_EXCEPTION();
} else {
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL) EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_NEW_ARR(object_ptr);
- zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0);
+ ZVAL_ARR(object_ptr, zend_new_array(8));
goto try_assign_dim_array;
} else {
if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
- zend_error(E_WARNING, "Cannot use a scalar value as an array");
+ zend_use_scalar_as_array();
}
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ dim = NULL;
assign_dim_error:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -47707,318 +47129,65 @@ assign_dim_error:
}
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_UNUSED != IS_UNUSED) {
+
}
/* assign_dim has two opcodes! */
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
- zend_free_op free_op2;
- zval *op1, *op2;
- zend_string *op1_str, *op2_str, *str;
-
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
-
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
-
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
-
- break;
- }
- }
- if (IS_CV != IS_CONST && IS_CV != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- }
-
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CV == IS_CONST) {
- op1_str = Z_STR_P(op1);
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- op1_str = zend_string_copy(Z_STR_P(op1));
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- op1_str = _zval_get_string_func(op1);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- op2_str = Z_STR_P(op2);
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- op2_str = zend_string_copy(Z_STR_P(op2));
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- op2_str = _zval_get_string_func(op2);
- }
- do {
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op2_str);
- }
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if (IS_CV == IS_CONST) {
- zend_string_addref(op1_str);
- }
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
- break;
- }
- }
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if (IS_CV != IS_CONST) {
- zend_string_release(op1_str);
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op2_str);
- }
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *function_name;
- zend_free_op free_op2;
- zval *object;
- zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *obj;
- zend_execute_data *call;
- uint32_t call_info;
SAVE_OPLINE();
-
- object = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
-
- if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
-
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Method name must be a string");
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- } while (0);
- }
-
- if (IS_CV != IS_UNUSED) {
- do {
- if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- }
- } while (0);
- }
-
- obj = Z_OBJ_P(object);
- called_scope = obj->ce;
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ if (IS_CV == IS_UNUSED) {
+ zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
} else {
- zend_object *orig_obj = obj;
+/* prevents "undefined variable opline" errors */
+#if 0 || (IS_CV != IS_UNUSED)
+ zval *retval_ref, *retval_ptr;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
- zval_ptr_dtor_nogc(free_op2);
+ zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
- HANDLE_EXCEPTION();
- }
+ retval_ref = retval_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- /* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ if (IS_CV == IS_CONST) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval_ptr);
+ retval_ref = retval_ptr = EX_VAR(opline->result.var);
+ } else if (IS_CV == IS_VAR) {
+ if (UNEXPECTED(Z_TYPE_P(retval_ptr) == IS_INDIRECT)) {
+ retval_ptr = Z_INDIRECT_P(retval_ptr);
}
- zval_ptr_dtor_nogc(free_op2);
-
- HANDLE_EXCEPTION();
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
- EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ ZVAL_DEREF(retval_ptr);
+ } else if (IS_CV == IS_CV) {
+ ZVAL_DEREF(retval_ptr);
}
- }
- call_info = ZEND_CALL_NESTED_FUNCTION;
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- obj = NULL;
- } else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
- /* CV may be changed indirectly (e.g. when it's a reference) */
- call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
- zval_ptr_dtor_nogc(free_op2);
-
- if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
-
- call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
- call->prev_execute_data = EX(call);
- EX(call) = call;
-
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
- zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(!ZEND_TYPE_IS_CLASS(ret_info->type)
+ && ZEND_TYPE_CODE(ret_info->type) != IS_CALLABLE
+ && ZEND_TYPE_CODE(ret_info->type) != IS_ITERABLE
+ && !ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(ret_info->type), Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- break;
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
- } else {
- break;
+ retval_ptr = retval_ref;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+#endif
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -48028,28 +47197,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPV
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_MAKE_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_TMP_VAR) {
/* pass */
} else if (IS_CV == IS_CONST) {
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else if (IS_CV == IS_CV) {
ZVAL_DEREF(expr_ptr);
- if (Z_REFCOUNTED_P(expr_ptr)) {
- Z_ADDREF_P(expr_ptr);
- }
+ Z_TRY_ADDREF_P(expr_ptr);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
expr_ptr = Z_REFVAL_P(expr_ptr);
- if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
ZVAL_COPY_VALUE(&new_expr, expr_ptr);
expr_ptr = &new_expr;
efree_size(ref, sizeof(zend_reference));
@@ -48060,16 +47228,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPV
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op2;
- zval *offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (IS_UNUSED != IS_UNUSED) {
+
+ zval *offset = NULL;
zend_string *str;
zend_ulong hval;
add_again:
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (IS_UNUSED != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(str, hval)) {
goto num_index;
}
@@ -48080,7 +47248,7 @@ str_index:
hval = Z_LVAL_P(offset);
num_index:
zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
offset = Z_REFVAL_P(offset);
goto add_again;
} else if (Z_TYPE_P(offset) == IS_NULL) {
@@ -48095,25 +47263,25 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ } else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
}
- zval_ptr_dtor_nogc(free_op2);
+
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
- zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
- zval_ptr_dtor(expr_ptr);
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
}
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zval *array;
uint32_t size;
@@ -48122,920 +47290,634 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HAND
array = EX_VAR(opline->result.var);
if (IS_CV != IS_UNUSED) {
size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
- } else {
- size = 0;
- }
- ZVAL_NEW_ARR(array);
- zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0);
-
- if (IS_CV != IS_UNUSED) {
+ ZVAL_ARR(array, zend_new_array(size));
/* Explicitly initialize array as not-packed if flag is set */
if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
- zend_hash_real_init(Z_ARRVAL_P(array), 0);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
}
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
}
-
- ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container;
- zval *offset;
- zend_ulong hval;
- zend_string *key;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval *var = EX_VAR(opline->op1.var);
- do {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
-unset_dim_array:
- SEPARATE_ARRAY(container);
- ht = Z_ARRVAL_P(container);
-offset_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- key = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(key, hval)) {
- goto num_index_dim;
- }
- }
-str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index_dim:
- zend_hash_index_del(ht, hval);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- key = ZSTR_EMPTY_ALLOC();
- goto str_index_dim;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_dim;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_dim;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- key = ZSTR_EMPTY_ALLOC();
- goto str_index_dim;
- } else {
- zend_error(E_WARNING, "Illegal offset type in unset");
- }
- break;
- } else if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto unset_dim_array;
- }
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_throw_error(NULL, "Cannot use object as array");
- } else {
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
- }
- } else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_throw_error(NULL, "Cannot unset string offsets");
+ ZVAL_UNDEF(var);
+ SAVE_OPLINE();
+ if (!GC_DELREF(garbage)) {
+ rc_dtor_func(garbage);
+ } else {
+ gc_check_possible_root(garbage);
}
- } while (0);
-
- zval_ptr_dtor_nogc(free_op2);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ ZVAL_UNDEF(var);
+ }
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container;
- zval *offset;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
+
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
- 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));
- }
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- if (Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (Z_TYPE_P(container) != IS_OBJECT) {
- break;
- }
- } else {
- break;
- }
- }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
- } else {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
- } while (0);
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
- zval_ptr_dtor_nogc(free_op2);
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ zend_hash_del_ind(target_symbol_table, name);
+
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container;
- int result;
- zend_ulong hval;
- zval *offset;
+ zval *varname;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
+
SAVE_OPLINE();
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
- zval *value;
- zend_string *str;
+ if (IS_UNUSED == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
-isset_dim_obj_array:
- ht = Z_ARRVAL_P(container);
-isset_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index_prop;
- }
+ HANDLE_EXCEPTION();
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index_prop:
- value = zend_hash_index_find(ht, hval);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
- offset = Z_REFVAL_P(offset);
- goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ /*CACHE_PTR(opline->extended_value, ce);*/
}
+ } else if (IS_UNUSED == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
- if (opline->extended_value & ZEND_ISSET) {
- /* > IS_NULL means not IS_UNDEF and not IS_NULL */
- result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = (value == NULL || !i_zend_is_true(value));
+ HANDLE_EXCEPTION();
}
- goto isset_dim_obj_exit;
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto isset_dim_obj_array;
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+
+ 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)) {
+ varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
}
+ name = zval_get_tmp_string(varname, &tmp_name);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ zend_std_unset_static_property(ce, name);
+
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
}
- if ((IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if ((IS_TMP_VAR|IS_VAR) & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value;
+ int result;
+
+ value = EX_VAR(opline->op1.var);
+ if (!(0)) {
+ result =
+ Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ SAVE_OPLINE();
+ result = !i_zend_is_true(value);
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
}
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+}
-isset_dim_obj_exit:
- zval_ptr_dtor_nogc(free_op2);
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value;
+ int result;
- ZEND_VM_SMART_BRANCH(result, 1);
+ value = EX_VAR(opline->op1.var);
+ if (!(1)) {
+ result =
+ Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ SAVE_OPLINE();
+ result = !i_zend_is_true(value);
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container;
+ zval *value;
int result;
- zval *offset;
- SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
+ zval *varname;
+ zend_string *name, *tmp_name;
+ HashTable *target_symbol_table;
- 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));
+ SAVE_OPLINE();
+ 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);
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
+ value = zend_hash_find_ex(target_symbol_table, name, IS_CV == IS_CONST);
- if (IS_CV == IS_CONST ||
- (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto isset_no_object;
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
+
+ if (!value) {
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ } else {
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ if (Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
}
+ result = Z_TYPE_P(value) > IS_NULL;
} else {
- goto isset_no_object;
+ result = !i_zend_is_true(value);
}
}
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
-isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
- } else {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
- }
-
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2;
- zval *container, *dim, *value;
- zend_long offset;
+ zval *value;
+ int result;
- container = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
+ 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)), 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);
+ }
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
+ } else {
+ if (IS_UNUSED == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
} else {
- ZEND_VM_NEXT_OPCODE();
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
+ if (IS_CV == 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;
}
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
+ }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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);
}
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
- SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
+ value = zend_std_get_static_property(ce, name, 1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (IS_CV == IS_CONST && value) {
+ CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
+ if (IS_CV != IS_CONST) {
+ zend_tmp_string_release(tmp_name);
+ }
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
- ZEND_VM_NEXT_OPCODE();
+is_static_prop_return:
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = value && 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);
}
- SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC));
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *val;
- zend_free_op free_op1;
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- } else {
- SAVE_OPLINE();
- ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val));
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *z;
+ zval *expr;
+ zend_bool result;
SAVE_OPLINE();
- z = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ expr = EX_VAR(opline->op1.var);
- if (Z_TYPE_P(z) == IS_STRING) {
- zend_string *str = Z_STR_P(z);
+try_instanceof:
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ zend_class_entry *ce;
- if (ZSTR_LEN(str) != 0) {
- zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
+ if (IS_UNUSED == IS_CONST) {
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (EXPECTED(ce)) {
+ CACHE_PTR(opline->extended_value, 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));
}
+ result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
+ expr = Z_REFVAL_P(expr);
+ goto try_instanceof;
} else {
- zend_string *str = _zval_get_string_func(z);
-
- if (ZSTR_LEN(str) != 0) {
- zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(z, BP_VAR_R);
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(expr, BP_VAR_R);
}
- zend_string_release(str);
+ result = 0;
}
- zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_NEXT_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- }
- }
+ zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline++;
- } else {
- opline = OP_JMP_ADDR(opline, opline->op2);
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_JMP(opline);
-}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
+ /* Destroy the previously yielded value */
+ zval_ptr_dtor(&generator->value);
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ /* Destroy the previously yielded key */
+ zval_ptr_dtor(&generator->key);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ /* Set the new yielded value */
+ if (IS_CV != IS_UNUSED) {
- SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline = OP_JMP_ADDR(opline, opline->op2);
- } else {
- opline++;
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_JMP(opline);
-}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ /* Constants and temporary variables aren't yieldable by reference,
+ * but we still allow them with a notice. */
+ if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
+ zval *value;
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
- if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- }
- }
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ }
+ } else {
+ zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- SAVE_OPLINE();
- if (i_zend_is_true(val)) {
- opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
- } else {
- opline = OP_JMP_ADDR(opline, opline->op2);
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_JMP(opline);
-}
+ /* If a function call result is yielded and the function did
+ * not return by reference we throw a notice. */
+ if (IS_CV == IS_VAR &&
+ (value_ptr == &EG(uninitialized_zval) ||
+ (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !Z_ISREF_P(value_ptr)))) {
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
+ } else {
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- int ret;
+ }
+ } else {
+ zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ /* Consts, temporary variables and references need copying */
+ if (IS_CV == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ } else if (IS_CV == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- } else {
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
+ } else {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ }
+ }
}
- }
-
- SAVE_OPLINE();
- ret = i_zend_is_true(val);
- zval_ptr_dtor_nogc(free_op1);
- if (ret) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- opline++;
} else {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- opline = OP_JMP_ADDR(opline, opline->op2);
+ /* If no value was specified yield null */
+ ZVAL_NULL(&generator->value);
}
- ZEND_VM_JMP(opline);
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *val;
- int ret;
+ /* Set the new yielded key */
+ if (IS_UNUSED != IS_UNUSED) {
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zval *key = NULL;
+
+ /* Consts, temporary variables and references need copying */
+ if (IS_UNUSED == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
+ Z_ADDREF(generator->key);
+ }
+ } else if (IS_UNUSED == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- ZEND_VM_CONTINUE();
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- ZEND_VM_NEXT_OPCODE();
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (IS_UNUSED == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
+ }
}
+
+ if (Z_TYPE(generator->key) == IS_LONG
+ && Z_LVAL(generator->key) > generator->largest_used_integer_key
+ ) {
+ generator->largest_used_integer_key = Z_LVAL(generator->key);
+ }
+ } else {
+ /* If no key was specified we use auto-increment keys */
+ generator->largest_used_integer_key++;
+ ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
}
- SAVE_OPLINE();
- ret = i_zend_is_true(val);
- zval_ptr_dtor_nogc(free_op1);
- if (ret) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- opline = OP_JMP_ADDR(opline, opline->op2);
+ if (RETURN_VALUE_USED(opline)) {
+ /* If the return value of yield is used set the send
+ * target and initialize it to NULL */
+ generator->send_target = EX_VAR(opline->result.var);
+ ZVAL_NULL(generator->send_target);
} else {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- opline++;
+ generator->send_target = NULL;
}
- ZEND_VM_JMP(opline);
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
SAVE_OPLINE();
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zval *var;
- USE_OPLINE
-
- SAVE_OPLINE();
- var = EX_VAR(opline->op1.var);
- if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
- zend_hash_iterator_del(Z_FE_ITER_P(var));
- }
- zval_ptr_dtor_nogc(var);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_RETURN();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *value, *arg;
- zend_free_op free_op1;
+ zval *op1 = EX_VAR(opline->op1.var);
- value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- arg = ZEND_CALL_VAR(EX(call), opline->result.var);
- ZVAL_COPY_VALUE(arg, value);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(arg))) {
- Z_ADDREF_P(arg);
- }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *val;
- zend_free_op free_op1;
+ zval *op1 = EX_VAR(opline->op1.var);
- val = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (Z_TYPE_INFO_P(val) == IS_TRUE) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
- SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ if (IS_CV == IS_CV) {
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_NEW_EMPTY_REF(op1);
+ Z_SET_REFCOUNT_P(op1, 2);
+ ZVAL_NULL(Z_REFVAL_P(op1));
+ ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
+ } else {
+ if (Z_ISREF_P(op1)) {
+ Z_ADDREF_P(op1);
+ } else {
+ ZVAL_MAKE_REF_EX(op1, 2);
+ }
+ ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_INDIRECT)) {
+ op1 = Z_INDIRECT_P(op1);
+ if (EXPECTED(!Z_ISREF_P(op1))) {
+ ZVAL_MAKE_REF_EX(op1, 2);
+ } else {
+ GC_ADDREF(Z_REF_P(op1));
}
+ ZVAL_REF(EX_VAR(opline->result.var), Z_REF_P(op1));
} else {
- SAVE_OPLINE();
- ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val));
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), op1);
}
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *obj;
- zend_class_entry *ce, *scope;
- zend_function *clone;
- zend_object_clone_obj_t clone_call;
- SAVE_OPLINE();
- obj = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
+ zval *op1;
+ zend_long count;
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
do {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
- obj = Z_REFVAL_P(obj);
- if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
- break;
- }
- }
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
+ if (Z_TYPE_P(op1) == IS_ARRAY) {
+ count = zend_array_count(Z_ARRVAL_P(op1));
+ break;
+ } else if (Z_TYPE_P(op1) == IS_OBJECT) {
+ /* first, we check if the handler is defined */
+ if (Z_OBJ_HT_P(op1)->count_elements) {
+ if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
+ break;
}
}
- zend_throw_error(NULL, "__clone method called on non-object");
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- } while (0);
- ce = Z_OBJCE_P(obj);
- clone = ce->clone;
- clone_call = Z_OBJ_HT_P(obj)->clone_obj;
- if (UNEXPECTED(clone_call == NULL)) {
- zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
+ /* if not and the object implements Countable we call its count() method */
+ if (instanceof_function(Z_OBJCE_P(op1), zend_ce_countable)) {
+ zval retval;
- if (clone) {
- if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- /* Ensure that if we're calling a private function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (!zend_check_private(clone, scope, clone->common.function_name)) {
- zend_throw_error(NULL, "Call to private %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
- /* Ensure that if we're calling a protected function, we're allowed to do so.
- */
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
- zend_throw_error(NULL, "Call to protected %s::__clone() from context '%s'", ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ zend_call_method_with_0_params(op1, NULL, NULL, "count", &retval);
+ count = zval_get_long(&retval);
+ zval_ptr_dtor(&retval);
+ break;
}
+
+ /* If There's no handler and it doesn't implement Countable then add a warning */
+ count = 1;
+ } else if (Z_TYPE_P(op1) == IS_NULL) {
+ count = 0;
+ } else {
+ count = 1;
}
- }
+ zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
+ } while (0);
- ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+ ZVAL_LONG(EX_VAR(opline->result.var), count);
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_op_array *new_op_array;
- zend_free_op free_op1;
- zval *inc_filename;
-
- SAVE_OPLINE();
- inc_filename = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
- zval_ptr_dtor_nogc(free_op1);
- if (UNEXPECTED(EG(exception) != NULL)) {
- if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
- destroy_op_array(new_op_array);
- efree_size(new_op_array, sizeof(zend_op_array));
- }
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_TRUE(EX_VAR(opline->result.var));
- }
- } else if (EXPECTED(new_op_array != NULL)) {
- zval *return_value = NULL;
- zend_execute_data *call;
-
- if (RETURN_VALUE_USED(opline)) {
- return_value = EX_VAR(opline->result.var);
- ZVAL_NULL(return_value);
- }
-
- new_op_array->scope = EX(func)->op_array.scope;
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
- (zend_function*)new_op_array, 0,
- Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
- Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
-
- if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
- call->symbol_table = EX(symbol_table);
+ if (IS_CV == IS_UNUSED) {
+ if (UNEXPECTED(!EX(func)->common.scope)) {
+ SAVE_OPLINE();
+ zend_error(E_WARNING, "get_class() called without object from outside a class");
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- call->symbol_table = zend_rebuild_symbol_table();
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+ ZEND_VM_NEXT_OPCODE();
}
+ } else {
- call->prev_execute_data = execute_data;
- i_init_code_execute_data(call, new_op_array, return_value);
- if (EXPECTED(zend_execute_ex == execute_ex)) {
- ZEND_VM_ENTER();
+ zval *op1;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
} else {
- ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
- zend_execute_ex(call);
- zend_vm_stack_free_call_frame(call);
+ zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
}
- destroy_op_array(new_op_array);
- efree_size(new_op_array, sizeof(zend_op_array));
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else if (RETURN_VALUE_USED(opline)) {
- ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
- ZEND_VM_SET_OPCODE(opline + 1);
- ZEND_VM_CONTINUE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- zend_free_op free_op1;
- zval *ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- do {
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- } else {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(ptr)) {
- ptr = Z_REFVAL_P(ptr);
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- break;
- }
- }
- zend_print_variable(ptr);
- }
- } while (0);
- zval_ptr_dtor_nogc(free_op1);
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- zend_free_op free_op1;
+ zval *op1;
+ zend_string *type;
- value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE();
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ type = zend_zval_get_type(op1);
+ if (EXPECTED(type)) {
+ ZVAL_INTERNED_STR(EX_VAR(opline->result.var), type);
} else {
- zend_bool strict;
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
- value = Z_REFVAL_P(value);
- if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
- }
- strict = EX_USES_STRICT_TYPES();
- do {
- if (EXPECTED(!strict)) {
- zend_string *str;
- zval tmp;
-
- ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
- ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
- zval_ptr_dtor(&tmp);
- break;
- }
- zval_ptr_dtor(&tmp);
- }
- zend_internal_type_error(strict, "strlen() expects parameter 1 to be string, %s given", zend_get_type_by_const(Z_TYPE_P(value)));
- ZVAL_NULL(EX_VAR(opline->result.var));
- } while (0);
+ ZVAL_STRING(EX_VAR(opline->result.var), "unknown type");
}
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -49059,26 +47941,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
@@ -49102,26 +47984,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
sub_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -49148,49 +48030,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mul_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
fast_div_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
ZVAL_LONG(result, 0);
@@ -49202,26 +48081,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
mod_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -49230,26 +48109,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_left_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
@@ -49258,105 +48137,139 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(Z
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
shift_right_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
pow_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- zval_ptr_dtor_nogc(free_op1);
- } while (0);
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+
+ }
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
concat_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
+ zval *op1, *op2;
+ int result;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ result = fast_is_identical_function(op1, op2);
+
+
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ int result;
+
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ result = fast_is_not_identical_function(op1, op2);
+
+
+ ZEND_VM_SMART_BRANCH(result, 1);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -49378,18 +48291,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
- zval_ptr_dtor_nogc(free_op1);
+ result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+
} else {
break;
@@ -49403,28 +48306,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
} while (0);
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -49446,18 +48349,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST
}
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
- }
- zval_ptr_dtor_nogc(free_op1);
+ result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+
} else {
break;
@@ -49471,28 +48364,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST
} while (0);
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -49521,28 +48414,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_H
} while (0);
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
do {
int result;
@@ -49571,43 +48464,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVA
} while (0);
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
result = EX_VAR(opline->result.var);
compare_function(result, op1, op2);
ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
compare_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
@@ -49615,26 +48508,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLE
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
@@ -49642,26 +48535,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDL
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
@@ -49669,2516 +48562,907 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDL
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- 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)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- retval = zend_fetch_static_property_address(varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST, type EXECUTE_DATA_CC);
-
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
- zval_ptr_dtor_nogc(free_op1);
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container, *dim, *value, *result;
+ zval *op1, *op2;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = EX_CONSTANT(opline->op2);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CONST, BP_VAR_R EXECUTE_DATA_CC);
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
- } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_array;
- } else {
- goto fetch_dim_r_slow;
- }
- } else {
-fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
- }
- } else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CONST EXECUTE_DATA_CC);
- }
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
+ op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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_op1;
- zval *container;
-
- zval *offset;
+ zend_free_op free_op_data1;
+ zval *object;
+ zval *property;
+ zval *value;
+ zval *zptr;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = EX_CONSTANT(opline->op2);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
- }
- } else {
- goto fetch_obj_is_no_object;
- }
- }
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- /* here we are sure we are dealing with an object */
do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
-
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_op_object;
}
}
- }
-
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-fetch_obj_is_no_object:
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
-
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
}
}
- } while (0);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2) EXECUTE_DATA_CC);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- zend_string *op1_str, *op2_str, *str;
-
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CONST == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
-
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
+ /* here we are sure we are dealing with an object */
+assign_op_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ if (UNEXPECTED(Z_ISERROR_P(zptr))) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- }
- zval_ptr_dtor_nogc(free_op1);
- } while (0);
-
- ZEND_VM_NEXT_OPCODE();
- }
+ ZVAL_DEREF(zptr);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- op1_str = Z_STR_P(op1);
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- op1_str = zend_string_copy(Z_STR_P(op1));
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- op1_str = _zval_get_string_func(op1);
- }
- if (IS_CONST == IS_CONST) {
- op2_str = Z_STR_P(op2);
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- op2_str = zend_string_copy(Z_STR_P(op2));
- } else {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- op2_str = _zval_get_string_func(op2);
- }
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (IS_CONST == IS_CONST) {
- zend_string_addref(op2_str);
- }
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
- break;
- }
- }
- if (IS_CONST != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op1_str);
+ binary_op(zptr, zptr, value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
- break;
}
- }
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op1_str);
- }
- if (IS_CONST != IS_CONST) {
- zend_string_release(op2_str);
+ } 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);
}
} while (0);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ FREE_OP(free_op_data1);
+
+
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zval *function_name;
- zend_free_op free_op1;
- zval *object;
- zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *obj;
- zend_execute_data *call;
- uint32_t call_info;
+ zend_free_op free_op_data1;
+ zval *var_ptr;
+ zval *value, *container, *dim;
SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
- object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
- }
-
- function_name = EX_CONSTANT(opline->op2);
-
- if (IS_CONST != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+assign_dim_op_array:
+ SEPARATE_ARRAY(container);
+assign_dim_op_new_array:
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV == IS_UNUSED) {
+ var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
+ if (UNEXPECTED(!var_ptr)) {
+ zend_cannot_add_element();
+ goto assign_dim_op_ret_null;
}
- zend_throw_error(NULL, "Method name must be a string");
-
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- } while (0);
- }
-
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- do {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
-
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
+ } else {
+ if (IS_CV == IS_CONST) {
+ var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
+ } else {
+ var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- obj = Z_OBJ_P(object);
- called_scope = obj->ce;
+ if (UNEXPECTED(!var_ptr)) {
+ goto assign_dim_op_ret_null;
+ }
+ ZVAL_DEREF(var_ptr);
+ }
- if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
- } else {
- zend_object *orig_obj = obj;
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
+ binary_op(var_ptr, var_ptr, value);
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
-
- /* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ } else {
+ if (EXPECTED(Z_ISREF_P(container))) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto assign_dim_op_array;
}
-
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- if (IS_CONST == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
- EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ container = GET_OP1_UNDEF_CV(container, BP_VAR_RW);
+assign_dim_op_convert_to_array:
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
}
- }
-
- call_info = ZEND_CALL_NESTED_FUNCTION;
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- obj = NULL;
- } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
- /* CV may be changed indirectly (e.g. when it's a reference) */
- call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
-
- zval_ptr_dtor_nogc(free_op1);
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
- }
-
- call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
- call->prev_execute_data = EX(call);
- EX(call) = call;
-
- ZEND_VM_NEXT_OPCODE();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_CONSTANT(opline->op2);
- do {
- int result;
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
+ zend_binary_assign_op_obj_dim(container, dim, value, UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, binary_op EXECUTE_DATA_CC);
+ } else {
+ if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ if (IS_CV == IS_UNUSED) {
+ zend_use_new_element_for_string();
} else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
+ zend_check_string_offset(dim, BP_VAR_RW EXECUTE_DATA_CC);
+ zend_wrong_string_offset(EXECUTE_DATA_C);
}
-
+ UNDEF_RESULT();
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ goto assign_dim_op_convert_to_array;
} else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval tmp, *varname;
- zend_class_entry *ce;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ if (UNEXPECTED(IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
+ zend_use_scalar_as_array();
+ }
+assign_dim_op_ret_null:
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
}
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
}
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- zend_std_unset_static_property(ce, Z_STR_P(varname));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ FREE_OP(free_op_data1);
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
+
+ zval *var_ptr;
zval *value;
- int result;
- zend_free_op free_op1;
- zval tmp, *varname;
- zend_class_entry *ce;
SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_CONST == IS_CONST) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ var_ptr = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
+ ZVAL_DEREF(var_ptr);
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
+ binary_op(var_ptr, var_ptr, value);
- goto is_static_prop_return;
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
}
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
- }
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
-
-is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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));
+#else
+# if 0 || IS_CV != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- int result;
- zend_ulong hval;
- zval *offset;
+# endif
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = EX_CONSTANT(opline->op2);
-
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
- zval *value;
- zend_string *str;
-
-isset_dim_obj_array:
- ht = Z_ARRVAL_P(container);
-isset_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if (IS_CONST != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index_prop;
- }
- }
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index_prop:
- value = zend_hash_index_find(ht, hval);
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
- offset = Z_REFVAL_P(offset);
- goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- /* > IS_NULL means not IS_UNDEF and not IS_NULL */
- result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = (value == NULL || !i_zend_is_true(value));
- }
- goto isset_dim_obj_exit;
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto isset_dim_obj_array;
- }
- }
-
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (EXPECTED(1)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-
- if (((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if (IS_CONST & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
- } else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
+# endif
-isset_dim_obj_exit:
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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));
+#else
+# if 0 || IS_CV != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- int result;
- zval *offset;
+# endif
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- if ((IS_TMP_VAR|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));
- }
-
- offset = EX_CONSTANT(opline->op2);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto isset_no_object;
- }
- } else {
- goto isset_no_object;
- }
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
-isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
- } else {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ if (EXPECTED(1)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
+# endif
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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));
+#else
+# if 0 || IS_CV != IS_UNUSED
+# if 0
+ /* opline->extended_value checks are specialized, don't need opline */
USE_OPLINE
- zend_free_op free_op1;
- zval *expr;
- zend_bool result;
-
- SAVE_OPLINE();
- expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+# endif
-try_instanceof:
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
-
- if (IS_CONST == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), 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(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- goto try_instanceof;
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op, *jump_zv;
- HashTable *jumptable;
-
- op = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
-
- if (Z_TYPE_P(op) != IS_LONG) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_LONG) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
+ if (EXPECTED(0)) {
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
+# endif
- jump_zv = zend_hash_index_find(jumptable, Z_LVAL_P(op));
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+#endif
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op, *jump_zv;
- HashTable *jumptable;
-
- op = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- jumptable = Z_ARRVAL_P(EX_CONSTANT(opline->op2));
-
- if (Z_TYPE_P(op) != IS_STRING) {
- ZVAL_DEREF(op);
- if (Z_TYPE_P(op) != IS_STRING) {
- /* Wrong type, fall back to ZEND_CASE chain */
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- jump_zv = zend_hash_find(jumptable, Z_STR_P(op));
- if (jump_zv != NULL) {
- ZEND_VM_SET_RELATIVE_OPCODE(opline, Z_LVAL_P(jump_zv));
- ZEND_VM_CONTINUE();
- } else {
- /* default */
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container, *dim, *value;
- zend_long offset;
-
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = EX_CONSTANT(opline->op2);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
- }
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
- }
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
- SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(add_function 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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- retval = zend_fetch_static_property_address(varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR, type EXECUTE_DATA_CC);
-
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
-
- zval_ptr_dtor_nogc(free_op1);
-
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval tmp, *varname;
- zend_class_entry *ce;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- zend_std_unset_static_property(ce, Z_STR_P(varname));
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *value;
- int result;
- zend_free_op free_op1;
- zval tmp, *varname;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- if (IS_VAR == IS_CONST) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
- }
- } else {
- if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
- }
- }
-
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
- }
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
-
-is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr;
- zend_bool result;
-
- SAVE_OPLINE();
- expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
-try_instanceof:
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
-
- if (IS_VAR == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), 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(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- goto try_instanceof;
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(div_function 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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name;
- HashTable *target_symbol_table;
-
- SAVE_OPLINE();
- 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);
- zend_string_addref(name);
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- name = zval_get_string(varname);
- }
-
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- retval = zend_hash_find(target_symbol_table, name);
- if (retval == NULL) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- zval *result;
-
-fetch_this:
- result = EX_VAR(opline->result.var);
- switch (type) {
- case BP_VAR_R:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- zend_error(E_NOTICE,"Undefined variable: this");
- }
- break;
- case BP_VAR_IS:
- if (EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
- ZVAL_OBJ(result, Z_OBJ(EX(This)));
- Z_ADDREF_P(result);
- } else {
- ZVAL_NULL(result);
- }
- break;
- case BP_VAR_RW:
- case BP_VAR_W:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot re-assign $this");
- break;
- case BP_VAR_UNSET:
- ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot unset $this");
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(name);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- case BP_VAR_W:
- retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
- } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
- retval = Z_INDIRECT_P(retval);
- if (Z_TYPE_P(retval) == IS_UNDEF) {
- if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
- goto fetch_this;
- }
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_UNSET:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- zend_error(E_NOTICE,"Undefined variable: %s", ZSTR_VAL(name));
- /* break missing intentionally */
- case BP_VAR_W:
- ZVAL_NULL(retval);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- }
- }
-
- if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
- zval_ptr_dtor_nogc(free_op1);
- }
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(name);
- }
-
- ZEND_ASSERT(retval != NULL);
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
-
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- retval = zend_fetch_static_property_address(varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED, type EXECUTE_DATA_CC);
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- if (UNEXPECTED(retval == NULL)) {
- if (EG(exception)) {
- zval_ptr_dtor_nogc(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
- }
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- zval_ptr_dtor_nogc(free_op1);
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- } else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- } else {
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval tmp, *varname;
- HashTable *target_symbol_table;
- zend_free_op free_op1;
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- SAVE_OPLINE();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zval tmp, *varname;
- zend_class_entry *ce;
- zend_free_op free_op1;
- SAVE_OPLINE();
+ zval *object;
+ zval *property;
+ zval *zptr;
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ SAVE_OPLINE();
+ object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
- }
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto pre_incdec_object;
}
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
+ }
}
- } else if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+
+ /* here we are sure we are dealing with an object */
+pre_incdec_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ 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);
+ }
+ } 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);
+ }
}
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
+ } else {
+ zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- zend_std_unset_static_property(ce, Z_STR_P(varname));
+ } while (0);
+
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zval *value;
- int result;
- zend_free_op free_op1;
- zval tmp, *varname;
- HashTable *target_symbol_table;
-
- SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
- }
-
- target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
- value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
-
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
- zval *value;
- int result;
- zend_free_op free_op1;
- zval tmp, *varname;
- zend_class_entry *ce;
+
+ zval *object;
+ zval *property;
+ zval *zptr;
SAVE_OPLINE();
- varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- ZVAL_UNDEF(&tmp);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(varname));
- varname = &tmp;
+ object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- if (IS_UNUSED == IS_CONST) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto post_incdec_object;
+ }
}
-
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ break;
}
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
+
+ /* here we are sure we are dealing with an object */
+post_incdec_object:
+ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
+ && 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)) {
+ 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);
+ }
+ } else {
+ ZVAL_DEREF(zptr);
+ ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ if (inc) {
+ increment_function(zptr);
+ } else {
+ decrement_function(zptr);
+ }
}
- zval_ptr_dtor_nogc(free_op1);
- 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(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))) == ce)) {
-
- value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
- /* check if static properties were destoyed */
- if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- value = NULL;
- }
-
- goto is_static_prop_return;
+ zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
}
- }
-
- value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, value);
- }
+ } while (0);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
- zend_string_release(Z_STR(tmp));
- }
- zval_ptr_dtor_nogc(free_op1);
-is_static_prop_return:
- if (opline->extended_value & ZEND_ISSET) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = !value || !i_zend_is_true(value);
- }
-
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *expr;
- zend_bool result;
-
- SAVE_OPLINE();
- expr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
-try_instanceof:
- if (Z_TYPE_P(expr) == IS_OBJECT) {
- zend_class_entry *ce;
-
- if (IS_UNUSED == IS_CONST) {
- ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (EXPECTED(ce)) {
- CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), 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(free_op1);
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- result = ce && instanceof_function(Z_OBJCE_P(expr), ce);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
- expr = Z_REFVAL_P(expr);
- goto try_instanceof;
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
- }
- result = 0;
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- add_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ zval *container, *dim, *value, *result;
+
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV != IS_CONST) {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+fetch_dim_r_array:
+ value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CV, BP_VAR_R EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
+ ZVAL_COPY_DEREF(result, value);
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto fetch_dim_r_array;
+ } else {
+ goto fetch_dim_r_slow;
+ }
+ } else {
+fetch_dim_r_slow:
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
}
+ } else {
+ zend_fetch_dimension_address_read_R(container, dim, IS_CV OPLINE_CC EXECUTE_DATA_CC);
}
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- sub_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- zend_long overflow;
-
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ zval *container;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_W(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2;
+ zval *container;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- fast_div_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_RW(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
- /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
- ZVAL_LONG(result, 0);
- } else {
- ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
- }
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ zval *container;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mod_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_read_IS(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ 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_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ if (IS_CV == IS_UNUSED) {
+ ZEND_VM_TAIL_CALL(zend_use_undef_in_read_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ zval *container;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+ container = EX_VAR(opline->op1.var);
+ zend_fetch_dimension_address_UNSET(container, EX_VAR(opline->op2.var), IS_CV OPLINE_CC EXECUTE_DATA_CC);
+ if (IS_CV == IS_VAR) {
+ zval *result = EX_VAR(opline->result.var);
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- pow_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
+ zval *container;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ zval *offset;
+ void **cache_slot = NULL;
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ 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));
+ }
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
+ offset = EX_VAR(opline->op2.var);
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_CV == IS_CONST ||
+ (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
break;
}
}
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ GET_OP1_UNDEF_CV(container, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- zval_ptr_dtor_nogc(free_op1);
+ goto fetch_obj_r_no_object;
} while (0);
-
- ZEND_VM_NEXT_OPCODE();
- } else {
- SAVE_OPLINE();
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- concat_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ /* here we are sure we are dealing with an object */
do {
- int result;
-
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
- zval_ptr_dtor_nogc(free_op1);
-
- } else {
- break;
- }
- } else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ zend_object *zobj = Z_OBJ_P(container);
+ zval *retval;
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ break;
}
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
}
- zval_ptr_dtor_nogc(free_op1);
-
- } else {
- break;
}
- } else {
- break;
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
- } else {
- break;
- }
+ if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
+fetch_obj_r_no_object:
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- break;
- }
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
-
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ if (retval != EX_VAR(opline->result.var)) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
- } else {
- break;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
} while (0);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- compare_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ zval *property, *container, *result;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ 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));
}
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ 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);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2;
+ zval *property, *container, *result;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container, *dim, *value, *result;
+ container = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, IS_CV, BP_VAR_R EXECUTE_DATA_CC);
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
- } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_array;
- } else {
- goto fetch_dim_r_slow;
- }
- } else {
-fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
- }
- } else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, IS_CV EXECUTE_DATA_CC);
+ 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);
+ 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);
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC), IS_CV EXECUTE_DATA_CC);
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ 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));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
+ if (IS_CV == IS_CONST ||
+ (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ do {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ break;
+ }
}
- } else {
goto fetch_obj_is_no_object;
- }
+ } while (0);
}
/* here we are sure we are dealing with an object */
@@ -52186,21 +49470,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(opline->extended_value);
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
+ Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find_ex(zobj->properties, Z_STR_P(offset), 1);
+ if (EXPECTED(retval)) {
+ uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
+ CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
@@ -52210,7 +49516,7 @@ fetch_obj_is_no_object:
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
@@ -52218,1444 +49524,1169 @@ fetch_obj_is_no_object:
}
} while (0);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container;
-
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC) EXECUTE_DATA_CC);
+ if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+ /* Behave like FETCH_OBJ_W */
+ 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_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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));
+ }
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2;
- zend_string *op1_str, *op2_str, *str;
-
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
-
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
+ zval *container, *property, *result;
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
- } else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- }
- zval_ptr_dtor_nogc(free_op1);
- } while (0);
+ SAVE_OPLINE();
+ container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
- ZEND_VM_NEXT_OPCODE();
+ 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));
}
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- op1_str = Z_STR_P(op1);
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- op1_str = zend_string_copy(Z_STR_P(op1));
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- op1_str = _zval_get_string_func(op1);
- }
- if (IS_CV == IS_CONST) {
- op2_str = Z_STR_P(op2);
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- op2_str = zend_string_copy(Z_STR_P(op2));
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- op2_str = _zval_get_string_func(op2);
- }
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if (IS_CV == IS_CONST) {
- zend_string_addref(op2_str);
- }
- ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
- break;
- }
- }
- if (IS_CV != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op1_str);
- }
- ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
- break;
- }
- }
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op1_str);
- }
- if (IS_CV != IS_CONST) {
- zend_string_release(op2_str);
- }
- } while (0);
- zval_ptr_dtor_nogc(free_op1);
+ 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);
+ if (IS_CV == IS_VAR) {
+ FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
+ }
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *function_name;
- zend_free_op free_op1;
- zval *object;
- zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *obj;
- zend_execute_data *call;
- uint32_t call_info;
- SAVE_OPLINE();
+ zval *object, *property, *value, tmp;
- object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ SAVE_OPLINE();
+ object = EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- if (IS_CV != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
- do {
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
- function_name = Z_REFVAL_P(function_name);
- if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
- break;
- }
- } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- zend_throw_error(NULL, "Method name must be a string");
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- } while (0);
+ goto exit_assign_obj;
+ }
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
- do {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
+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*));
+ zend_object *zobj = Z_OBJ_P(object);
+ zval *property_val;
- HANDLE_EXCEPTION();
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ property_val = OBJ_PROP(zobj, prop_offset);
+ if (Z_TYPE_P(property_val) != IS_UNDEF) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_CONST);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
}
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
}
- } while (0);
- }
-
- obj = Z_OBJ_P(object);
- called_scope = obj->ce;
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
- } else {
- zend_object *orig_obj = obj;
-
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
+ if (!zobj->ce->__set) {
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_CONST == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
}
+ }
- /* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
- if (UNEXPECTED(fbc == NULL)) {
- if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
- }
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op1);
- HANDLE_EXCEPTION();
- }
- if (IS_CV == IS_CONST &&
- EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
- EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
- EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
- }
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
- init_func_run_time_cache(&fbc->op_array);
- }
+ goto exit_assign_obj;
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
- obj = NULL;
- } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
- /* CV may be changed indirectly (e.g. when it's a reference) */
- call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
}
- zval_ptr_dtor_nogc(free_op1);
+ Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
- call->prev_execute_data = EX(call);
- EX(call) = call;
+exit_assign_obj:
- ZEND_VM_NEXT_OPCODE();
+
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zend_free_op free_op_data;
+ zval *object, *property, *value, tmp;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- do {
- int result;
+ SAVE_OPLINE();
+ object = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == 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);
+ 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)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
+ }
+
+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*));
+ 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) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
}
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
+ zobj->properties = zend_array_dup(zobj->properties);
}
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
- } else {
- break;
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_TMP_VAR == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- } else {
- break;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ }
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ 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_ptr_dtor_nogc(free_op_data);
+exit_assign_obj:
+
+
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- int result;
- zend_ulong hval;
- zval *offset;
+ zend_free_op free_op_data;
+ zval *object, *property, *value, tmp;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- HashTable *ht;
- zval *value;
- zend_string *str;
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
-isset_dim_obj_array:
- ht = Z_ARRVAL_P(container);
-isset_again:
- if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
- str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index_prop;
- }
- }
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
- } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- hval = Z_LVAL_P(offset);
-num_index_prop:
- value = zend_hash_index_find(ht, hval);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
- offset = Z_REFVAL_P(offset);
- goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
- }
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
- if (opline->extended_value & ZEND_ISSET) {
- /* > IS_NULL means not IS_UNDEF and not IS_NULL */
- result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- result = (value == NULL || !i_zend_is_true(value));
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
+ }
}
- goto isset_dim_obj_exit;
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto isset_dim_obj_array;
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
}
}
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- }
-
- if (((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
+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*));
+ zend_object *zobj = Z_OBJ_P(object);
+ zval *property_val;
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ property_val = OBJ_PROP(zobj, prop_offset);
+ if (Z_TYPE_P(property_val) != IS_UNDEF) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_VAR);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- } else {
- goto isset_not_found;
+ goto exit_assign_obj;
}
} else {
- if (IS_CV & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
}
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
+
+ if (!zobj->ce->__set) {
+
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_VAR == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto isset_not_found;
}
- } else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
}
-isset_dim_obj_exit:
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ goto exit_assign_obj;
+ }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+
+ 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_ptr_dtor_nogc(free_op_data);
+exit_assign_obj:
+
+
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- int result;
- zval *offset;
+
+ zval *object, *property, *value, tmp;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto isset_no_object;
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if (Z_ISREF_P(object)) {
+ object = Z_REFVAL_P(object);
+ if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+ goto assign_object;
}
- } else {
- goto isset_no_object;
}
- }
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
-isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
- } else {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
- }
+ if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *container, *dim, *value;
- zend_long offset;
-
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
+ goto exit_assign_obj;
}
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
- }
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
- SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+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*));
+ zend_object *zobj = Z_OBJ_P(object);
+ zval *property_val;
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ property_val = OBJ_PROP(zobj, prop_offset);
+ if (Z_TYPE_P(property_val) != IS_UNDEF) {
+fast_assign_obj:
+ value = zend_assign_to_variable(property_val, value, IS_CV);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ } else {
+ if (EXPECTED(zobj->properties != NULL)) {
+ if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
+ if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
+ GC_DELREF(zobj->properties);
+ }
+ zobj->properties = zend_array_dup(zobj->properties);
+ }
+ property_val = zend_hash_find_ex(zobj->properties, Z_STR_P(property), 1);
+ if (property_val) {
+ goto fast_assign_obj;
+ }
+ }
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
- }
+ if (!zobj->ce->__set) {
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (EXPECTED(zobj->properties == NULL)) {
+ rebuild_object_properties(zobj);
+ }
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV != IS_TMP_VAR) {
+ if (Z_ISREF_P(value)) {
+ if (IS_CV == IS_VAR) {
+ zend_reference *ref = Z_REF_P(value);
+ if (GC_DELREF(ref) == 0) {
+ ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(value));
+ efree_size(ref, sizeof(zend_reference));
+ value = &tmp;
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else {
+ value = Z_REFVAL_P(value);
+ Z_TRY_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_CV) {
+ Z_TRY_ADDREF_P(value);
+ }
+ }
+ zend_hash_add_new(zobj->properties, Z_STR_P(property), value);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
+ }
+ }
}
- add_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ if (!Z_OBJ_HT_P(object)->write_property) {
+ zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
+ goto exit_assign_obj;
}
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
}
- sub_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- zend_long overflow;
+ Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
- ZEND_VM_NEXT_OPCODE();
- }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+exit_assign_obj:
+
+
+ /* assign_obj has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+
+ zval *object_ptr;
+ zend_free_op free_op_data;
+ zval *value;
+ zval *variable_ptr;
+ zval *dim;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- fast_div_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ object_ptr = EX_VAR(opline->op1.var);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if (IS_CV == IS_UNUSED) {
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ ZVAL_DEREF(value);
+ }
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = EX_VAR(opline->result.var);
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- SAVE_OPLINE();
- zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
- /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
- ZVAL_LONG(result, 0);
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_CONST == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CONST == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
+ }
+ } else {
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
- ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
}
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ goto assign_dim_error;
+ }
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
}
- }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mod_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if (IS_CV == IS_UNUSED) {
+ zend_use_new_element_for_string();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+assign_dim_error:
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
- && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
}
+ if (IS_CV != IS_UNUSED) {
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- pow_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval *object_ptr;
+ zend_free_op free_op_data;
+ zval *value;
+ zval *variable_ptr;
+ zval *dim;
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
- zend_string *op1_str = Z_STR_P(op1);
- zend_string *op2_str = Z_STR_P(op2);
- zend_string *str;
+ SAVE_OPLINE();
+ object_ptr = EX_VAR(opline->op1.var);
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if (IS_CV == IS_UNUSED) {
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_TMP_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
-
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else {
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
}
- zval_ptr_dtor_nogc(free_op1);
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE();
- } else {
- SAVE_OPLINE();
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
}
- concat_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval_ptr_dtor_nogc(free_op_data);
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if (IS_CV == IS_UNUSED) {
+ zend_use_new_element_for_string();
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
} else {
- break;
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
- }
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
- }
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- } else {
- break;
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+assign_dim_error:
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
- } else {
- break;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (IS_CV != IS_UNUSED) {
+
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval *object_ptr;
+ zend_free_op free_op_data;
+ zval *value;
+ zval *variable_ptr;
+ zval *dim;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ SAVE_OPLINE();
+ object_ptr = EX_VAR(opline->op1.var);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if (IS_CV == IS_UNUSED) {
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ ZVAL_DEREF(value);
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 0;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 1;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0);
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ zval_ptr_dtor_nogc(free_op_data);
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_VAR == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
}
- } else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0);
+ zval_ptr_dtor_nogc(free_op_data);
+ }
+ } else if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
}
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- } else {
- break;
}
} else {
- break;
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval_ptr_dtor_nogc(free_op_data);
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if (IS_CV == IS_UNUSED) {
+ zend_use_new_element_for_string();
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
- } else {
- break;
- }
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
} else {
- break;
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
}
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
} else {
- break;
+ if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+assign_dim_error:
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (IS_CV != IS_UNUSED) {
+
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval *object_ptr;
+ zend_free_op free_op_data;
+ zval *value;
+ zval *variable_ptr;
+ zval *dim;
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
- } else {
- break;
+ SAVE_OPLINE();
+ object_ptr = EX_VAR(opline->op1.var);
+
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+try_assign_dim_array:
+ SEPARATE_ARRAY(object_ptr);
+ if (IS_CV == IS_UNUSED) {
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ ZVAL_DEREF(value);
}
- } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
+ if (UNEXPECTED(variable_ptr == NULL)) {
+
+ zend_cannot_add_element();
+ goto assign_dim_error;
+ } else if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+ } else if (IS_CV == IS_VAR) {
+ if (value != free_op_data) {
+ if (Z_REFCOUNTED_P(value)) {
+ Z_ADDREF_P(value);
+ }
+
+ }
+ } else if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
+ Z_ADDREF_P(value);
+ }
}
} else {
- break;
+ dim = EX_VAR(opline->op2.var);
+ if (IS_CV == IS_CONST) {
+ variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ } else {
+ variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim EXECUTE_DATA_CC);
+ }
+ if (UNEXPECTED(variable_ptr == NULL)) {
+ 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);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ } else {
+ if (EXPECTED(Z_ISREF_P(object_ptr))) {
+ object_ptr = Z_REFVAL_P(object_ptr);
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
+ goto try_assign_dim_array;
+ }
+ }
+ if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
+ dim++;
+ }
+ zend_assign_to_object_dim(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
+ if (IS_CV == IS_UNUSED) {
+ zend_use_new_element_for_string();
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- compare_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ } else {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+ zend_assign_to_string_offset(object_ptr, dim, value OPLINE_CC EXECUTE_DATA_CC);
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ }
+ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
+ ZVAL_ARR(object_ptr, zend_new_array(8));
+ goto try_assign_dim_array;
+ } else {
+ if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
+ zend_use_scalar_as_array();
+ }
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+assign_dim_error:
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ }
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (IS_CV != IS_UNUSED) {
+
}
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+
+ /* assign_dim has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ zval *value;
+ zval *variable_ptr;
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
- && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
- }
+ if (UNEXPECTED(0)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ }
+ } else {
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ if (UNEXPECTED(0)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
}
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2;
+
+ zval *value;
+ zval *variable_ptr;
SAVE_OPLINE();
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *dim, *value, *result;
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_array:
- value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, (IS_TMP_VAR|IS_VAR), BP_VAR_R EXECUTE_DATA_CC);
- result = EX_VAR(opline->result.var);
- ZVAL_COPY_UNREF(result, value);
- } else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_array;
- } else {
- goto fetch_dim_r_slow;
- }
- } else {
-fetch_dim_r_slow:
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R_slow(result, container, dim EXECUTE_DATA_CC);
+ if (UNEXPECTED(1)) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- result = EX_VAR(opline->result.var);
- zend_fetch_dimension_address_read_R(result, container, dim, (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- }
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ if (UNEXPECTED(1)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
+ /* zend_assign_to_variable() always takes care of op2, never free it! */
+ }
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC), (IS_TMP_VAR|IS_VAR) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *container;
- zend_free_op free_op2;
- zval *offset;
+
+ zval *variable_ptr;
+ zval *value_ptr;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
+ variable_ptr = EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|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));
- }
+ if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else if (IS_CV == IS_VAR &&
+ UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
- container = Z_REFVAL_P(container);
- if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
- goto fetch_obj_is_no_object;
- }
- } else {
- goto fetch_obj_is_no_object;
- }
- }
- /* here we are sure we are dealing with an object */
- do {
- zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
+ 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 ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) {
- if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- }
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
}
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-fetch_obj_is_no_object:
- ZVAL_NULL(EX_VAR(opline->result.var));
- } else {
+ /* op2 freed by assign_to_variable */
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
-
- if (retval != EX_VAR(opline->result.var)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- }
- }
- } while (0);
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
+ }
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container;
- SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- zend_fetch_dimension_address_read_LIST(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC) EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *op1, *op2;
zend_string *op1_str, *op2_str, *str;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
- ((IS_TMP_VAR|IS_VAR) == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if ((IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
+ (IS_CV == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
zend_string *op1_str = Z_STR_P(op1);
zend_string *op2_str = Z_STR_P(op2);
zend_string *str;
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
- zval_ptr_dtor_nogc(free_op1);
- break;
- }
+ if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
+ } else {
+ ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
- !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
- size_t len = ZSTR_LEN(op1_str);
- str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- break;
+ } else if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
+ if (IS_CV == IS_CONST || IS_CV == IS_CV) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
} else {
- str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
- memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
- memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
- ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+ ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- zval_ptr_dtor_nogc(free_op1);
- } while (0);
- zval_ptr_dtor_nogc(free_op2);
+
+ } else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
+ !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
+ size_t len = ZSTR_LEN(op1_str);
+
+ str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+ } else {
+ str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
+ memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
+ memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+ ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
+
+
+ }
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (IS_CV == IS_CONST) {
op1_str = Z_STR_P(op1);
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
op1_str = zend_string_copy(Z_STR_P(op1));
} else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- op1_str = _zval_get_string_func(op1);
+ op1_str = zval_get_string_func(op1);
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ if (IS_CV == IS_CONST) {
op2_str = Z_STR_P(op2);
} else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
op2_str = zend_string_copy(Z_STR_P(op2));
} else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
- op2_str = _zval_get_string_func(op2);
+ op2_str = zval_get_string_func(op2);
}
do {
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (IS_CV != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op2_str);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op2))) {
+ GC_ADDREF(op2_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
- zend_string_release(op1_str);
+ zend_string_release_ex(op1_str, 0);
break;
}
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (IS_CV != IS_CONST) {
if (UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_string_addref(op1_str);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_REFCOUNTED_P(op1))) {
+ GC_ADDREF(op1_str);
+ }
}
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
- zend_string_release(op2_str);
+ zend_string_release_ex(op2_str, 0);
break;
}
}
@@ -53663,23 +50694,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR
memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op1_str);
+ if (IS_CV != IS_CONST) {
+ zend_string_release_ex(op1_str, 0);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_string_release(op2_str);
+ if (IS_CV != IS_CONST) {
+ zend_string_release_ex(op2_str, 0);
}
} while (0);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
+
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
- zend_free_op free_op1, free_op2;
+ zend_free_op free_op1;
zval *object;
zend_function *fbc;
zend_class_entry *called_scope;
@@ -53689,55 +50720,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
SAVE_OPLINE();
- object = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ object = EX_VAR(opline->op1.var);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
- function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ if (IS_CV != IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ if (IS_CV != IS_CONST &&
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
break;
}
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op1);
+
HANDLE_EXCEPTION();
}
}
zend_throw_error(NULL, "Method name must be a string");
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
+
HANDLE_EXCEPTION();
} while (0);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ if (IS_CV != IS_UNUSED) {
do {
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
+ if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+ if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(object))) {
object = Z_REFVAL_P(object);
if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
break;
}
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
+ if (IS_CV != IS_CONST) {
+
+ }
HANDLE_EXCEPTION();
}
}
- zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+ zend_invalid_method_call(object, function_name);
+
+
HANDLE_EXCEPTION();
}
} while (0);
@@ -53746,54 +50784,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
obj = Z_OBJ_P(object);
called_scope = obj->ce;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(function_name)) == called_scope)) {
- fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name) + sizeof(void*));
+ if (IS_CV == IS_CONST &&
+ EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
+ fbc = CACHED_PTR(opline->result.num + sizeof(void*));
} else {
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
zend_throw_error(NULL, "Object does not support method calls");
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
+
HANDLE_EXCEPTION();
}
+ if (IS_CV == IS_CONST) {
+ function_name = EX_VAR(opline->op2.var);
+ }
+
/* First, locate the function. */
- fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
+ fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (RT_CONSTANT(opline, opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
if (EXPECTED(!EG(exception))) {
- zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(obj->ce->name), Z_STRVAL_P(function_name));
+ zend_undefined_method(obj->ce, Z_STR_P(function_name));
}
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
+
HANDLE_EXCEPTION();
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
+ if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
EXPECTED(obj == orig_obj)) {
- CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
+ CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
+ }
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(obj != orig_obj)) {
+ /* Reset "object" to trigger reference counting */
+ object = NULL;
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
init_func_run_time_cache(&fbc->op_array);
}
}
+ if (IS_CV != IS_CONST) {
+
+ }
+
call_info = ZEND_CALL_NESTED_FUNCTION;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0)) {
obj = NULL;
- } else if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR|IS_CV)) {
+
+ if ((IS_CV & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ } else if (IS_CV & (IS_VAR|IS_TMP_VAR|IS_CV)) {
/* CV may be changed indirectly (e.g. when it's a reference) */
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_RELEASE_THIS;
- GC_REFCOUNT(obj)++; /* For $this pointer */
- }
+ if (IS_CV == IS_CV) {
+ GC_ADDREF(obj); /* For $this pointer */
+ } else if (free_op1 != object) {
+ GC_ADDREF(obj); /* For $this pointer */
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) && UNEXPECTED(EG(exception))) {
- HANDLE_EXCEPTION();
+ }
}
call = zend_vm_stack_push_call_frame(call_info,
@@ -53804,84 +50856,263 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ zval *expr_ptr, new_expr;
- if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
- } else {
- break;
+ SAVE_OPLINE();
+ if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+ if (Z_ISREF_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(expr_ptr, 2);
+ }
+
+ } else {
+ expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ if (IS_CV == IS_TMP_VAR) {
+ /* pass */
+ } else if (IS_CV == IS_CONST) {
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else if (IS_CV == IS_CV) {
+ ZVAL_DEREF(expr_ptr);
+ Z_TRY_ADDREF_P(expr_ptr);
+ } else /* if (IS_CV == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(expr_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(expr_ptr);
+
+ expr_ptr = Z_REFVAL_P(expr_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ expr_ptr = &new_expr;
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
- result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
- } else {
- break;
+ }
+ }
+
+ if (IS_CV != IS_UNUSED) {
+
+ zval *offset = EX_VAR(opline->op2.var);
+ zend_string *str;
+ zend_ulong hval;
+
+add_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
- } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
- if (Z_STR_P(op1) == Z_STR_P(op2)) {
- result = 1;
- } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') {
- if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) {
- result = 0;
- } else {
- result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0);
+str_index:
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_index;
+ } else {
+ zend_illegal_offset();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+
+ } else {
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), expr_ptr)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(expr_ptr);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_CV != IS_UNUSED) {
+ size = opline->extended_value >> ZEND_ARRAY_SIZE_SHIFT;
+ ZVAL_ARR(array, zend_new_array(size));
+ /* Explicitly initialize array as not-packed if flag is set */
+ if (opline->extended_value & ZEND_ARRAY_NOT_PACKED) {
+ zend_hash_real_init_mixed(Z_ARRVAL_P(array));
+ }
+ ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_EMPTY_ARRAY(array);
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+ zval *offset;
+ zend_ulong hval;
+ zend_string *key;
+
+ SAVE_OPLINE();
+ container = EX_VAR(opline->op1.var);
+ offset = EX_VAR(opline->op2.var);
+
+ do {
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ HashTable *ht;
+
+unset_dim_array:
+ SEPARATE_ARRAY(container);
+ ht = Z_ARRVAL_P(container);
+offset_again:
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ key = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(key, hval)) {
+ goto num_index_dim;
}
+ }
+str_index_dim:
+ if (ht == &EG(symbol_table)) {
+ zend_delete_global_variable(key);
} else {
- result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0);
+ zend_hash_del(ht, key);
}
- zval_ptr_dtor_nogc(free_op2);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index_dim:
+ zend_hash_index_del(ht, hval);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ key = ZSTR_EMPTY_ALLOC();
+ goto str_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index_dim;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index_dim;
+ } else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
+ GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ key = ZSTR_EMPTY_ALLOC();
+ goto str_index_dim;
} else {
- break;
+ zend_error(E_WARNING, "Illegal offset type in unset");
}
- } else {
break;
+ } else if (Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
+ goto unset_dim_array;
+ }
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ }
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
+ offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ }
+ if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_use_object_as_array();
+ } else {
+ if (IS_CV == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
+ }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
+ } else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ zend_throw_error(NULL, "Cannot unset string offsets");
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
} while (0);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *container;
+ zval *offset;
+
SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ container = _get_zval_ptr_cv_BP_VAR_UNSET(opline->op1.var EXECUTE_DATA_CC);
+ 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));
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- zval_ptr_dtor_nogc(free_op2);
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ if (Z_ISREF_P(container)) {
+ container = Z_REFVAL_P(container);
+ if (Z_TYPE_P(container) != IS_OBJECT) {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
+ } else {
+ zend_wrong_property_unset(offset);
+ }
+ } while (0);
+
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *container;
int result;
zend_ulong hval;
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ container = EX_VAR(opline->op1.var);
+ offset = EX_VAR(opline->op2.var);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht;
@@ -53893,135 +51124,75 @@ isset_dim_obj_array:
isset_again:
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (IS_CV != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(str, hval)) {
goto num_index_prop;
}
}
-str_index_prop:
- value = zend_hash_find_ind(ht, str);
+ value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
value = zend_hash_index_find(ht, hval);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(offset))) {
offset = Z_REFVAL_P(offset);
goto isset_again;
- } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_NULL) {
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
- } else if (Z_TYPE_P(offset) == IS_FALSE) {
- hval = 0;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_TRUE) {
- hval = 1;
- goto num_index_prop;
- } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
- hval = Z_RES_HANDLE_P(offset);
- goto num_index_prop;
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
- str = ZSTR_EMPTY_ALLOC();
- goto str_index_prop;
} else {
- zend_error(E_WARNING, "Illegal offset type in isset or empty");
- goto isset_not_found;
+ value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
}
- if (opline->extended_value & ZEND_ISSET) {
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+ } else {
result = (value == NULL || !i_zend_is_true(value));
}
goto isset_dim_obj_exit;
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto isset_dim_obj_array;
}
}
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ if (IS_CV == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
+ offset++;
}
-
- if (((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
- if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
- result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0);
- } else {
- zend_error(E_NOTICE, "Trying to check element of non-array");
- goto isset_not_found;
- }
- } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
- zend_long lval;
-
- if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
- lval = Z_LVAL_P(offset);
-isset_str_offset:
- if (UNEXPECTED(lval < 0)) { /* Handle negative offset */
- lval += (zend_long)Z_STRLEN_P(container);
- }
- if (EXPECTED(lval >= 0) && (size_t)lval < Z_STRLEN_P(container)) {
- if (opline->extended_value & ZEND_ISSET) {
- result = 1;
- } else {
- result = (Z_STRVAL_P(container)[lval] == '0');
- }
- } else {
- goto isset_not_found;
- }
- } else {
- if ((IS_TMP_VAR|IS_VAR) & (IS_CV|IS_VAR)) {
- ZVAL_DEREF(offset);
- }
- if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
- || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
- && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
- lval = zval_get_long(offset);
- goto isset_str_offset;
- }
- goto isset_not_found;
- }
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
} else {
-isset_not_found:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
}
isset_dim_obj_exit:
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
+
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
+
zval *container;
int result;
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ 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));
}
- offset = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ offset = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
- ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
+ if (IS_CV == IS_CONST ||
+ (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
goto isset_no_object;
@@ -54031,742 +51202,156 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
}
}
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_string *property_name = zval_get_string(offset);
- zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name));
- zend_string_release(property_name);
+ zend_wrong_property_check(offset);
isset_no_object:
- result = ((opline->extended_value & ZEND_ISSET) == 0);
+ result = (opline->extended_value & ZEND_ISEMPTY);
} else {
result =
- ((opline->extended_value & ZEND_ISSET) == 0) ^
- Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL));
+ (opline->extended_value & ZEND_ISEMPTY) ^
+ Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
}
- zval_ptr_dtor_nogc(free_op2);
- zval_ptr_dtor_nogc(free_op1);
+
ZEND_VM_SMART_BRANCH(result, 1);
ZVAL_BOOL(EX_VAR(opline->result.var), result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *container, *dim, *value;
- zend_long offset;
- container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-fetch_dim_r_index_array:
- if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
- offset = Z_LVAL_P(dim);
- } else {
- offset = zval_get_long(dim);
- }
- ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, fetch_dim_r_index_undef);
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), value);
- if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- ZEND_VM_NEXT_OPCODE();
- }
- } else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
- container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- goto fetch_dim_r_index_array;
- } else {
- goto fetch_dim_r_index_slow;
- }
- } else {
-fetch_dim_r_index_slow:
- SAVE_OPLINE();
- zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim EXECUTE_DATA_CC);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
+ zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
-fetch_dim_r_index_undef:
- ZVAL_NULL(EX_VAR(opline->result.var));
SAVE_OPLINE();
- zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *value;
-
- value = EX_VAR(opline->op1.var);
- ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(value));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *value;
-
- value = EX_VAR(opline->op1.var);
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_CONSTANT(opline->op2);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- fast_long_add_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- fast_long_sub_function(result, op1, op2);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_LONG(result, Z_LVAL_P(op1) * Z_LVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
- zend_long overflow;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
- Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2, *result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
-
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
+ ZEND_VM_TAIL_CALL(zend_yield_in_closed_generator_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+ /* Destroy the previously yielded value */
+ zval_ptr_dtor(&generator->value);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ /* Destroy the previously yielded key */
+ zval_ptr_dtor(&generator->key);
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ /* Set the new yielded value */
+ if (IS_CV != IS_UNUSED) {
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ /* Constants and temporary variables aren't yieldable by reference,
+ * but we still allow them with a notice. */
+ if (IS_CV & (IS_CONST|IS_TMP_VAR)) {
+ zval *value;
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ }
+ } else {
+ zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+ /* If a function call result is yielded and the function did
+ * not return by reference we throw a notice. */
+ if (IS_CV == IS_VAR &&
+ (value_ptr == &EG(uninitialized_zval) ||
+ (opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !Z_ISREF_P(value_ptr)))) {
+ zend_error(E_NOTICE, "Only variable references should be yielded by reference");
+ ZVAL_COPY(&generator->value, value_ptr);
+ } else {
+ if (Z_ISREF_P(value_ptr)) {
+ Z_ADDREF_P(value_ptr);
+ } else {
+ ZVAL_MAKE_REF_EX(value_ptr, 2);
+ }
+ ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
+ }
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ }
+ } else {
+ zval *value = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ /* Consts, temporary variables and references need copying */
+ if (IS_CV == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->value))) {
+ Z_ADDREF(generator->value);
+ }
+ } else if (IS_CV == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ } else {
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (IS_CV == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
+ }
+ }
+ }
+ } else {
+ /* If no value was specified yield null */
+ ZVAL_NULL(&generator->value);
+ }
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ /* Set the new yielded key */
+ if (IS_CV != IS_UNUSED) {
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ zval *key = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ /* Consts, temporary variables and references need copying */
+ if (IS_CV == IS_CONST) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->key))) {
+ Z_ADDREF(generator->key);
+ }
+ } else if (IS_CV == IS_TMP_VAR) {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+ } else {
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (IS_CV == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key);
+ }
+ }
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ if (Z_TYPE(generator->key) == IS_LONG
+ && Z_LVAL(generator->key) > generator->largest_used_integer_key
+ ) {
+ generator->largest_used_integer_key = Z_LVAL(generator->key);
+ }
+ } else {
+ /* If no key was specified we use auto-increment keys */
+ generator->largest_used_integer_key++;
+ ZVAL_LONG(&generator->key, generator->largest_used_integer_key);
+ }
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ if (RETURN_VALUE_USED(opline)) {
+ /* If the return value of yield is used set the send
+ * target and initialize it to NULL */
+ generator->send_target = EX_VAR(opline->result.var);
+ ZVAL_NULL(generator->send_target);
+ } else {
+ generator->send_target = NULL;
+ }
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
-}
+ /* We increment to the next op, so we are at the correct position when the
+ * generator is resumed. */
+ ZEND_VM_INC_OPCODE();
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *op1, *op2;
- int result;
+ /* The GOTO VM uses a local opline variable. We need to set the opline
+ * variable in execute_data so we don't resume at an old position. */
+ SAVE_OPLINE();
- op1 = EX_VAR(opline->op1.var);
- op2 = EX_VAR(opline->op2.var);
- result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
- ZEND_VM_SMART_BRANCH_JMPNZ(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_RETURN();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -54778,6 +51363,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDL
}
+#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
+# undef ZEND_VM_TAIL_CALL
+# undef ZEND_VM_CONTINUE
+# undef ZEND_VM_RETURN
+
+# define ZEND_VM_TAIL_CALL(call) call; ZEND_VM_CONTINUE()
+# define ZEND_VM_CONTINUE() HYBRID_NEXT()
+# define ZEND_VM_RETURN() goto HYBRID_HALT_LABEL
+#endif
+
+
ZEND_API void execute_ex(zend_execute_data *ex)
{
DCL_OPLINE
@@ -54794,7 +51390,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
if (UNEXPECTED(execute_data == NULL)) {
- static const void* labels[] = {
+ static const void * const labels[] = {
(void*)&&ZEND_NOP_SPEC_LABEL,
(void*)&&ZEND_ADD_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_ADD_SPEC_CONST_TMPVAR_LABEL,
@@ -54847,20 +51443,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SUB_SPEC_CV_CV_LABEL,
(void*)&&ZEND_MUL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_MUL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_MUL_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_MUL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -54971,7 +51567,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_SR_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SR_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_CONCAT_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_CONCAT_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_CONCAT_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -54997,20 +51593,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_CONCAT_SPEC_CV_CV_LABEL,
(void*)&&ZEND_BW_OR_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55022,20 +51618,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_OR_SPEC_CV_CV_LABEL,
(void*)&&ZEND_BW_AND_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55047,20 +51643,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_AND_SPEC_CV_CV_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55082,20 +51678,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BOOL_NOT_SPEC_CV_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BOOL_XOR_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BOOL_XOR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55107,20 +51703,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BOOL_XOR_SPEC_CV_CV_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_CONST_TMP_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_CONST_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_TMP_CONST_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_TMP_TMP_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_TMP_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_TMP_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_VAR_TMP_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_VAR_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_IDENTICAL_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55132,20 +51728,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_IDENTICAL_SPEC_CV_CV_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55157,20 +51753,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55182,20 +51778,20 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_EQUAL_SPEC_CV_CV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -56228,91 +52824,19 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_JMPNZ_EX_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_JMPNZ_EX_SPEC_CV_LABEL,
- (void*)&&ZEND_CASE_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_CASE_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_CASE_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_CASE_SPEC_CONST_CV_LABEL,
(void*)&&ZEND_CASE_SPEC_TMPVAR_CONST_LABEL,
(void*)&&ZEND_CASE_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_CASE_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_CASE_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_CASE_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_CASE_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_CASE_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_CASE_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_CASE_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_CASE_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_CASE_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_CASE_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_CHECK_VAR_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_LABEL,
(void*)&&ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_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_MAKE_REF_SPEC_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MAKE_REF_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BOOL_SPEC_CONST_LABEL,
(void*)&&ZEND_BOOL_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_BOOL_SPEC_TMPVAR_LABEL,
@@ -56343,110 +52867,34 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FAST_CONCAT_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_ROPE_INIT_SPEC_UNUSED_CONST_LABEL,
(void*)&&ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_LABEL,
(void*)&&ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ROPE_INIT_SPEC_UNUSED_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_ROPE_ADD_SPEC_TMP_CONST_LABEL,
(void*)&&ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_LABEL,
(void*)&&ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ROPE_ADD_SPEC_TMP_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_ROPE_END_SPEC_TMP_CONST_LABEL,
(void*)&&ZEND_ROPE_END_SPEC_TMP_TMPVAR_LABEL,
(void*)&&ZEND_ROPE_END_SPEC_TMP_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ROPE_END_SPEC_TMP_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_BEGIN_SILENCE_SPEC_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_END_SILENCE_SPEC_TMP_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_DO_FCALL_SPEC_RETVAL_USED_LABEL,
(void*)&&ZEND_INIT_FCALL_SPEC_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_RETURN_SPEC_CONST_LABEL,
(void*)&&ZEND_RETURN_SPEC_TMP_LABEL,
(void*)&&ZEND_RETURN_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_RETURN_SPEC_CV_LABEL,
- (void*)&&ZEND_RECV_SPEC_LABEL,
+ (void*)&&ZEND_RECV_SPEC_UNUSED_LABEL,
(void*)&&ZEND_RECV_INIT_SPEC_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAL_SPEC_CONST_LABEL,
(void*)&&ZEND_SEND_VAL_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_SEND_VAL_SPEC_TMPVAR_LABEL,
@@ -56467,21 +52915,13 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_SEND_REF_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_REF_SPEC_CV_LABEL,
- (void*)&&ZEND_NEW_SPEC_CONST_LABEL,
+ (void*)&&ZEND_NEW_SPEC_CONST_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NEW_SPEC_VAR_LABEL,
- (void*)&&ZEND_NEW_SPEC_UNUSED_LABEL,
+ (void*)&&ZEND_NEW_SPEC_VAR_UNUSED_LABEL,
+ (void*)&&ZEND_NEW_SPEC_UNUSED_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FREE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FREE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_LABEL,
@@ -56537,29 +52977,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_UNSET_VAR_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_UNSET_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_UNSET_VAR_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -56571,7 +52992,6 @@ 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_UNSET_DIM_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_LABEL,
@@ -56617,41 +53037,17 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FE_RESET_R_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_RESET_R_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_FETCH_R_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_EXIT_SPEC_CONST_LABEL,
(void*)&&ZEND_EXIT_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_EXIT_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_EXIT_SPEC_UNUSED_LABEL,
(void*)&&ZEND_EXIT_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_R_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_DIM_R_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_LABEL,
@@ -56682,16 +53078,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_R_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMP_CV_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_OBJ_R_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_LABEL,
(void*)&&ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_LABEL,
(void*)&&ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_LABEL,
@@ -56702,29 +53098,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_R_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_W_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_W_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_W_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -56736,7 +53113,6 @@ 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_FETCH_DIM_W_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_LABEL,
@@ -56777,29 +53153,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_W_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_RW_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_RW_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_RW_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -56811,7 +53168,6 @@ 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_FETCH_DIM_RW_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_LABEL,
@@ -56852,31 +53208,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_RW_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_IS_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_IS_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_IS_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_LABEL,
@@ -56927,31 +53263,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_IS_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_FUNC_ARG_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_LABEL,
@@ -57002,29 +53318,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_UNSET_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_UNSET_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -57036,7 +53333,6 @@ 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_FETCH_DIM_UNSET_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_LABEL,
@@ -57077,101 +53373,51 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_LIST_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_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_FETCH_LIST_R_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_LABEL,
(void*)&&ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_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_CHECK_FUNC_ARG_SPEC_UNUSED_LABEL,
+ (void*)&&ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK_LABEL,
(void*)&&ZEND_EXT_STMT_SPEC_LABEL,
(void*)&&ZEND_EXT_FCALL_BEGIN_SPEC_LABEL,
(void*)&&ZEND_EXT_FCALL_END_SPEC_LABEL,
(void*)&&ZEND_EXT_NOP_SPEC_LABEL,
(void*)&&ZEND_TICKS_SPEC_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAR_NO_REF_SPEC_VAR_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_CATCH_SPEC_CONST_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_CATCH_SPEC_CONST_LABEL,
(void*)&&ZEND_THROW_SPEC_CONST_LABEL,
(void*)&&ZEND_THROW_SPEC_TMP_LABEL,
(void*)&&ZEND_THROW_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_THROW_SPEC_CV_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_CONST_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_CV_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_CV_LABEL,
(void*)&&ZEND_CLONE_SPEC_CONST_LABEL,
(void*)&&ZEND_CLONE_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_CLONE_SPEC_TMPVAR_LABEL,
@@ -57232,31 +53478,11 @@ 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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_LABEL,
@@ -57302,26 +53528,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INIT_USER_CALL_SPEC_CONST_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_SEND_ARRAY_SPEC_LABEL,
(void*)&&ZEND_SEND_USER_SPEC_CONST_LABEL,
(void*)&&ZEND_SEND_USER_SPEC_TMP_LABEL,
@@ -57334,55 +53540,23 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_STRLEN_SPEC_CV_LABEL,
(void*)&&ZEND_DEFINED_SPEC_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_TYPE_CHECK_SPEC_CONST_LABEL,
- (void*)&&ZEND_TYPE_CHECK_SPEC_TMP_LABEL,
- (void*)&&ZEND_TYPE_CHECK_SPEC_VAR_LABEL,
+ (void*)&&ZEND_TYPE_CHECK_SPEC_TMPVAR_LABEL,
+ (void*)&&ZEND_TYPE_CHECK_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_TYPE_CHECK_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_RESET_RW_SPEC_CONST_LABEL,
(void*)&&ZEND_FE_RESET_RW_SPEC_TMP_LABEL,
(void*)&&ZEND_FE_RESET_RW_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_RESET_RW_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_FETCH_RW_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_FREE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FE_FREE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_LABEL,
(void*)&&ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_LABEL,
@@ -57645,12 +53819,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_INSTANCEOF_SPEC_CV_VAR_LABEL,
(void*)&&ZEND_INSTANCEOF_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_DECLARE_CLASS_SPEC_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_DECLARE_INHERITED_CLASS_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_DECLARE_CLASS_SPEC_CONST_LABEL,
+ (void*)&&ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_DECLARE_FUNCTION_SPEC_LABEL,
(void*)&&ZEND_YIELD_FROM_SPEC_CONST_LABEL,
(void*)&&ZEND_YIELD_FROM_SPEC_TMP_LABEL,
@@ -57658,40 +53828,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_YIELD_FROM_SPEC_CV_LABEL,
(void*)&&ZEND_DECLARE_CONST_SPEC_CONST_CONST_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_ADD_INTERFACE_SPEC_CONST_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_DECLARE_INHERITED_CLASS_DELAYED_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_VERIFY_ABSTRACT_CLASS_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -57851,59 +53989,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_JMP_SET_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_JMP_SET_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_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_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_ADD_TRAIT_SPEC_LABEL,
(void*)&&ZEND_BIND_TRAITS_SPEC_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_SEPARATE_SPEC_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_LABEL,
(void*)&&ZEND_CALL_TRAMPOLINE_SPEC_LABEL,
(void*)&&ZEND_DISCARD_EXCEPTION_SPEC_LABEL,
(void*)&&ZEND_YIELD_SPEC_CONST_CONST_LABEL,
@@ -57938,7 +54028,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_GENERATOR_RETURN_SPEC_CV_LABEL,
(void*)&&ZEND_FAST_CALL_SPEC_LABEL,
(void*)&&ZEND_FAST_RET_SPEC_LABEL,
- (void*)&&ZEND_RECV_VARIADIC_SPEC_LABEL,
+ (void*)&&ZEND_RECV_VARIADIC_SPEC_UNUSED_LABEL,
(void*)&&ZEND_SEND_UNPACK_SPEC_LABEL,
(void*)&&ZEND_POW_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_POW_SPEC_CONST_TMPVAR_LABEL,
@@ -58040,34 +54130,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(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_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_BIND_GLOBAL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CONST_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_TMP_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_VAR_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CV_LABEL,
(void*)&&ZEND_SPACESHIP_SPEC_CONST_CONST_LABEL,
@@ -58096,11 +54162,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SPACESHIP_SPEC_CV_CV_LABEL,
(void*)&&ZEND_DECLARE_ANON_CLASS_SPEC_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR_LABEL,
@@ -58303,415 +54365,71 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_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_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_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_BIND_LEXICAL_SPEC_TMP_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_BIND_STATIC_SPEC_CV_CONST_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_FETCH_THIS_SPEC_UNUSED_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_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_SEND_FUNC_ARG_SPEC_VAR_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_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_SWITCH_LONG_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_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_SWITCH_LONG_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_SWITCH_STRING_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_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_SWITCH_STRING_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_IN_ARRAY_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IN_ARRAY_SPEC_TMP_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IN_ARRAY_SPEC_VAR_CONST_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_IN_ARRAY_SPEC_CV_CONST_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_COUNT_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COUNT_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COUNT_SPEC_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COUNT_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_VAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_CV_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_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_GET_CALLED_CLASS_SPEC_UNUSED_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_TYPE_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_TYPE_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_TYPE_SPEC_VAR_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_TYPE_SPEC_CV_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_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_FUNC_NUM_ARGS_SPEC_UNUSED_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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FUNC_GET_ARGS_SPEC_CONST_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_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_FUNC_GET_ARGS_SPEC_UNUSED_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_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_UNSET_CV_SPEC_CV_UNUSED_LABEL,
+ (void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_LABEL,
+ (void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_CONST_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_JMP_FORWARD_SPEC_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_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58721,22 +54439,22 @@ 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_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58746,22 +54464,22 @@ 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_ADD_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58771,7 +54489,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_ADD_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58852,16 +54570,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58871,22 +54589,22 @@ 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_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58896,22 +54614,22 @@ 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_MUL_LONG_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58921,7 +54639,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_MUL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -58929,21 +54647,21 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -58956,9 +54674,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -58986,9 +54704,9 @@ 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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59004,21 +54722,21 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59031,9 +54749,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59061,9 +54779,9 @@ 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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59079,21 +54797,21 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59106,9 +54824,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59136,9 +54854,9 @@ 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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59154,21 +54872,21 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59181,9 +54899,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59211,9 +54929,9 @@ 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_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
@@ -59526,95 +55244,23 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
(void*)&&ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_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_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_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_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED_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_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_INC_LONG_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_DEC_LONG_SPEC_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_LABEL,
(void*)&&ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST_LABEL,
(void*)&&ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_LABEL,
@@ -59626,31 +55272,31 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
(void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAR_SIMPLE_SPEC_VAR_LABEL,
@@ -59658,64 +55304,13 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_SEND_VAR_SIMPLE_SPEC_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_LABEL,
- (void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_LABEL,
- (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_LABEL,
- (void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_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_SEND_VAL_SIMPLE_SPEC_CONST_LABEL,
+ (void*)&&ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_LABEL,
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_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
};
zend_opcode_handlers = (const void **) labels;
@@ -59744,3996 +55339,5510 @@ ZEND_API void execute_ex(zend_execute_data *ex)
#endif
#endif
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
+zend_leave_helper_SPEC_LABEL:
+{
+ zend_execute_data *old_execute_data;
+ uint32_t call_info = EX_CALL_INFO();
+
+ if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
+ i_free_compiled_variables(execute_data);
+
+ EG(current_execute_data) = EX(prev_execute_data);
+ if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+ zend_object *object = Z_OBJ(execute_data->This);
+#if 0
+ if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
+#endif
+ GC_DELREF(object);
+ zend_object_store_ctor_failed(object);
+ }
+ OBJ_RELEASE(object);
+ } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
+ }
+ EG(vm_stack_top) = (zval*)execute_data;
+ execute_data = EX(prev_execute_data);
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_rethrow_exception(execute_data);
+ HANDLE_EXCEPTION_LEAVE();
+ }
+
+ LOAD_NEXT_OPLINE();
+ ZEND_VM_LEAVE();
+ } else if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP)) == 0)) {
+ i_free_compiled_variables(execute_data);
+
+ if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+ zend_clean_and_cache_symbol_table(EX(symbol_table));
+ }
+ EG(current_execute_data) = EX(prev_execute_data);
+
+ /* Free extra args before releasing the closure,
+ * as that may free the op_array. */
+ zend_vm_stack_free_extra_args_ex(call_info, execute_data);
+
+ if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+ zend_object *object = Z_OBJ(execute_data->This);
+#if 0
+ if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) {
+#else
+ if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) {
+#endif
+ GC_DELREF(object);
+ zend_object_store_ctor_failed(object);
+ }
+ OBJ_RELEASE(object);
+ } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
+ }
+
+ old_execute_data = execute_data;
+ execute_data = EX(prev_execute_data);
+ zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_rethrow_exception(execute_data);
+ HANDLE_EXCEPTION_LEAVE();
+ }
+
+ LOAD_NEXT_OPLINE();
+ ZEND_VM_LEAVE();
+ } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
+ zend_detach_symbol_table(execute_data);
+ destroy_op_array(&EX(func)->op_array);
+ efree_size(EX(func), sizeof(zend_op_array));
+ old_execute_data = execute_data;
+ execute_data = EG(current_execute_data) = EX(prev_execute_data);
+ zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
+
+ zend_attach_symbol_table(execute_data);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ zend_rethrow_exception(execute_data);
+ HANDLE_EXCEPTION_LEAVE();
+ }
+
+ LOAD_NEXT_OPLINE();
+ ZEND_VM_LEAVE();
+ } else {
+ if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
+ i_free_compiled_variables(execute_data);
+ if (UNEXPECTED(call_info & (ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS))) {
+ if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+ zend_clean_and_cache_symbol_table(EX(symbol_table));
+ }
+ zend_vm_stack_free_extra_args_ex(call_info, execute_data);
+ }
+ EG(current_execute_data) = EX(prev_execute_data);
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
+ OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
+ }
+ ZEND_VM_RETURN();
+ } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
+ zend_array *symbol_table = EX(symbol_table);
+
+ zend_detach_symbol_table(execute_data);
+ old_execute_data = EX(prev_execute_data);
+ while (old_execute_data) {
+ if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+ if (old_execute_data->symbol_table == symbol_table) {
+ zend_attach_symbol_table(old_execute_data);
+ }
+ break;
+ }
+ old_execute_data = old_execute_data->prev_execute_data;
+ }
+ EG(current_execute_data) = EX(prev_execute_data);
+ ZEND_VM_RETURN();
+ }
+ }
+}
+
HYBRID_CASE(ZEND_JMP_SPEC):
+ VM_TRACE(ZEND_JMP_SPEC)
ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_ICALL_SPEC_RETVAL_UNUSED):
+ VM_TRACE(ZEND_DO_ICALL_SPEC_RETVAL_UNUSED)
ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_ICALL_SPEC_RETVAL_USED):
+ VM_TRACE(ZEND_DO_ICALL_SPEC_RETVAL_USED)
ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED):
+ VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED)
ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_UCALL_SPEC_RETVAL_USED):
+ VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_USED)
ZEND_DO_UCALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED):
+ VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED)
ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED):
+ VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED)
ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED):
+ VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED)
ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DO_FCALL_SPEC_RETVAL_USED):
+ VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_USED)
ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GENERATOR_CREATE_SPEC):
+ VM_TRACE(ZEND_GENERATOR_CREATE_SPEC)
ZEND_GENERATOR_CREATE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_UNPACK_SPEC):
+ VM_TRACE(ZEND_SEND_UNPACK_SPEC)
ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_ARRAY_SPEC):
+ VM_TRACE(ZEND_SEND_ARRAY_SPEC)
ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_RECV_SPEC):
- ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_RECV_VARIADIC_SPEC):
- ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_BEGIN_SILENCE_SPEC):
+ VM_TRACE(ZEND_BEGIN_SILENCE_SPEC)
ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXT_STMT_SPEC):
+ VM_TRACE(ZEND_EXT_STMT_SPEC)
ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXT_FCALL_BEGIN_SPEC):
+ VM_TRACE(ZEND_EXT_FCALL_BEGIN_SPEC)
ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXT_FCALL_END_SPEC):
+ VM_TRACE(ZEND_EXT_FCALL_END_SPEC)
ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_DECLARE_CLASS_SPEC):
- ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_DECLARE_ANON_CLASS_SPEC):
+ VM_TRACE(ZEND_DECLARE_ANON_CLASS_SPEC)
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DECLARE_FUNCTION_SPEC):
+ VM_TRACE(ZEND_DECLARE_FUNCTION_SPEC)
ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_TICKS_SPEC):
+ VM_TRACE(ZEND_TICKS_SPEC)
ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXT_NOP_SPEC):
+ VM_TRACE(ZEND_EXT_NOP_SPEC)
ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_NOP_SPEC):
+ VM_TRACE(ZEND_NOP_SPEC)
ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_TRAIT_SPEC):
+ VM_TRACE(ZEND_ADD_TRAIT_SPEC)
ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BIND_TRAITS_SPEC):
+ VM_TRACE(ZEND_BIND_TRAITS_SPEC)
ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_HANDLE_EXCEPTION_SPEC):
+ VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC)
ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_VERIFY_ABSTRACT_CLASS_SPEC):
+ VM_TRACE(ZEND_VERIFY_ABSTRACT_CLASS_SPEC)
ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_USER_OPCODE_SPEC):
+ VM_TRACE(ZEND_USER_OPCODE_SPEC)
ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DISCARD_EXCEPTION_SPEC):
+ VM_TRACE(ZEND_DISCARD_EXCEPTION_SPEC)
ZEND_DISCARD_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CALL_SPEC):
+ VM_TRACE(ZEND_FAST_CALL_SPEC)
ZEND_FAST_CALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_RET_SPEC):
+ VM_TRACE(ZEND_FAST_RET_SPEC)
ZEND_FAST_RET_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSERT_CHECK_SPEC):
+ VM_TRACE(ZEND_ASSERT_CHECK_SPEC)
ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_NAME_SPEC):
- ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_CALL_TRAMPOLINE_SPEC):
+ VM_TRACE(ZEND_CALL_TRAMPOLINE_SPEC)
ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_CONST):
- ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_JMP_FORWARD_SPEC):
+ VM_TRACE(ZEND_JMP_FORWARD_SPEC)
+ ZEND_JMP_FORWARD_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_FCALL_BY_NAME_SPEC_CONST):
+ VM_TRACE(ZEND_INIT_FCALL_BY_NAME_SPEC_CONST)
ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_CONST):
+ VM_TRACE(ZEND_INIT_DYNAMIC_CALL_SPEC_CONST)
ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST):
+ VM_TRACE(ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST)
ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_FCALL_SPEC_CONST):
+ VM_TRACE(ZEND_INIT_FCALL_SPEC_CONST)
ZEND_INIT_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_RECV_INIT_SPEC_CONST):
+ VM_TRACE(ZEND_RECV_INIT_SPEC_CONST)
ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_INTERFACE_SPEC_CONST):
+ VM_TRACE(ZEND_ADD_INTERFACE_SPEC_CONST)
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_DECLARE_INHERITED_CLASS_SPEC_VAR):
- ZEND_DECLARE_INHERITED_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_VAR):
- ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR):
- ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR):
+ VM_TRACE(ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR)
+ ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED):
- ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_RECV_SPEC_UNUSED):
+ VM_TRACE(ZEND_RECV_SPEC_UNUSED)
+ ZEND_RECV_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_CV):
- ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_RECV_VARIADIC_SPEC_UNUSED):
+ VM_TRACE(ZEND_RECV_VARIADIC_SPEC_UNUSED)
+ ZEND_RECV_VARIADIC_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_CV):
+ VM_TRACE(ZEND_INIT_DYNAMIC_CALL_SPEC_CV)
ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_TMPVAR):
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR):
- ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_NOT_SPEC_CONST):
+ VM_TRACE(ZEND_BW_NOT_SPEC_CONST)
ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_NOT_SPEC_CONST):
+ VM_TRACE(ZEND_BOOL_NOT_SPEC_CONST)
ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ECHO_SPEC_CONST):
+ VM_TRACE(ZEND_ECHO_SPEC_CONST)
ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZ_SPEC_CONST):
+ VM_TRACE(ZEND_JMPZ_SPEC_CONST)
ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPNZ_SPEC_CONST):
+ VM_TRACE(ZEND_JMPNZ_SPEC_CONST)
ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZNZ_SPEC_CONST):
+ VM_TRACE(ZEND_JMPZNZ_SPEC_CONST)
ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CONST):
+ VM_TRACE(ZEND_JMPZ_EX_SPEC_CONST)
ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPNZ_EX_SPEC_CONST):
+ VM_TRACE(ZEND_JMPNZ_EX_SPEC_CONST)
ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_RETURN_SPEC_CONST):
- ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
+ VM_TRACE(ZEND_RETURN_SPEC_CONST)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zval *return_value;
+ zend_free_op free_op1;
+
+ retval_ptr = RT_CONSTANT(opline, opline->op1);
+ return_value = EX(return_value);
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ if (return_value) {
+ ZVAL_NULL(return_value);
+ }
+ } else if (!return_value) {
+ if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ rc_dtor_func(Z_COUNTED_P(free_op1));
+ }
+ }
+ } else {
+ if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (IS_CONST == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+ Z_ADDREF_P(return_value);
+ }
+ }
+ } else if (IS_CONST == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ ZVAL_NULL(retval_ptr);
+ } else {
+ Z_ADDREF_P(return_value);
+ }
+ } else {
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY(return_value, retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ } else /* if (IS_CONST == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ }
+ }
+ goto zend_leave_helper_SPEC_LABEL;
+}
+
HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_CONST):
+ VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CONST)
ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CONST):
+ VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CONST)
ZEND_GENERATOR_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_THROW_SPEC_CONST):
+ VM_TRACE(ZEND_THROW_SPEC_CONST)
ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CATCH_SPEC_CONST):
+ VM_TRACE(ZEND_CATCH_SPEC_CONST)
+ ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAL_SPEC_CONST):
+ VM_TRACE(ZEND_SEND_VAL_SPEC_CONST)
ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAL_EX_SPEC_CONST):
+ VM_TRACE(ZEND_SEND_VAL_EX_SPEC_CONST)
ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAL_EX_SPEC_CONST_QUICK):
+ VM_TRACE(ZEND_SEND_VAL_EX_SPEC_CONST_QUICK)
ZEND_SEND_VAL_EX_SPEC_CONST_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_USER_SPEC_CONST):
+ VM_TRACE(ZEND_SEND_USER_SPEC_CONST)
ZEND_SEND_USER_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_SPEC_CONST):
+ VM_TRACE(ZEND_BOOL_SPEC_CONST)
ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_NEW_SPEC_CONST):
- ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_CLONE_SPEC_CONST):
+ VM_TRACE(ZEND_CLONE_SPEC_CONST)
ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CAST_SPEC_CONST):
+ VM_TRACE(ZEND_CAST_SPEC_CONST)
ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_CONST):
+ VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CONST)
ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_R_SPEC_CONST):
+ VM_TRACE(ZEND_FE_RESET_R_SPEC_CONST)
ZEND_FE_RESET_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_RW_SPEC_CONST):
+ VM_TRACE(ZEND_FE_RESET_RW_SPEC_CONST)
ZEND_FE_RESET_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXIT_SPEC_CONST):
+ VM_TRACE(ZEND_EXIT_SPEC_CONST)
ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMP_SET_SPEC_CONST):
+ VM_TRACE(ZEND_JMP_SET_SPEC_CONST)
ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COALESCE_SPEC_CONST):
+ VM_TRACE(ZEND_COALESCE_SPEC_CONST)
ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_CONST):
+ VM_TRACE(ZEND_QM_ASSIGN_SPEC_CONST)
ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DECLARE_CLASS_SPEC_CONST):
+ VM_TRACE(ZEND_DECLARE_CLASS_SPEC_CONST)
+ ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_FROM_SPEC_CONST):
+ VM_TRACE(ZEND_YIELD_FROM_SPEC_CONST)
ZEND_YIELD_FROM_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_STRLEN_SPEC_CONST):
+ VM_TRACE(ZEND_STRLEN_SPEC_CONST)
ZEND_STRLEN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_CONST):
+ VM_TRACE(ZEND_TYPE_CHECK_SPEC_CONST)
ZEND_TYPE_CHECK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DEFINED_SPEC_CONST):
+ VM_TRACE(ZEND_DEFINED_SPEC_CONST)
ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST):
+ VM_TRACE(ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST)
ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_NOREF_SPEC_CONST):
+ VM_TRACE(ZEND_QM_ASSIGN_NOREF_SPEC_CONST)
ZEND_QM_ASSIGN_NOREF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SEND_VAL_SIMPLE_SPEC_CONST):
+ VM_TRACE(ZEND_SEND_VAL_SIMPLE_SPEC_CONST)
+ ZEND_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST):
+ VM_TRACE(ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST)
+ ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ADD_SPEC_CONST_CONST)
ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SUB_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SUB_SPEC_CONST_CONST)
ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MUL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_MUL_SPEC_CONST_CONST)
ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DIV_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DIV_SPEC_CONST_CONST)
ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MOD_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_MOD_SPEC_CONST_CONST)
ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SL_SPEC_CONST_CONST)
ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SR_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SR_SPEC_CONST_CONST)
ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POW_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_POW_SPEC_CONST_CONST)
ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_CONST_CONST):
- ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_CONST_CONST)
ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST)
ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CONST_CONST)
ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST)
ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_CONST)
ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST)
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SPACESHIP_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CONST_CONST)
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_OR_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_BW_OR_SPEC_CONST_CONST)
ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_AND_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_BW_AND_SPEC_CONST_CONST)
ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_XOR_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_BW_XOR_SPEC_CONST_CONST)
ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CONST_CONST):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST)
ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST)
ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CONST_CONST)
ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CONST_CONST)
ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CONST_CONST)
ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST)
ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_CONST):
- ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_CONST):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST)
ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_USER_CALL_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_INIT_USER_CALL_SPEC_CONST_CONST)
ZEND_INIT_USER_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CONST_CONST):
- ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST)
ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CONST_CONST)
ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST)
ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST)
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST)
+ ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST)
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST)
+ ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_DECLARE_CONST_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DECLARE_CONST_SPEC_CONST_CONST)
ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_YIELD_SPEC_CONST_CONST)
ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SWITCH_LONG_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SWITCH_LONG_SPEC_CONST_CONST)
ZEND_SWITCH_LONG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SWITCH_STRING_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_SWITCH_STRING_SPEC_CONST_CONST)
ZEND_SWITCH_STRING_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IN_ARRAY_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_IN_ARRAY_SPEC_CONST_CONST)
ZEND_IN_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CONST):
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV)
+ ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_LONG_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SUB_LONG_SPEC_CONST_TMPVARCV)
+ ZEND_SUB_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV)
+ ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CONST_TMP):
- ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP):
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_YIELD_SPEC_CONST_TMP):
- ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV)
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_ADD_SPEC_CONST_TMPVAR)
+ ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_SUB_SPEC_CONST_TMPVAR)
+ ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DIV_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_DIV_SPEC_CONST_TMPVAR)
+ ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_MOD_SPEC_CONST_TMPVAR)
+ ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_SL_SPEC_CONST_TMPVAR)
+ ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_SR_SPEC_CONST_TMPVAR)
+ ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POW_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_POW_SPEC_CONST_TMPVAR)
+ ZEND_POW_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CONCAT_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_CONCAT_SPEC_CONST_TMPVAR)
+ ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_TMPVAR)
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SPACESHIP_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CONST_TMPVAR)
+ ZEND_SPACESHIP_SPEC_CONST_TMPVAR_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CONST_VAR):
- ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR):
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR)
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR)
+ ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR)
+ ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR)
+ ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR)
+ ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR)
+ ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR)
+ ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR)
+ ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_YIELD_SPEC_CONST_TMP):
+ VM_TRACE(ZEND_YIELD_SPEC_CONST_TMP)
+ ZEND_YIELD_SPEC_CONST_TMP_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR)
ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CONST_VAR):
+ VM_TRACE(ZEND_YIELD_SPEC_CONST_VAR)
ZEND_YIELD_SPEC_CONST_VAR_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_W_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_W_SPEC_CONST_UNUSED)
ZEND_FETCH_W_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_RW_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_RW_SPEC_CONST_UNUSED)
ZEND_FETCH_RW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED)
ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_UNSET_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_UNSET_SPEC_CONST_UNUSED)
ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_IS_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_IS_SPEC_CONST_UNUSED)
ZEND_FETCH_IS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED)
ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED)
ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_NEW_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_NEW_SPEC_CONST_UNUSED)
+ ZEND_NEW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CONST_UNUSED)
ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_VAR_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_UNSET_VAR_SPEC_CONST_UNUSED)
ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED)
ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED)
ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED)
ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_YIELD_SPEC_CONST_UNUSED)
ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COUNT_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_COUNT_SPEC_CONST_UNUSED)
ZEND_COUNT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CLASS_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_CONST_UNUSED)
ZEND_GET_CLASS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_TYPE_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_GET_TYPE_SPEC_CONST_UNUSED)
ZEND_GET_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED):
+ VM_TRACE(ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED)
ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_SPEC_CONST_CV):
+ VM_TRACE(ZEND_ADD_SPEC_CONST_CV)
ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SUB_SPEC_CONST_CV):
+ VM_TRACE(ZEND_SUB_SPEC_CONST_CV)
ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_CONST_CV):
- ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_DIV_SPEC_CONST_CV):
+ VM_TRACE(ZEND_DIV_SPEC_CONST_CV)
ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MOD_SPEC_CONST_CV):
+ VM_TRACE(ZEND_MOD_SPEC_CONST_CV)
ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SL_SPEC_CONST_CV):
+ VM_TRACE(ZEND_SL_SPEC_CONST_CV)
ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SR_SPEC_CONST_CV):
+ VM_TRACE(ZEND_SR_SPEC_CONST_CV)
ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POW_SPEC_CONST_CV):
+ VM_TRACE(ZEND_POW_SPEC_CONST_CV)
ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CONCAT_SPEC_CONST_CV):
+ VM_TRACE(ZEND_CONCAT_SPEC_CONST_CV)
ZEND_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CONST_CV):
- ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV):
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CONST_CV):
- ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CONST_CV):
- ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_CV):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_CV)
ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV)
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SPACESHIP_SPEC_CONST_CV):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CONST_CV)
ZEND_SPACESHIP_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_CONST_CV):
- ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_CONST_CV):
- ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_CONST_CV):
- ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CONST_CV):
- ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CONST_CV)
ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CONST_CV)
ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CONST_CV)
ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CONST_CV)
ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_CV):
- ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FETCH_LIST_R_SPEC_CONST_CV)
+ ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CV):
+ VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CV)
ZEND_FAST_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CONST_CV):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CONST_CV)
ZEND_INIT_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_USER_CALL_SPEC_CONST_CV):
+ VM_TRACE(ZEND_INIT_USER_CALL_SPEC_CONST_CV)
ZEND_INIT_USER_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CATCH_SPEC_CONST_CV):
- ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CONST_CV):
- ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CONST_CV):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CONST_CV)
ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV)
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CONST_CV):
+ VM_TRACE(ZEND_YIELD_SPEC_CONST_CV)
ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CV):
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV):
+ VM_TRACE(ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV)
+ ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_SPEC_CONST_TMPVAR):
- ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV):
+ VM_TRACE(ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV)
+ ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_SPEC_CONST_TMPVAR):
- ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST)
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_CONST_TMPVAR):
- ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_DIV_SPEC_CONST_TMPVAR):
- ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST)
+ ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MOD_SPEC_CONST_TMPVAR):
- ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST)
+ ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SL_SPEC_CONST_TMPVAR):
- ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_ADD_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SR_SPEC_CONST_TMPVAR):
- ZEND_SR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_POW_SPEC_CONST_TMPVAR):
- ZEND_POW_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST)
+ ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_CONST_TMPVAR):
- ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SUB_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_SUB_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CONST_TMPVAR):
- ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR):
- ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST)
+ ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_TMPVAR):
- ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_MUL_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR):
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SPACESHIP_SPEC_CONST_TMPVAR):
- ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_CONST_TMPVAR):
- ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_CONST_TMPVAR):
- ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_CONST_TMPVAR):
- ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CONST_TMPVAR):
- ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR):
- ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR):
- ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR):
- ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR):
- ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR):
- ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR):
- ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CONST_TMPVAR):
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR):
- ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR):
- ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR):
- ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR):
- ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CONST_TMPVAR):
- ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR):
- ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR):
- ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR):
- ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR):
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV):
- ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_LONG_SPEC_CONST_TMPVARCV):
- ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV):
- ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_SPEC_CONST_TMPVARCV):
- ZEND_SUB_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV):
- ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_LONG_SPEC_CONST_TMPVARCV):
- ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV):
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV):
- ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_RETURN_SPEC_TMP):
- ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR)
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV):
+ VM_TRACE(ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV)
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_NOT_SPEC_TMPVAR):
+ VM_TRACE(ZEND_BW_NOT_SPEC_TMPVAR)
+ ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BOOL_NOT_SPEC_TMPVAR):
+ VM_TRACE(ZEND_BOOL_NOT_SPEC_TMPVAR)
+ ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ECHO_SPEC_TMPVAR):
+ VM_TRACE(ZEND_ECHO_SPEC_TMPVAR)
+ ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_JMPZ_SPEC_TMPVAR):
+ VM_TRACE(ZEND_JMPZ_SPEC_TMPVAR)
+ ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_JMPNZ_SPEC_TMPVAR):
+ VM_TRACE(ZEND_JMPNZ_SPEC_TMPVAR)
+ ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_JMPZNZ_SPEC_TMPVAR):
+ VM_TRACE(ZEND_JMPZNZ_SPEC_TMPVAR)
+ ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_JMPZ_EX_SPEC_TMPVAR):
+ VM_TRACE(ZEND_JMPZ_EX_SPEC_TMPVAR)
+ ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_JMPNZ_EX_SPEC_TMPVAR):
+ VM_TRACE(ZEND_JMPNZ_EX_SPEC_TMPVAR)
+ ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FREE_SPEC_TMPVAR):
+ VM_TRACE(ZEND_FREE_SPEC_TMPVAR)
+ ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FE_FREE_SPEC_TMPVAR):
+ VM_TRACE(ZEND_FE_FREE_SPEC_TMPVAR)
+ ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SEND_VAL_SPEC_TMPVAR):
+ VM_TRACE(ZEND_SEND_VAL_SPEC_TMPVAR)
+ ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BOOL_SPEC_TMPVAR):
+ VM_TRACE(ZEND_BOOL_SPEC_TMPVAR)
+ ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CLONE_SPEC_TMPVAR):
+ VM_TRACE(ZEND_CLONE_SPEC_TMPVAR)
+ ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR):
+ VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR)
+ ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_EXIT_SPEC_TMPVAR):
+ VM_TRACE(ZEND_EXIT_SPEC_TMPVAR)
+ ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_COALESCE_SPEC_TMPVAR):
+ VM_TRACE(ZEND_COALESCE_SPEC_TMPVAR)
+ ZEND_COALESCE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_STRLEN_SPEC_TMPVAR):
+ VM_TRACE(ZEND_STRLEN_SPEC_TMPVAR)
+ ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_TMPVAR):
+ VM_TRACE(ZEND_TYPE_CHECK_SPEC_TMPVAR)
+ ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_ADD_SPEC_TMPVAR_CONST)
+ ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_SUB_SPEC_TMPVAR_CONST)
+ ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MUL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_MUL_SPEC_TMPVAR_CONST)
+ ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_DIV_SPEC_TMPVAR_CONST)
+ ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_MOD_SPEC_TMPVAR_CONST)
+ ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_SL_SPEC_TMPVAR_CONST)
+ ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_SR_SPEC_TMPVAR_CONST)
+ ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_POW_SPEC_TMPVAR_CONST)
+ ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_CONCAT_SPEC_TMPVAR_CONST)
+ ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVAR_CONST)
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_TMPVAR_CONST)
+ ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_BW_OR_SPEC_TMPVAR_CONST)
+ ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_BW_AND_SPEC_TMPVAR_CONST)
+ ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_BW_XOR_SPEC_TMPVAR_CONST)
+ ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BOOL_XOR_SPEC_TMPVAR_CONST):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST)
+ ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_CASE_SPEC_TMPVAR_CONST)
+ ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST)
+ ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST)
+ ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST)
+ ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_CONST)
+ ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST)
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV):
+ VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV)
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_ADD_SPEC_TMPVAR_TMPVAR)
+ ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_SUB_SPEC_TMPVAR_TMPVAR)
+ ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MUL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_MUL_SPEC_TMPVAR_TMPVAR)
+ ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_DIV_SPEC_TMPVAR_TMPVAR)
+ ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_MOD_SPEC_TMPVAR_TMPVAR)
+ ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_SL_SPEC_TMPVAR_TMPVAR)
+ ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_SR_SPEC_TMPVAR_TMPVAR)
+ ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_POW_SPEC_TMPVAR_TMPVAR)
+ ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_CONCAT_SPEC_TMPVAR_TMPVAR)
+ ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR)
+ ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR)
+ ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_BW_OR_SPEC_TMPVAR_TMPVAR)
+ ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_BW_AND_SPEC_TMPVAR_TMPVAR)
+ ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR)
+ ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR)
+ ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR)
+ ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR)
+ ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR)
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR)
+ ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR)
+ ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR)
+ ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_CASE_SPEC_TMPVAR_TMPVAR)
+ ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR)
+ ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR)
+ ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR)
+ ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR)
+ ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR)
+ ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR)
+ ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR)
+ ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_W_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_W_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED)
+ ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED)
+ ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED)
+ ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED)
+ ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED)
+ ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_ADD_SPEC_TMPVAR_CV)
+ ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_SUB_SPEC_TMPVAR_CV)
+ ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_DIV_SPEC_TMPVAR_CV)
+ ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_MOD_SPEC_TMPVAR_CV)
+ ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_SL_SPEC_TMPVAR_CV)
+ ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_SR_SPEC_TMPVAR_CV)
+ ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_POW_SPEC_TMPVAR_CV)
+ ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_CONCAT_SPEC_TMPVAR_CV)
+ ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVAR_CV)
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_TMPVAR_CV)
+ ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV)
+ ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV)
+ ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV)
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV)
+ ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CV)
+ ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV)
+ ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_CASE_SPEC_TMPVAR_CV)
+ ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV)
+ ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_RETURN_SPEC_TMP):
+ VM_TRACE(ZEND_RETURN_SPEC_TMP)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zval *return_value;
+ zend_free_op free_op1;
+
+ retval_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ return_value = EX(return_value);
+ if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ if (return_value) {
+ ZVAL_NULL(return_value);
+ }
+ } else if (!return_value) {
+ if (IS_TMP_VAR & (IS_VAR|IS_TMP_VAR)) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ rc_dtor_func(Z_COUNTED_P(free_op1));
+ }
+ }
+ } else {
+ if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+ Z_ADDREF_P(return_value);
+ }
+ }
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ ZVAL_NULL(retval_ptr);
+ } else {
+ Z_ADDREF_P(return_value);
+ }
+ } else {
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY(return_value, retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ } else /* if (IS_TMP_VAR == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ }
+ }
+ goto zend_leave_helper_SPEC_LABEL;
+}
+
HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_TMP):
+ VM_TRACE(ZEND_RETURN_BY_REF_SPEC_TMP)
ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_TMP):
+ VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_TMP)
ZEND_GENERATOR_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_THROW_SPEC_TMP):
+ VM_TRACE(ZEND_THROW_SPEC_TMP)
ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAL_EX_SPEC_TMP):
+ VM_TRACE(ZEND_SEND_VAL_EX_SPEC_TMP)
ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAL_EX_SPEC_TMP_QUICK):
+ VM_TRACE(ZEND_SEND_VAL_EX_SPEC_TMP_QUICK)
ZEND_SEND_VAL_EX_SPEC_TMP_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_USER_SPEC_TMP):
+ VM_TRACE(ZEND_SEND_USER_SPEC_TMP)
ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CAST_SPEC_TMP):
+ VM_TRACE(ZEND_CAST_SPEC_TMP)
ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_R_SPEC_TMP):
+ VM_TRACE(ZEND_FE_RESET_R_SPEC_TMP)
ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_RW_SPEC_TMP):
+ VM_TRACE(ZEND_FE_RESET_RW_SPEC_TMP)
ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_END_SILENCE_SPEC_TMP):
+ VM_TRACE(ZEND_END_SILENCE_SPEC_TMP)
ZEND_END_SILENCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMP_SET_SPEC_TMP):
+ VM_TRACE(ZEND_JMP_SET_SPEC_TMP)
ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_COALESCE_SPEC_TMP):
- ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_TMP):
+ VM_TRACE(ZEND_QM_ASSIGN_SPEC_TMP)
ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_FROM_SPEC_TMP):
+ VM_TRACE(ZEND_YIELD_FROM_SPEC_TMP)
ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_TMP):
- ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_TMP_CONST)
ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST):
+ 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_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);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMP_CONST):
- ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_ADD_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_ROPE_ADD_SPEC_TMP_CONST)
ZEND_ROPE_ADD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_END_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_ROPE_END_SPEC_TMP_CONST)
ZEND_ROPE_END_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST)
ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_TMP_CONST)
ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_TMP_CONST):
+ VM_TRACE(ZEND_YIELD_SPEC_TMP_CONST)
ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IN_ARRAY_SPEC_TMP_CONST):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR)
+ ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ROPE_ADD_SPEC_TMP_TMPVAR):
+ VM_TRACE(ZEND_ROPE_ADD_SPEC_TMP_TMPVAR)
+ ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ROPE_END_SPEC_TMP_TMPVAR):
+ VM_TRACE(ZEND_ROPE_END_SPEC_TMP_TMPVAR)
+ ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR)
+ ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR)
+ ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_TMP_TMP):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_TMP_TMP)
ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP)
ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_TMP_TMP):
+ VM_TRACE(ZEND_YIELD_SPEC_TMP_TMP)
ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_TMP_VAR):
- ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR):
- ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_TMP_VAR):
+ VM_TRACE(ZEND_YIELD_SPEC_TMP_VAR)
ZEND_YIELD_SPEC_TMP_VAR_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED)
ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED)
ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_TMP_UNUSED)
ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_YIELD_SPEC_TMP_UNUSED)
ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COUNT_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_COUNT_SPEC_TMP_UNUSED)
ZEND_COUNT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CLASS_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_TMP_UNUSED)
ZEND_GET_CLASS_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_TYPE_SPEC_TMP_UNUSED):
+ VM_TRACE(ZEND_GET_TYPE_SPEC_TMP_UNUSED)
ZEND_GET_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_TMP_CV):
- ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV):
- ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMP_CV):
- ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_ADD_SPEC_TMP_CV):
+ VM_TRACE(ZEND_ROPE_ADD_SPEC_TMP_CV)
ZEND_ROPE_ADD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_END_SPEC_TMP_CV):
+ VM_TRACE(ZEND_ROPE_END_SPEC_TMP_CV)
ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV)
ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_TMP_CV):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_TMP_CV)
ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_TMP_CV):
+ VM_TRACE(ZEND_YIELD_SPEC_TMP_CV)
ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BIND_LEXICAL_SPEC_TMP_CV):
+ VM_TRACE(ZEND_BIND_LEXICAL_SPEC_TMP_CV)
ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR):
- ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR):
- ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR):
- ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ROPE_ADD_SPEC_TMP_TMPVAR):
- ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ROPE_END_SPEC_TMP_TMPVAR):
- ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR):
- ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR):
- ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED)
ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_SPEC_VAR_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_INC_SPEC_VAR_RETVAL_USED)
ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED)
ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED)
ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_SPEC_VAR):
+ VM_TRACE(ZEND_POST_INC_SPEC_VAR)
ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_SPEC_VAR):
+ VM_TRACE(ZEND_POST_DEC_SPEC_VAR)
ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_RETURN_SPEC_VAR):
- ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
+ VM_TRACE(ZEND_RETURN_SPEC_VAR)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zval *return_value;
+ zend_free_op free_op1;
+
+ retval_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ return_value = EX(return_value);
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ if (return_value) {
+ ZVAL_NULL(return_value);
+ }
+ } else if (!return_value) {
+ if (IS_VAR & (IS_VAR|IS_TMP_VAR)) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ rc_dtor_func(Z_COUNTED_P(free_op1));
+ }
+ }
+ } else {
+ if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+ Z_ADDREF_P(return_value);
+ }
+ }
+ } else if (IS_VAR == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ ZVAL_NULL(retval_ptr);
+ } else {
+ Z_ADDREF_P(return_value);
+ }
+ } else {
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY(return_value, retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ } else /* if (IS_VAR == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ }
+ }
+ goto zend_leave_helper_SPEC_LABEL;
+}
+
HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_VAR):
+ VM_TRACE(ZEND_RETURN_BY_REF_SPEC_VAR)
ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_VAR):
+ VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_VAR)
ZEND_GENERATOR_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_THROW_SPEC_VAR):
+ VM_TRACE(ZEND_THROW_SPEC_VAR)
ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_SPEC_VAR)
ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_NO_REF_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_NO_REF_SPEC_VAR)
ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR)
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK):
+ VM_TRACE(ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK)
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_REF_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_REF_SPEC_VAR)
ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_EX_SPEC_VAR)
ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SPEC_VAR_QUICK):
+ VM_TRACE(ZEND_SEND_VAR_EX_SPEC_VAR_QUICK)
ZEND_SEND_VAR_EX_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SEND_FUNC_ARG_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_FUNC_ARG_SPEC_VAR)
+ ZEND_SEND_FUNC_ARG_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_USER_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_USER_SPEC_VAR)
ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_NEW_SPEC_VAR):
- ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_CAST_SPEC_VAR):
+ VM_TRACE(ZEND_CAST_SPEC_VAR)
ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_R_SPEC_VAR):
+ VM_TRACE(ZEND_FE_RESET_R_SPEC_VAR)
ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_RW_SPEC_VAR):
+ VM_TRACE(ZEND_FE_RESET_RW_SPEC_VAR)
ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_FETCH_R_SPEC_VAR):
+ VM_TRACE(ZEND_FE_FETCH_R_SPEC_VAR)
ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_FETCH_RW_SPEC_VAR):
+ VM_TRACE(ZEND_FE_FETCH_RW_SPEC_VAR)
ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMP_SET_SPEC_VAR):
+ VM_TRACE(ZEND_JMP_SET_SPEC_VAR)
ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_COALESCE_SPEC_VAR):
- ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_VAR):
+ VM_TRACE(ZEND_QM_ASSIGN_SPEC_VAR)
ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_FROM_SPEC_VAR):
+ VM_TRACE(ZEND_YIELD_FROM_SPEC_VAR)
ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_VAR):
- ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_SIMPLE_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_SIMPLE_SPEC_VAR)
ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR):
+ VM_TRACE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR)
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK):
- ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_VAR_CONST)
ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST)
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST)
ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ):
+ 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_SUB_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST)
ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ):
+ 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_MUL_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST)
ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ):
+ 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_DIV_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST)
ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ):
+ 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_MOD_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST)
ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ):
+ 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_SL_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CONST)
ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ):
+ 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_SR_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CONST)
ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ):
+ 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_CONCAT_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST)
ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ):
+ 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_POW_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CONST)
ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM)
ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST)
ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_VAR_CONST)
ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_VAR_CONST)
ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_VAR_CONST)
ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_VAR_CONST)
ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST)
ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_VAR_CONST):
- ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_VAR_CONST)
ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST)
ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST)
ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_LIST_W_SPEC_VAR_CONST)
+ ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST)
ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST)
ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST)
ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_VAR_CONST)
ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_DIM_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_VAR_CONST)
ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_VAR_CONST)
ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_YIELD_SPEC_VAR_CONST)
ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IN_ARRAY_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_IN_ARRAY_SPEC_VAR_CONST)
ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ):
+ 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_SUB_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ):
+ 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_MUL_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ):
+ 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_DIV_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ):
+ 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_MOD_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ):
+ 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_SL_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ):
+ 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_SR_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ):
+ 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_CONCAT_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ):
+ 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_POW_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM)
+ ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR)
+ ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR)
+ ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR)
+ ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR)
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST)
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP)
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST)
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP)
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR)
+ ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR)
+ ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_DIM_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_VAR_TMPVAR)
+ ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR)
+ ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_VAR_TMP):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_VAR_TMP)
ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP)
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED)
ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_VAR_TMP):
+ VM_TRACE(ZEND_YIELD_SPEC_VAR_TMP)
ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_VAR_VAR):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_VAR_VAR)
ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR)
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED)
ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_REF_SPEC_VAR_VAR):
+ VM_TRACE(ZEND_ASSIGN_REF_SPEC_VAR_VAR)
ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_VAR_VAR):
+ VM_TRACE(ZEND_YIELD_SPEC_VAR_VAR)
ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM):
+ 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_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_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_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_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_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_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_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_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_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_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_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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED)
ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST)
ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED)
ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_NEW_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_NEW_SPEC_VAR_UNUSED)
+ ZEND_NEW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED)
ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_VAR_UNUSED)
ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEPARATE_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_SEPARATE_SPEC_VAR_UNUSED)
ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_YIELD_SPEC_VAR_UNUSED)
ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MAKE_REF_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_MAKE_REF_SPEC_VAR_UNUSED)
ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COUNT_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_COUNT_SPEC_VAR_UNUSED)
ZEND_COUNT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CLASS_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_VAR_UNUSED)
ZEND_GET_CLASS_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_TYPE_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_GET_TYPE_SPEC_VAR_UNUSED)
ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_VAR_CV):
- ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV):
- ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CV)
ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CV)
ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CV)
ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CV)
ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CV)
ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CV)
ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CV)
ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV)
ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV)
ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV)
ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV)
ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CV)
ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM)
ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ)
ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_VAR_CV):
+ VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_VAR_CV)
ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_VAR_CV):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_VAR_CV)
ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_VAR_CV):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_VAR_CV)
ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_VAR_CV):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_VAR_CV)
ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_VAR_CV)
ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_VAR_CV)
ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV)
ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_VAR_CV):
- ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_VAR_CV)
ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_VAR_CV)
ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV)
ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_LIST_W_SPEC_VAR_CV):
+ VM_TRACE(ZEND_FETCH_LIST_W_SPEC_VAR_CV)
+ ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST)
ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED)
ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_REF_SPEC_VAR_CV):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV)
ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_VAR_CV):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_VAR_CV)
ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_DIM_SPEC_VAR_CV):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_VAR_CV)
ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_VAR_CV):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_VAR_CV)
ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_VAR_CV):
+ VM_TRACE(ZEND_YIELD_SPEC_VAR_CV)
ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED)
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED):
+ VM_TRACE(ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED)
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_CHECK_FUNC_ARG_SPEC_UNUSED):
+ VM_TRACE(ZEND_CHECK_FUNC_ARG_SPEC_UNUSED)
+ ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SUB_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_MUL_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_DIV_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_MOD_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SL_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SR_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_CONCAT_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_BW_OR_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_AND_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_XOR_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_POW_SPEC_VAR_TMPVAR):
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM):
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_PRE_INC_OBJ_SPEC_VAR_TMPVAR):
- ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR):
- ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR):
- ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR):
- ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR):
- ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR):
- ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR):
- ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR):
- ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR):
- ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR):
- ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR):
- ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR):
- ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR):
- ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST):
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP):
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR):
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV):
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST):
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP):
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR):
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR):
- ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR):
- ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR):
- ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_DIM_SPEC_VAR_TMPVAR):
- ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR):
- ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_NEW_SPEC_UNUSED):
- ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK):
+ VM_TRACE(ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK)
+ ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CLONE_SPEC_UNUSED):
+ VM_TRACE(ZEND_CLONE_SPEC_UNUSED)
ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXIT_SPEC_UNUSED):
+ VM_TRACE(ZEND_EXIT_SPEC_UNUSED)
ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_NAME_SPEC_UNUSED):
+ VM_TRACE(ZEND_FETCH_CLASS_NAME_SPEC_UNUSED)
+ ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ)
ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST)
ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST)
ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST)
ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST)
ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST)
ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV):
+ 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_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);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_CLASS_SPEC_UNUSED_CONST)
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST)
ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST)
ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST)
ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_UNUSED_CONST)
ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_YIELD_SPEC_UNUSED_CONST)
ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ)
+ ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST)
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP)
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR)
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR)
+ ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR)
+ ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_TMP):
+ VM_TRACE(ZEND_YIELD_SPEC_UNUSED_TMP)
ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_VAR):
+ VM_TRACE(ZEND_YIELD_SPEC_UNUSED_VAR)
ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED)
+ ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED)
ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_NEW_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_NEW_SPEC_UNUSED_UNUSED)
+ ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_YIELD_SPEC_UNUSED_UNUSED)
ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED)
ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED)
ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CLASS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_UNUSED_UNUSED)
ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED)
ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED)
ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED)
ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ)
ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV)
ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV)
ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_UNUSED_CV)
ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV)
ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV)
ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV):
+ 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_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);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_FETCH_CLASS_SPEC_UNUSED_CV)
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV)
ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_UNUSED_CV)
ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_YIELD_SPEC_UNUSED_CV)
ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ):
- ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR):
- ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST):
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP):
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR):
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_ROPE_INIT_SPEC_UNUSED_TMPVAR):
- ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR):
- ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR):
- ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_NOT_SPEC_CV):
+ VM_TRACE(ZEND_BW_NOT_SPEC_CV)
ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_NOT_SPEC_CV):
+ VM_TRACE(ZEND_BOOL_NOT_SPEC_CV)
ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_INC_SPEC_CV_RETVAL_USED)
ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_DEC_SPEC_CV_RETVAL_USED)
ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_SPEC_CV):
+ VM_TRACE(ZEND_POST_INC_SPEC_CV)
ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_SPEC_CV):
+ VM_TRACE(ZEND_POST_DEC_SPEC_CV)
ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ECHO_SPEC_CV):
+ VM_TRACE(ZEND_ECHO_SPEC_CV)
ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZ_SPEC_CV):
+ VM_TRACE(ZEND_JMPZ_SPEC_CV)
ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPNZ_SPEC_CV):
+ VM_TRACE(ZEND_JMPNZ_SPEC_CV)
ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZNZ_SPEC_CV):
+ VM_TRACE(ZEND_JMPZNZ_SPEC_CV)
ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CV):
+ VM_TRACE(ZEND_JMPZ_EX_SPEC_CV)
ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMPNZ_EX_SPEC_CV):
+ VM_TRACE(ZEND_JMPNZ_EX_SPEC_CV)
ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_RETURN_SPEC_CV):
- ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
+ VM_TRACE(ZEND_RETURN_SPEC_CV)
+{
+ USE_OPLINE
+ zval *retval_ptr;
+ zval *return_value;
+ zend_free_op free_op1;
+
+ retval_ptr = EX_VAR(opline->op1.var);
+ return_value = EX(return_value);
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ if (return_value) {
+ ZVAL_NULL(return_value);
+ }
+ } else if (!return_value) {
+ if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+ if (Z_REFCOUNTED_P(free_op1) && !Z_DELREF_P(free_op1)) {
+ SAVE_OPLINE();
+ rc_dtor_func(Z_COUNTED_P(free_op1));
+ }
+ }
+ } else {
+ if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (IS_CV == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+ Z_ADDREF_P(return_value);
+ }
+ }
+ } else if (IS_CV == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ ZVAL_NULL(retval_ptr);
+ } else {
+ Z_ADDREF_P(return_value);
+ }
+ } else {
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY(return_value, retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ } else /* if (IS_CV == IS_VAR) */ {
+ if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
+ } else {
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ }
+ }
+ }
+ goto zend_leave_helper_SPEC_LABEL;
+}
+
HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_CV):
+ VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CV)
ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CV):
+ VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CV)
ZEND_GENERATOR_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_THROW_SPEC_CV):
+ VM_TRACE(ZEND_THROW_SPEC_CV)
ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_SPEC_CV):
+ VM_TRACE(ZEND_SEND_VAR_SPEC_CV)
ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_REF_SPEC_CV):
+ VM_TRACE(ZEND_SEND_REF_SPEC_CV)
ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SPEC_CV):
+ VM_TRACE(ZEND_SEND_VAR_EX_SPEC_CV)
ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SPEC_CV_QUICK):
+ VM_TRACE(ZEND_SEND_VAR_EX_SPEC_CV_QUICK)
ZEND_SEND_VAR_EX_SPEC_CV_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_USER_SPEC_CV):
+ VM_TRACE(ZEND_SEND_USER_SPEC_CV)
ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_SPEC_CV):
+ VM_TRACE(ZEND_BOOL_SPEC_CV)
ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CLONE_SPEC_CV):
+ VM_TRACE(ZEND_CLONE_SPEC_CV)
ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CAST_SPEC_CV):
+ VM_TRACE(ZEND_CAST_SPEC_CV)
ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_CV):
+ VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CV)
ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_R_SPEC_CV):
+ VM_TRACE(ZEND_FE_RESET_R_SPEC_CV)
ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FE_RESET_RW_SPEC_CV):
+ VM_TRACE(ZEND_FE_RESET_RW_SPEC_CV)
ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_EXIT_SPEC_CV):
+ VM_TRACE(ZEND_EXIT_SPEC_CV)
ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMP_SET_SPEC_CV):
+ VM_TRACE(ZEND_JMP_SET_SPEC_CV)
ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COALESCE_SPEC_CV):
+ VM_TRACE(ZEND_COALESCE_SPEC_CV)
ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_CV):
+ VM_TRACE(ZEND_QM_ASSIGN_SPEC_CV)
ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_FROM_SPEC_CV):
+ VM_TRACE(ZEND_YIELD_FROM_SPEC_CV)
ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_STRLEN_SPEC_CV):
+ VM_TRACE(ZEND_STRLEN_SPEC_CV)
ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_TYPE_CHECK_SPEC_CV):
+ VM_TRACE(ZEND_TYPE_CHECK_SPEC_CV)
ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED)
ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED)
ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED)
ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED)
ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED)
ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED)
ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED):
+ VM_TRACE(ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED)
ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV):
+ VM_TRACE(ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV)
ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_LONG_SPEC_CV):
+ VM_TRACE(ZEND_POST_INC_LONG_SPEC_CV)
ZEND_POST_INC_LONG_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV):
+ VM_TRACE(ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV)
ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV):
+ VM_TRACE(ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV)
ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_LONG_SPEC_CV):
+ VM_TRACE(ZEND_POST_DEC_LONG_SPEC_CV)
ZEND_POST_DEC_LONG_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV):
+ VM_TRACE(ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV)
ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_SIMPLE_SPEC_CV):
+ VM_TRACE(ZEND_SEND_VAR_SIMPLE_SPEC_CV)
ZEND_SEND_VAR_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV):
+ VM_TRACE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV)
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK):
- ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ADD_SPEC_CV_CONST)
ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SUB_SPEC_CV_CONST):
+ VM_TRACE(ZEND_SUB_SPEC_CV_CONST)
ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MUL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_MUL_SPEC_CV_CONST)
ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DIV_SPEC_CV_CONST):
+ VM_TRACE(ZEND_DIV_SPEC_CV_CONST)
ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MOD_SPEC_CV_CONST):
+ VM_TRACE(ZEND_MOD_SPEC_CV_CONST)
ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_SL_SPEC_CV_CONST)
ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SR_SPEC_CV_CONST):
+ VM_TRACE(ZEND_SR_SPEC_CV_CONST)
ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POW_SPEC_CV_CONST):
+ VM_TRACE(ZEND_POW_SPEC_CV_CONST)
ZEND_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CONCAT_SPEC_CV_CONST):
+ VM_TRACE(ZEND_CONCAT_SPEC_CV_CONST)
ZEND_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_CV_CONST)
ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST)
ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CONST)
ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST)
ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CV_CONST)
ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST)
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SPACESHIP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CV_CONST)
ZEND_SPACESHIP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_OR_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BW_OR_SPEC_CV_CONST)
ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_AND_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BW_AND_SPEC_CV_CONST)
ZEND_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_XOR_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BW_XOR_SPEC_CV_CONST)
ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BOOL_XOR_SPEC_CV_CONST)
ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CONST)
ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ):
+ 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_SUB_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CONST)
ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ):
+ 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_MUL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CONST)
ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ):
+ 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_DIV_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CONST)
ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ):
+ 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_MOD_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CONST)
ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ):
+ 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_SL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CONST)
ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ):
+ 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_SR_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CONST)
ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ):
+ 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_CONCAT_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST)
ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ):
+ 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_POW_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CONST)
ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM)
ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_CV_CONST):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_CV_CONST)
ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_CV_CONST):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_CV_CONST)
ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_CV_CONST):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST)
ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST)
ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CV_CONST)
ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_CV_CONST)
ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_CV_CONST)
ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CV_CONST)
ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST)
ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CV_CONST)
ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_CV_CONST)
ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_CV_CONST)
ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CV_CONST)
ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST)
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_CONST):
- ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CV_CONST)
ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CV_CONST):
- ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CV_CONST):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CV_CONST)
ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST)
ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_DIM_SPEC_CV_CONST):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_CV_CONST)
ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_CV_CONST):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_CV_CONST)
ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST)
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INSTANCEOF_SPEC_CV_CONST):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_CV_CONST)
ZEND_INSTANCEOF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CV_CONST):
+ VM_TRACE(ZEND_YIELD_SPEC_CV_CONST)
ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BIND_GLOBAL_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BIND_GLOBAL_SPEC_CV_CONST)
ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BIND_STATIC_SPEC_CV_CONST):
+ VM_TRACE(ZEND_BIND_STATIC_SPEC_CV_CONST)
ZEND_BIND_STATIC_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_SWITCH_LONG_SPEC_CV_CONST):
- ZEND_SWITCH_LONG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SWITCH_STRING_SPEC_CV_CONST):
- ZEND_SWITCH_STRING_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_IN_ARRAY_SPEC_CV_CONST):
+ VM_TRACE(ZEND_IN_ARRAY_SPEC_CV_CONST)
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST):
+ VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST)
ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV):
+ VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV)
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ADD_SPEC_CV_TMPVAR)
+ ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_SUB_SPEC_CV_TMPVAR)
+ ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MUL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_MUL_SPEC_CV_TMPVAR)
+ ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DIV_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_DIV_SPEC_CV_TMPVAR)
+ ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_MOD_SPEC_CV_TMPVAR)
+ ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_SL_SPEC_CV_TMPVAR)
+ ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_SR_SPEC_CV_TMPVAR)
+ ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POW_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_POW_SPEC_CV_TMPVAR)
+ ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_CONCAT_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_CONCAT_SPEC_CV_TMPVAR)
+ ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR)
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CV_TMPVAR)
+ ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SPACESHIP_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CV_TMPVAR)
+ ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_OR_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_BW_OR_SPEC_CV_TMPVAR)
+ ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_AND_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_BW_AND_SPEC_CV_TMPVAR)
+ ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_XOR_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_BW_XOR_SPEC_CV_TMPVAR)
+ ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_BOOL_XOR_SPEC_CV_TMPVAR)
+ ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ):
+ 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_SUB_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ):
+ 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_MUL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ):
+ 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_DIV_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ):
+ 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_MOD_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ):
+ 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_SL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ):
+ 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_SR_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ):
+ 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_CONCAT_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ):
+ 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_POW_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM)
+ ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR)
+ ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR)
+ ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR)
+ ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR)
+ ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR)
+ ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST)
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP)
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST)
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP)
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV):
+ 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_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);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR)
+ ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR)
+ ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CV_TMPVAR)
+ ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_DIM_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_CV_TMPVAR)
+ ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_CV_TMPVAR)
+ ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR)
+ ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR)
+ ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CV_TMP):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_CV_TMP)
ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP)
ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED)
ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CV_TMP):
+ VM_TRACE(ZEND_YIELD_SPEC_CV_TMP)
ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CV_VAR):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_CV_VAR)
ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR)
ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED)
ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_REF_SPEC_CV_VAR):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INSTANCEOF_SPEC_CV_VAR):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_CV_VAR)
ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CV_VAR):
+ VM_TRACE(ZEND_YIELD_SPEC_CV_VAR)
ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM):
+ 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_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_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_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_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_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_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_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_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_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_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_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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_W_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_W_SPEC_CV_UNUSED)
ZEND_FETCH_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_RW_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_RW_SPEC_CV_UNUSED)
ZEND_FETCH_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED)
ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_UNSET_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_UNSET_SPEC_CV_UNUSED)
ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_IS_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_IS_SPEC_CV_UNUSED)
ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED)
ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_CV_UNUSED)
ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED)
ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CV_UNUSED)
ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_CV_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_UNSET_CV_SPEC_CV_UNUSED)
ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_VAR_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_UNSET_VAR_SPEC_CV_UNUSED)
ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED)
ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED):
- ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET)
+ ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY)
+ ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED)
ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED)
ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INSTANCEOF_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_INSTANCEOF_SPEC_CV_UNUSED)
ZEND_INSTANCEOF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_YIELD_SPEC_CV_UNUSED)
ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CHECK_VAR_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_CHECK_VAR_SPEC_CV_UNUSED)
ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MAKE_REF_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_MAKE_REF_SPEC_CV_UNUSED)
ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_COUNT_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_COUNT_SPEC_CV_UNUSED)
ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_CLASS_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_CV_UNUSED)
ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_GET_TYPE_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_GET_TYPE_SPEC_CV_UNUSED)
ZEND_GET_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_SPEC_CV_CV):
+ VM_TRACE(ZEND_ADD_SPEC_CV_CV)
ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SUB_SPEC_CV_CV):
+ VM_TRACE(ZEND_SUB_SPEC_CV_CV)
ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MUL_SPEC_CV_CV):
+ VM_TRACE(ZEND_MUL_SPEC_CV_CV)
ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_DIV_SPEC_CV_CV):
+ VM_TRACE(ZEND_DIV_SPEC_CV_CV)
ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_MOD_SPEC_CV_CV):
+ VM_TRACE(ZEND_MOD_SPEC_CV_CV)
ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SL_SPEC_CV_CV):
+ VM_TRACE(ZEND_SL_SPEC_CV_CV)
ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SR_SPEC_CV_CV):
+ VM_TRACE(ZEND_SR_SPEC_CV_CV)
ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POW_SPEC_CV_CV):
+ VM_TRACE(ZEND_POW_SPEC_CV_CV)
ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_CONCAT_SPEC_CV_CV):
+ VM_TRACE(ZEND_CONCAT_SPEC_CV_CV)
ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_IDENTICAL_SPEC_CV_CV)
ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV)
ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CV)
ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV)
ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CV_CV)
ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV)
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SPACESHIP_SPEC_CV_CV):
+ VM_TRACE(ZEND_SPACESHIP_SPEC_CV_CV)
ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_OR_SPEC_CV_CV):
+ VM_TRACE(ZEND_BW_OR_SPEC_CV_CV)
ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_AND_SPEC_CV_CV):
+ VM_TRACE(ZEND_BW_AND_SPEC_CV_CV)
ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BW_XOR_SPEC_CV_CV):
+ VM_TRACE(ZEND_BW_XOR_SPEC_CV_CV)
ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CV_CV):
+ VM_TRACE(ZEND_BOOL_XOR_SPEC_CV_CV)
ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CV)
ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM)
ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CV)
ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM)
ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CV)
ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM)
ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CV)
ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM)
ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CV)
ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM)
ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CV)
ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CV_DIM)
ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CV)
ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CV_DIM)
ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV)
ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM)
ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV)
ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM)
ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV)
ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM)
ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV)
ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM)
ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CV)
ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CV_DIM):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CV_DIM)
ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ):
+ VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ)
ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_INC_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_PRE_INC_OBJ_SPEC_CV_CV)
ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_PRE_DEC_OBJ_SPEC_CV_CV)
ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_POST_INC_OBJ_SPEC_CV_CV)
ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_CV_CV)
ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_R_SPEC_CV_CV)
ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_W_SPEC_CV_CV)
ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_RW_SPEC_CV_CV)
ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_IS_SPEC_CV_CV)
ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV)
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_DIM_UNSET_SPEC_CV_CV)
ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_R_SPEC_CV_CV)
ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_W_SPEC_CV_CV)
ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_RW_SPEC_CV_CV)
ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_IS_SPEC_CV_CV)
ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV):
+ VM_TRACE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV)
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_CV):
- ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST)
ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP)
ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR)
ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST)
ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP)
ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR)
ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED)
ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED):
+ VM_TRACE(ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED)
ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_REF_SPEC_CV_CV):
+ 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_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);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CV_CV):
+ VM_TRACE(ZEND_INIT_METHOD_CALL_SPEC_CV_CV)
ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CV_CV):
- ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV):
+ VM_TRACE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV)
ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CV_CV):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_CV_CV)
ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_DIM_SPEC_CV_CV):
+ VM_TRACE(ZEND_UNSET_DIM_SPEC_CV_CV)
ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_UNSET_OBJ_SPEC_CV_CV)
ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV)
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV)
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CV_CV):
+ VM_TRACE(ZEND_YIELD_SPEC_CV_CV)
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CV):
- ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_SPEC_CV_TMPVAR):
- ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_SPEC_CV_TMPVAR):
- ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_CV_TMPVAR):
- ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DIV_SPEC_CV_TMPVAR):
- ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MOD_SPEC_CV_TMPVAR):
- ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SL_SPEC_CV_TMPVAR):
- ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SR_SPEC_CV_TMPVAR):
- ZEND_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POW_SPEC_CV_TMPVAR):
- ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_CV_TMPVAR):
- ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR):
- ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR):
- ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CV_TMPVAR):
- ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR):
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SPACESHIP_SPEC_CV_TMPVAR):
- ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_CV_TMPVAR):
- ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_CV_TMPVAR):
- ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_CV_TMPVAR):
- ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_CV_TMPVAR):
- ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SUB_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_MUL_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_DIV_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_MOD_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SL_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_SR_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_CONCAT_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_BW_OR_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_AND_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_XOR_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_POW_SPEC_CV_TMPVAR):
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM):
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_PRE_INC_OBJ_SPEC_CV_TMPVAR):
- ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR):
- ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR):
- ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR):
- ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR):
- ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_CV_TMPVAR):
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST):
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP):
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR):
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV):
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST):
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP):
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR):
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_FAST_CONCAT_SPEC_CV_TMPVAR):
- ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR):
- ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_CV_TMPVAR):
- ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR):
- ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_CV_TMPVAR):
- ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_DIM_SPEC_CV_TMPVAR):
- ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_OBJ_SPEC_CV_TMPVAR):
- ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR):
- ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR):
- ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_NOT_SPEC_TMPVAR):
- ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_NOT_SPEC_TMPVAR):
- ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ECHO_SPEC_TMPVAR):
- ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_JMPZ_SPEC_TMPVAR):
- ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_JMPNZ_SPEC_TMPVAR):
- ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_JMPZNZ_SPEC_TMPVAR):
- ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_JMPZ_EX_SPEC_TMPVAR):
- ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_JMPNZ_EX_SPEC_TMPVAR):
- ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FREE_SPEC_TMPVAR):
- ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FE_FREE_SPEC_TMPVAR):
- ZEND_FE_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SEND_VAL_SPEC_TMPVAR):
- ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_SPEC_TMPVAR):
- ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CLONE_SPEC_TMPVAR):
- ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR):
- ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_EXIT_SPEC_TMPVAR):
- ZEND_EXIT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_STRLEN_SPEC_TMPVAR):
- ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CONST):
- ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_CONST):
- ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_TMPVAR_CONST):
- ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_CONST):
- ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_CONST):
- ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_CONST):
- ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_CONST):
- ZEND_SR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_CONST):
- ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_CONST):
- ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST):
- ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST):
- ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_CONST):
- ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST):
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_CONST):
- ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVAR_CONST):
- ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVAR_CONST):
- ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVAR_CONST):
- ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_TMPVAR_CONST):
- ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST):
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST):
- ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST):
- ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_FETCH_LIST_SPEC_TMPVAR_CONST):
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST):
- ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST):
- ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_CONST):
- ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST):
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST):
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST):
- ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_CONST):
- ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST):
- ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST):
- ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST):
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR):
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR):
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR):
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR):
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR):
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR):
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR):
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR):
- ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_W_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED):
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(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_UNSET_VAR_SPEC_TMPVAR_UNUSED):
- ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED):
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED):
- ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED):
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED):
- ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_CV):
- ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_CV):
- ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_TMPVAR_CV):
- ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_CV):
- ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_CV):
- ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_CV):
- ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_CV):
- ZEND_SR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_CV):
- ZEND_POW_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_CV):
- ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_CV):
- ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV):
- ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_CV):
- ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV):
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_CV):
- ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVAR_CV):
- ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVAR_CV):
- ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVAR_CV):
- ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_TMPVAR_CV):
- ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV):
- ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV):
- ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV):
- ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_TMPVAR_CV):
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CV):
- ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV):
- ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_CV):
- ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV):
- ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV):
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_SPEC_TMPVAR_TMPVAR):
- ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_SPEC_TMPVAR_TMPVAR):
- ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_SPEC_TMPVAR_TMPVAR):
- ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_DIV_SPEC_TMPVAR_TMPVAR):
- ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MOD_SPEC_TMPVAR_TMPVAR):
- ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SL_SPEC_TMPVAR_TMPVAR):
- ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SR_SPEC_TMPVAR_TMPVAR):
- ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_POW_SPEC_TMPVAR_TMPVAR):
- ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CONCAT_SPEC_TMPVAR_TMPVAR):
- ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR):
- ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR):
- ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR):
- ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR):
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR):
- ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVAR_TMPVAR):
- ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVAR_TMPVAR):
- ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR):
- ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR):
- ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR):
- ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR):
- ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_CASE_SPEC_TMPVAR_TMPVAR):
- ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR):
- ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR):
- ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR):
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV):
- ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV):
- ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST):
- ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_SPEC_TMPVARCV_CONST):
- ZEND_SUB_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST):
- ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
- ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
- ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV):
- ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
- ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(HYBRID_HALT):
execute_data = orig_execute_data;
opline = orig_opline;
return;
HYBRID_DEFAULT:
- zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);
+ VM_TRACE(ZEND_NULL)
+ ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK(); /* Never reached */
#else
#ifdef ZEND_VM_FP_GLOBAL_REG
@@ -63782,9 +60891,9 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
}
-void zend_init_opcodes_handlers(void)
+void zend_vm_init(void)
{
- static const void *labels[] = {
+ static const void * const labels[] = {
ZEND_NOP_SPEC_HANDLER,
ZEND_ADD_SPEC_CONST_CONST_HANDLER,
ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER,
@@ -63837,20 +60946,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_SUB_SPEC_CV_CV_HANDLER,
ZEND_MUL_SPEC_CONST_CONST_HANDLER,
- ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -63961,7 +61070,7 @@ void zend_init_opcodes_handlers(void)
ZEND_SR_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SR_SPEC_CV_CV_HANDLER,
- ZEND_CONCAT_SPEC_CONST_CONST_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER,
ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
@@ -63987,20 +61096,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_CONCAT_SPEC_CV_CV_HANDLER,
ZEND_BW_OR_SPEC_CONST_CONST_HANDLER,
- ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_BW_OR_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_OR_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_OR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64012,20 +61121,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_BW_OR_SPEC_CV_CV_HANDLER,
ZEND_BW_AND_SPEC_CONST_CONST_HANDLER,
- ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_BW_AND_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_AND_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_AND_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_AND_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64037,20 +61146,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_BW_AND_SPEC_CV_CV_HANDLER,
ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER,
- ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_BW_XOR_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_XOR_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_XOR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64072,20 +61181,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_BOOL_NOT_SPEC_CV_HANDLER,
ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER,
- ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BOOL_XOR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64097,20 +61206,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER,
ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER,
ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER,
ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER,
ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64122,20 +61231,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64147,20 +61256,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER,
ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64172,20 +61281,20 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -65218,91 +62327,19 @@ void zend_init_opcodes_handlers(void)
ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
- ZEND_CASE_SPEC_CONST_CONST_HANDLER,
- ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_CASE_SPEC_CONST_CV_HANDLER,
ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER,
ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CASE_SPEC_TMPVAR_CV_HANDLER,
- ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_CASE_SPEC_TMPVAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_CASE_SPEC_CV_CONST_HANDLER,
- ZEND_CASE_SPEC_CV_TMPVAR_HANDLER,
- ZEND_CASE_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_CASE_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_CHECK_VAR_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HANDLER,
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_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_MAKE_REF_SPEC_VAR_UNUSED_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_MAKE_REF_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_BOOL_SPEC_CONST_HANDLER,
ZEND_BOOL_SPEC_TMPVAR_HANDLER,
ZEND_BOOL_SPEC_TMPVAR_HANDLER,
@@ -65333,110 +62370,34 @@ void zend_init_opcodes_handlers(void)
ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FAST_CONCAT_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_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER,
ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER,
ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ROPE_INIT_SPEC_UNUSED_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_ROPE_ADD_SPEC_TMP_CONST_HANDLER,
ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER,
ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ROPE_ADD_SPEC_TMP_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_ROPE_END_SPEC_TMP_CONST_HANDLER,
ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER,
ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ROPE_END_SPEC_TMP_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_BEGIN_SILENCE_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_END_SILENCE_SPEC_TMP_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER,
ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER,
ZEND_INIT_FCALL_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_RETURN_SPEC_CONST_HANDLER,
ZEND_RETURN_SPEC_TMP_HANDLER,
ZEND_RETURN_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_RETURN_SPEC_CV_HANDLER,
- ZEND_RECV_SPEC_HANDLER,
+ ZEND_RECV_SPEC_UNUSED_HANDLER,
ZEND_RECV_INIT_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SEND_VAL_SPEC_CONST_HANDLER,
ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER,
ZEND_SEND_VAL_SPEC_TMPVAR_HANDLER,
@@ -65457,21 +62418,13 @@ void zend_init_opcodes_handlers(void)
ZEND_SEND_REF_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SEND_REF_SPEC_CV_HANDLER,
- ZEND_NEW_SPEC_CONST_HANDLER,
+ ZEND_NEW_SPEC_CONST_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NEW_SPEC_VAR_HANDLER,
- ZEND_NEW_SPEC_UNUSED_HANDLER,
+ ZEND_NEW_SPEC_VAR_UNUSED_HANDLER,
+ ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FREE_SPEC_TMPVAR_HANDLER,
- ZEND_FREE_SPEC_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER,
ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER,
ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER,
@@ -65527,29 +62480,10 @@ void zend_init_opcodes_handlers(void)
ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_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_UNSET_VAR_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -65561,7 +62495,6 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER,
ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER,
ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HANDLER,
@@ -65607,41 +62540,17 @@ void zend_init_opcodes_handlers(void)
ZEND_FE_RESET_R_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FE_RESET_R_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FE_FETCH_R_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_EXIT_SPEC_CONST_HANDLER,
ZEND_EXIT_SPEC_TMPVAR_HANDLER,
ZEND_EXIT_SPEC_TMPVAR_HANDLER,
ZEND_EXIT_SPEC_UNUSED_HANDLER,
ZEND_EXIT_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_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_FETCH_R_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER,
ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER,
ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER,
@@ -65672,16 +62581,16 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER,
+ ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER,
ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER,
ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER,
ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER,
@@ -65692,29 +62601,10 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_W_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_W_SPEC_TMPVAR_UNUSED_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_FETCH_W_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -65726,7 +62616,6 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER,
ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER,
ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER,
@@ -65767,29 +62656,10 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_RW_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED_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_FETCH_RW_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -65801,7 +62671,6 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER,
ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER,
ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_HANDLER,
@@ -65842,31 +62711,11 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_IS_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_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_FETCH_IS_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER,
ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER,
ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR_HANDLER,
@@ -65917,31 +62766,11 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED_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_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER,
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER,
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER,
@@ -65992,29 +62821,10 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED_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_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -66026,7 +62836,6 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER,
ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER,
ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR_HANDLER,
@@ -66067,101 +62876,51 @@ void zend_init_opcodes_handlers(void)
ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CONST_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_TMPVAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_CONST_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV_HANDLER,
ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_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_CHECK_FUNC_ARG_SPEC_UNUSED_HANDLER,
+ ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK_HANDLER,
ZEND_EXT_STMT_SPEC_HANDLER,
ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
ZEND_EXT_FCALL_END_SPEC_HANDLER,
ZEND_EXT_NOP_SPEC_HANDLER,
ZEND_TICKS_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_CATCH_SPEC_CONST_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_CATCH_SPEC_CONST_HANDLER,
ZEND_THROW_SPEC_CONST_HANDLER,
ZEND_THROW_SPEC_TMP_HANDLER,
ZEND_THROW_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_THROW_SPEC_CV_HANDLER,
- ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER,
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER,
- ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
- ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER,
ZEND_CLONE_SPEC_CONST_HANDLER,
ZEND_CLONE_SPEC_TMPVAR_HANDLER,
ZEND_CLONE_SPEC_TMPVAR_HANDLER,
@@ -66222,31 +62981,11 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_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_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER,
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER,
ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR_HANDLER,
@@ -66292,26 +63031,6 @@ void zend_init_opcodes_handlers(void)
ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_INIT_USER_CALL_SPEC_CONST_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_SEND_ARRAY_SPEC_HANDLER,
ZEND_SEND_USER_SPEC_CONST_HANDLER,
ZEND_SEND_USER_SPEC_TMP_HANDLER,
@@ -66324,55 +63043,23 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_STRLEN_SPEC_CV_HANDLER,
ZEND_DEFINED_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_TYPE_CHECK_SPEC_CONST_HANDLER,
- ZEND_TYPE_CHECK_SPEC_TMP_HANDLER,
- ZEND_TYPE_CHECK_SPEC_VAR_HANDLER,
+ ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER,
+ ZEND_TYPE_CHECK_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_TYPE_CHECK_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FE_RESET_RW_SPEC_CONST_HANDLER,
ZEND_FE_RESET_RW_SPEC_TMP_HANDLER,
ZEND_FE_RESET_RW_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FE_RESET_RW_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FE_FREE_SPEC_TMPVAR_HANDLER,
ZEND_FE_FREE_SPEC_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_HANDLER,
ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER,
ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER,
@@ -66635,12 +63322,8 @@ void zend_init_opcodes_handlers(void)
ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER,
ZEND_INSTANCEOF_SPEC_CV_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_DECLARE_CLASS_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_DECLARE_INHERITED_CLASS_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER,
ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
@@ -66648,40 +63331,8 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_YIELD_FROM_SPEC_CV_HANDLER,
ZEND_DECLARE_CONST_SPEC_CONST_CONST_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_ADD_INTERFACE_SPEC_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER,
ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -66841,59 +63492,11 @@ void zend_init_opcodes_handlers(void)
ZEND_JMP_SET_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_JMP_SET_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_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_ADD_TRAIT_SPEC_HANDLER,
ZEND_BIND_TRAITS_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SEPARATE_SPEC_VAR_UNUSED_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_FETCH_CLASS_NAME_SPEC_HANDLER,
+ ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER,
ZEND_CALL_TRAMPOLINE_SPEC_HANDLER,
ZEND_DISCARD_EXCEPTION_SPEC_HANDLER,
ZEND_YIELD_SPEC_CONST_CONST_HANDLER,
@@ -66928,7 +63531,7 @@ void zend_init_opcodes_handlers(void)
ZEND_GENERATOR_RETURN_SPEC_CV_HANDLER,
ZEND_FAST_CALL_SPEC_HANDLER,
ZEND_FAST_RET_SPEC_HANDLER,
- ZEND_RECV_VARIADIC_SPEC_HANDLER,
+ ZEND_RECV_VARIADIC_SPEC_UNUSED_HANDLER,
ZEND_SEND_UNPACK_SPEC_HANDLER,
ZEND_POW_SPEC_CONST_CONST_HANDLER,
ZEND_POW_SPEC_CONST_TMPVAR_HANDLER,
@@ -67030,34 +63633,10 @@ void zend_init_opcodes_handlers(void)
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_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_BIND_GLOBAL_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_COALESCE_SPEC_CONST_HANDLER,
- ZEND_COALESCE_SPEC_TMP_HANDLER,
- ZEND_COALESCE_SPEC_VAR_HANDLER,
+ ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
+ ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_COALESCE_SPEC_CV_HANDLER,
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER,
@@ -67086,11 +63665,7 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_SPACESHIP_SPEC_CV_CV_HANDLER,
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST_HANDLER,
ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR_HANDLER,
@@ -67293,415 +63868,71 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_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_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_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_BIND_LEXICAL_SPEC_TMP_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_BIND_STATIC_SPEC_CV_CONST_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_FETCH_THIS_SPEC_UNUSED_UNUSED_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_SEND_FUNC_ARG_SPEC_VAR_HANDLER,
ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SWITCH_LONG_SPEC_CONST_CONST_HANDLER,
+ ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_SWITCH_LONG_SPEC_TMPVAR_CONST_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_SWITCH_LONG_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_SWITCH_STRING_SPEC_CONST_CONST_HANDLER,
+ ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_SWITCH_STRING_SPEC_TMPVAR_CONST_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_SWITCH_STRING_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_IN_ARRAY_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_IN_ARRAY_SPEC_VAR_CONST_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_IN_ARRAY_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_COUNT_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_COUNT_SPEC_TMP_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_COUNT_SPEC_VAR_UNUSED_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_COUNT_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_CLASS_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_CLASS_SPEC_TMP_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_CLASS_SPEC_VAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_CLASS_SPEC_CV_UNUSED_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_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED_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_GET_TYPE_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_TYPE_SPEC_TMP_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_GET_TYPE_SPEC_VAR_UNUSED_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_GET_TYPE_SPEC_CV_UNUSED_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_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED_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_FUNC_GET_ARGS_SPEC_CONST_UNUSED_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_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_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_UNSET_CV_SPEC_CV_UNUSED_HANDLER,
+ ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER,
+ ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_CONST_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER,
+ ZEND_JMP_FORWARD_SPEC_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67711,22 +63942,22 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67736,22 +63967,22 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67761,7 +63992,7 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67842,16 +64073,16 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67861,22 +64092,22 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67886,22 +64117,22 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67911,7 +64142,7 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
@@ -67919,21 +64150,21 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -67946,9 +64177,9 @@ void zend_init_opcodes_handlers(void)
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -67976,9 +64207,9 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -67994,21 +64225,21 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68021,9 +64252,9 @@ void zend_init_opcodes_handlers(void)
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68051,9 +64282,9 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68069,21 +64300,21 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68096,9 +64327,9 @@ void zend_init_opcodes_handlers(void)
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68126,9 +64357,9 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68144,21 +64375,21 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
- ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ_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_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68171,9 +64402,9 @@ void zend_init_opcodes_handlers(void)
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68201,9 +64432,9 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
@@ -68516,95 +64747,23 @@ void zend_init_opcodes_handlers(void)
ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_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_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_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_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED_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_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_INC_LONG_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_DEC_LONG_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_HANDLER,
ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST_HANDLER,
ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER,
@@ -68616,31 +64775,31 @@ void zend_init_opcodes_handlers(void)
ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CONST_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_CV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CV_HANDLER,
+ ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER,
@@ -68648,86 +64807,35 @@ void zend_init_opcodes_handlers(void)
ZEND_SEND_VAR_SIMPLE_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER,
- ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER,
- ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER,
- ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_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_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER,
+ ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER,
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER,
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_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
};
static const uint32_t specs[] = {
0,
1 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
26 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 51 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 51 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
76 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
101 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
126 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
151 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
176 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 201 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 226 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 251 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 201 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 226 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 251 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
276 | SPEC_RULE_OP1,
281 | SPEC_RULE_OP1,
- 286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 311 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 336 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 361 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 386 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 286 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 311 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 336 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 361 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
+ 386 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE,
411 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
436 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
461 | SPEC_RULE_OP1,
@@ -68757,157 +64865,158 @@ void zend_init_opcodes_handlers(void)
1418 | SPEC_RULE_OP1,
1423 | SPEC_RULE_OP1,
1428 | SPEC_RULE_OP1,
- 1433 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1458 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1483 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
- 1493 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1518 | SPEC_RULE_OP1,
- 1523 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1548 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1573 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1598 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1623,
- 1624 | SPEC_RULE_OP1,
- 1629 | SPEC_RULE_OP2,
- 1634 | SPEC_RULE_RETVAL,
- 1636 | SPEC_RULE_OP2,
+ 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_OP2,
+ 1647 | SPEC_RULE_OP1,
1652 | SPEC_RULE_OP1,
- 1657 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
- 1667 | SPEC_RULE_OP1,
- 1672 | SPEC_RULE_OP1,
- 1677 | SPEC_RULE_OP2,
- 1682 | SPEC_RULE_OP1,
- 1687 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 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,
- 1742 | 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,
- 1827 | SPEC_RULE_OP1,
- 1832 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1857 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1882 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1907 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 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,
+ 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 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2032 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2057 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2082 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2107 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2132 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2157 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2182 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2207 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2232 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921,
- 2332,
- 2333,
- 2334,
- 2335,
- 2336,
- 2337 | SPEC_RULE_OP1,
- 2342 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2367 | SPEC_RULE_OP1,
- 2372 | SPEC_RULE_OP2,
- 2377 | SPEC_RULE_OP1,
- 2382 | SPEC_RULE_OP1,
- 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2462 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2487 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
- 2497 | SPEC_RULE_OP1,
- 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2527,
- 2528 | SPEC_RULE_OP1,
- 2533 | SPEC_RULE_OP1,
- 2538 | SPEC_RULE_OP1,
- 2543 | SPEC_RULE_OP1,
- 2548 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2573 | SPEC_RULE_OP1,
- 2578 | SPEC_RULE_OP1,
- 2583 | SPEC_RULE_OP1,
- 2588 | SPEC_RULE_OP2,
- 2593 | SPEC_RULE_RETVAL,
- 2595 | SPEC_RULE_RETVAL,
- 2597 | SPEC_RULE_RETVAL,
- 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
- 2824,
- 2825 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2850,
- 2851 | SPEC_RULE_OP2,
- 2856,
- 2857 | SPEC_RULE_OP1,
- 2862 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2887 | SPEC_RULE_OP2,
- 2892 | SPEC_RULE_OP2,
- 2897,
- 2898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
- 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3048,
- 3049,
- 3050,
- 3051 | SPEC_RULE_OP1,
- 3056 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3081,
- 3082,
- 3083 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3108,
- 3109,
- 3110,
- 3111 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3136 | SPEC_RULE_OP1,
- 3141,
- 3142,
- 3143,
- 3144,
- 3145 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3170 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 3245 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3270 | SPEC_RULE_OP1,
- 3275 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3300,
- 3301 | SPEC_RULE_OP2,
- 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3506 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921,
- 3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 4921
+ 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,
+ 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,
+ 2437,
+ 2438,
+ 2439,
+ 2440 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
+ 2565 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2590,
+ 2591,
+ 2592,
+ 2593 | SPEC_RULE_OP1,
+ 2598,
+ 2599,
+ 2600,
+ 2601,
+ 2602,
+ 2603,
+ 2604,
+ 2605 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2630 | SPEC_RULE_OP1,
+ 2635,
+ 2636,
+ 2637,
+ 2638,
+ 2639 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2664 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
+ 2739,
+ 2740 | SPEC_RULE_OP1,
+ 2745 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2770,
+ 2771,
+ 2772 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2797 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2822 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2847 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2872 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2897 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2922 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2947 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2972 | SPEC_RULE_OP1,
+ 2977,
+ 2978,
+ 2979,
+ 2980,
+ 2981,
+ 2982 | SPEC_RULE_OP1,
+ 2987 | SPEC_RULE_OP1,
+ 2992 | SPEC_RULE_OP1,
+ 2997 | SPEC_RULE_OP1,
+ 3002 | SPEC_RULE_OP1,
+ 3007,
+ 3008 | SPEC_RULE_OP1,
+ 3013,
+ 3014 | SPEC_RULE_OP1,
+ 3019,
+ 3020 | SPEC_RULE_ISSET,
+ 3022 | SPEC_RULE_OP2,
+ 3920
};
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
zend_opcode_handler_funcs = labels;
@@ -68918,6 +65027,12 @@ void zend_init_opcodes_handlers(void)
zend_handlers_count = sizeof(labels) / sizeof(void*);
zend_spec_handlers = specs;
#endif
+ VM_TRACE_START();
+}
+
+void zend_vm_dtor(void)
+{
+ VM_TRACE_END();
}
static HashTable *zend_handlers_table = NULL;
@@ -68937,7 +65052,7 @@ static void init_opcode_serialiser(void)
}
}
-ZEND_API void zend_serialize_opcode_handler(zend_op *op)
+ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op)
{
zval *zv;
@@ -68949,12 +65064,12 @@ ZEND_API void zend_serialize_opcode_handler(zend_op *op)
op->handler = (const void *)(zend_uintptr_t)Z_LVAL_P(zv);
}
-ZEND_API void zend_deserialize_opcode_handler(zend_op *op)
+ZEND_API void ZEND_FASTCALL zend_deserialize_opcode_handler(zend_op *op)
{
op->handler = zend_opcode_handlers[(zend_uintptr_t)op->handler];
}
-ZEND_API const void *zend_get_opcode_handler_func(const zend_op *op)
+ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *op)
{
#if ZEND_VM_KIND == ZEND_VM_KIND_CALL
return op->handler;
@@ -68986,10 +65101,10 @@ ZEND_API int zend_vm_kind(void)
return ZEND_VM_KIND;
}
-static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* op)
+static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* op)
{
static const int zend_vm_decode[] = {
- _UNUSED_CODE, /* 0 */
+ _UNUSED_CODE, /* 0 = IS_UNUSED */
_CONST_CODE, /* 1 = IS_CONST */
_TMP_CODE, /* 2 = IS_TMP_VAR */
_UNUSED_CODE, /* 3 */
@@ -68997,52 +65112,49 @@ static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* o
_UNUSED_CODE, /* 5 */
_UNUSED_CODE, /* 6 */
_UNUSED_CODE, /* 7 */
- _UNUSED_CODE, /* 8 = IS_UNUSED */
- _UNUSED_CODE, /* 9 */
- _UNUSED_CODE, /* 10 */
- _UNUSED_CODE, /* 11 */
- _UNUSED_CODE, /* 12 */
- _UNUSED_CODE, /* 13 */
- _UNUSED_CODE, /* 14 */
- _UNUSED_CODE, /* 15 */
- _CV_CODE /* 16 = IS_CV */
+ _CV_CODE /* 8 = IS_CV */
};
uint32_t offset = 0;
if (spec & SPEC_RULE_OP1) offset = offset * 5 + zend_vm_decode[op->op1_type];
if (spec & SPEC_RULE_OP2) offset = offset * 5 + zend_vm_decode[op->op2_type];
- if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
- if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);
- if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num < MAX_ARG_FLAG_NUM);
- if (spec & SPEC_RULE_SMART_BRANCH) {
- offset = offset * 3;
- if ((op+1)->opcode == ZEND_JMPZ) {
- offset += 1;
- } else if ((op+1)->opcode == ZEND_JMPNZ) {
- offset += 2;
+ if (spec & SPEC_EXTRA_MASK) {
+ if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
+ else if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);
+ else if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);
+ else if (spec & SPEC_RULE_SMART_BRANCH) {
+ offset = offset * 3;
+ if ((op+1)->opcode == ZEND_JMPZ) {
+ offset += 1;
+ } else if ((op+1)->opcode == ZEND_JMPNZ) {
+ offset += 2;
+ }
}
- }
- if (spec & SPEC_RULE_DIM_OBJ) {
- offset = offset * 3;
- if (op->extended_value == ZEND_ASSIGN_DIM) {
- offset += 1;
- } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
- offset += 2;
+ else if (spec & SPEC_RULE_DIM_OBJ) {
+ offset = offset * 3;
+ if (op->extended_value == ZEND_ASSIGN_DIM) {
+ offset += 1;
+ } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
+ offset += 2;
+ }
}
+ else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
}
return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset];
}
+#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC
static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op)
{
return zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);
}
+#endif
#if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID
static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend_op* op)
{
uint32_t spec = zend_spec_handlers[opcode];
static const int zend_vm_decode[] = {
- _UNUSED_CODE, /* 0 */
+ _UNUSED_CODE, /* 0 = IS_UNUSED */
_CONST_CODE, /* 1 = IS_CONST */
_TMP_CODE, /* 2 = IS_TMP_VAR */
_UNUSED_CODE, /* 3 */
@@ -69050,49 +65162,51 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
_UNUSED_CODE, /* 5 */
_UNUSED_CODE, /* 6 */
_UNUSED_CODE, /* 7 */
- _UNUSED_CODE, /* 8 = IS_UNUSED */
- _UNUSED_CODE, /* 9 */
- _UNUSED_CODE, /* 10 */
- _UNUSED_CODE, /* 11 */
- _UNUSED_CODE, /* 12 */
- _UNUSED_CODE, /* 13 */
- _UNUSED_CODE, /* 14 */
- _UNUSED_CODE, /* 15 */
- _CV_CODE /* 16 = IS_CV */
+ _CV_CODE /* 8 = IS_CV */
};
uint32_t offset = 0;
if (spec & SPEC_RULE_OP1) offset = offset * 5 + zend_vm_decode[op->op1_type];
if (spec & SPEC_RULE_OP2) offset = offset * 5 + zend_vm_decode[op->op2_type];
- if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
- if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);
- if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num < MAX_ARG_FLAG_NUM);
- if (spec & SPEC_RULE_SMART_BRANCH) {
- offset = offset * 3;
- if ((op+1)->opcode == ZEND_JMPZ) {
- offset += 1;
- } else if ((op+1)->opcode == ZEND_JMPNZ) {
- offset += 2;
+ if (spec & SPEC_EXTRA_MASK) {
+ if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
+ else if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);
+ else if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);
+ else if (spec & SPEC_RULE_SMART_BRANCH) {
+ offset = offset * 3;
+ if ((op+1)->opcode == ZEND_JMPZ) {
+ offset += 1;
+ } else if ((op+1)->opcode == ZEND_JMPNZ) {
+ offset += 2;
+ }
}
- }
- if (spec & SPEC_RULE_DIM_OBJ) {
- offset = offset * 3;
- if (op->extended_value == ZEND_ASSIGN_DIM) {
- offset += 1;
- } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
- offset += 2;
+ else if (spec & SPEC_RULE_DIM_OBJ) {
+ offset = offset * 3;
+ if (op->extended_value == ZEND_ASSIGN_DIM) {
+ offset += 1;
+ } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
+ offset += 2;
+ }
}
+ else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
}
return zend_opcode_handler_funcs[(spec & SPEC_START_MASK) + offset];
}
#endif
-ZEND_API void zend_vm_set_opcode_handler(zend_op* op)
+ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)
{
- op->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op);
+ zend_uchar opcode = zend_user_opcodes[op->opcode];
+
+ if (zend_spec_handlers[op->opcode] & SPEC_RULE_COMMUTATIVE) {
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
+ }
+ op->handler = zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);
}
-ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint32_t op2_info, uint32_t res_info)
+ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint32_t op2_info, uint32_t res_info)
{
zend_uchar opcode = zend_user_opcodes[op->opcode];
uint32_t spec = zend_spec_handlers[opcode];
@@ -69102,24 +65216,24 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
+ spec = 3028 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
} 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 = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
+ spec = 3053 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
} 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 = 3956 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
+ spec = 3078 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
}
@@ -69129,82 +65243,70 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3103 | 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 = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3128 | 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 = 4031 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3153 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_MUL:
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3178 | 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 = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3203 | 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 = 4106 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3228 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_EQUAL:
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3253 | 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 = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3328 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_NOT_EQUAL:
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3403 | 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 = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- if (op->op1_type > op->op2_type) {
- zend_swap_operands(op);
- }
+ spec = 3478 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_SMALLER:
@@ -69212,12 +65314,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4431 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3553 | 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 = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3628 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_IS_SMALLER_OR_EQUAL:
@@ -69225,75 +65327,110 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 4581 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3703 | 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 = 4656 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3778 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_QM_ASSIGN:
if (op1_info == MAY_BE_DOUBLE) {
- spec = 4821 | SPEC_RULE_OP1;
- } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) {
- spec = 4826 | SPEC_RULE_OP1;
+ spec = 3871 | 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 = 3876 | SPEC_RULE_OP1;
}
break;
case ZEND_PRE_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4731 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3853 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4741 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3855 | SPEC_RULE_RETVAL;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4751 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3857 | SPEC_RULE_RETVAL;
}
break;
case ZEND_PRE_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4761 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3859 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4771 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3861 | SPEC_RULE_RETVAL;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4781 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
+ spec = 3863 | SPEC_RULE_RETVAL;
}
break;
case ZEND_POST_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4791 | SPEC_RULE_OP1;
+ spec = 3865;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4796 | SPEC_RULE_OP1;
+ spec = 3866;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4801 | SPEC_RULE_OP1;
+ spec = 3867;
}
break;
case ZEND_POST_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 4806 | SPEC_RULE_OP1;
+ spec = 3868;
} else if (op1_info == MAY_BE_LONG) {
- spec = 4811 | SPEC_RULE_OP1;
+ spec = 3869;
} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 4816 | SPEC_RULE_OP1;
+ spec = 3870;
+ }
+ break;
+ case ZEND_JMP:
+ if (OP_JMP_ADDR(op, op->op1) > op) {
+ spec = 3027;
+ }
+ break;
+ case ZEND_SEND_VAL:
+ if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
+ spec = 3916;
}
break;
case ZEND_SEND_VAR_EX:
- if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 4861 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG;
+ if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
+ spec = 3911 | 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 = 4871 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL;
+ spec = 3918 | SPEC_RULE_RETVAL;
}
break;
case ZEND_FETCH_DIM_R:
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
- spec = 4831 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
+ break;
+ }
+ spec = 3881 | 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 = 3917;
}
break;
case ZEND_SEND_VAR:
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 4856 | SPEC_RULE_OP1;
+ spec = 3906 | SPEC_RULE_OP1;
+ }
+ break;
+ case ZEND_BW_OR:
+ case ZEND_BW_AND:
+ case ZEND_BW_XOR:
+ case ZEND_BOOL_XOR:
+ case ZEND_IS_IDENTICAL:
+ case ZEND_IS_NOT_IDENTICAL:
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
+ break;
+ case ZEND_USER_OPCODE:
+ if (zend_spec_handlers[op->opcode] & SPEC_RULE_COMMUTATIVE) {
+ if (op->op1_type < op->op2_type) {
+ zend_swap_operands(op);
+ }
}
break;
default:
@@ -69302,7 +65439,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint
op->handler = zend_vm_get_opcode_handler_ex(spec, op);
}
-ZEND_API int zend_vm_call_opcode_handler(zend_execute_data* ex)
+ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data* ex)
{
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
opcode_handler_t handler;
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 2bbfc1fa92..30f0017cbd 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -47,6 +47,12 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value
void {%INITIALIZER_NAME%}(void)
{
{%EXTERNAL_LABELS%}
+ VM_TRACE_START();
+}
+
+void zend_vm_dtor(void)
+{
+ VM_TRACE_END();
}
static HashTable *zend_handlers_table = NULL;
@@ -66,7 +72,7 @@ static void init_opcode_serialiser(void)
}
}
-ZEND_API void zend_serialize_opcode_handler(zend_op *op)
+ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op)
{
zval *zv;
@@ -78,12 +84,12 @@ ZEND_API void zend_serialize_opcode_handler(zend_op *op)
op->handler = (const void *)(zend_uintptr_t)Z_LVAL_P(zv);
}
-ZEND_API void zend_deserialize_opcode_handler(zend_op *op)
+ZEND_API void ZEND_FASTCALL zend_deserialize_opcode_handler(zend_op *op)
{
op->handler = zend_opcode_handlers[(zend_uintptr_t)op->handler];
}
-ZEND_API const void *zend_get_opcode_handler_func(const zend_op *op)
+ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *op)
{
#if ZEND_VM_KIND == ZEND_VM_KIND_CALL
return op->handler;
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index f8af837b29..d9e307d17f 100644
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -13,10 +13,8 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
-
- $Id$
*/
const HEADER_TEXT = <<< DATA
@@ -34,9 +32,9 @@ const HEADER_TEXT = <<< DATA
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
@@ -64,27 +62,29 @@ $vm_op_flags = array(
"ZEND_VM_OP_NUM" => 0x10,
"ZEND_VM_OP_JMP_ADDR" => 0x20,
"ZEND_VM_OP_TRY_CATCH" => 0x30,
- "ZEND_VM_OP_LIVE_RANGE" => 0x40,
+ // unused 0x40
"ZEND_VM_OP_THIS" => 0x50,
"ZEND_VM_OP_NEXT" => 0x60,
"ZEND_VM_OP_CLASS_FETCH" => 0x70,
"ZEND_VM_OP_CONSTRUCTOR" => 0x80,
+ "ZEND_VM_OP_CONST_FETCH" => 0x90,
+ "ZEND_VM_OP_CACHE_SLOT" => 0xa0,
"ZEND_VM_EXT_VAR_FETCH" => 1<<16,
"ZEND_VM_EXT_ISSET" => 1<<17,
- "ZEND_VM_EXT_ARG_NUM" => 1<<18,
+ "ZEND_VM_EXT_CACHE_SLOT" => 1<<18,
"ZEND_VM_EXT_ARRAY_INIT" => 1<<19,
"ZEND_VM_EXT_REF" => 1<<20,
"ZEND_VM_EXT_MASK" => 0x0f000000,
"ZEND_VM_EXT_NUM" => 0x01000000,
- // unused 0x2000000
+ "ZEND_VM_EXT_LAST_CATCH" => 0x02000000,
"ZEND_VM_EXT_JMP_ADDR" => 0x03000000,
"ZEND_VM_EXT_DIM_OBJ" => 0x04000000,
- "ZEND_VM_EXT_CLASS_FETCH" => 0x05000000,
- "ZEND_VM_EXT_CONST_FETCH" => 0x06000000,
+ // unused 0x5000000
+ // unused 0x6000000
"ZEND_VM_EXT_TYPE" => 0x07000000,
"ZEND_VM_EXT_EVAL" => 0x08000000,
- // unused 0x09000000,
+ "ZEND_VM_EXT_TYPE_MASK" => 0x09000000,
// unused 0x0a000000,
"ZEND_VM_EXT_SRC" => 0x0b000000,
// unused 0x0c000000,
@@ -108,27 +108,28 @@ $vm_op_decode = array(
"NUM" => ZEND_VM_OP_NUM,
"JMP_ADDR" => ZEND_VM_OP_JMP_ADDR,
"TRY_CATCH" => ZEND_VM_OP_TRY_CATCH,
- "LIVE_RANGE" => ZEND_VM_OP_LIVE_RANGE,
"THIS" => ZEND_VM_OP_THIS,
"NEXT" => ZEND_VM_OP_NEXT,
"CLASS_FETCH" => ZEND_VM_OP_CLASS_FETCH,
"CONSTRUCTOR" => ZEND_VM_OP_CONSTRUCTOR,
+ "CONST_FETCH" => ZEND_VM_OP_CONST_FETCH,
+ "CACHE_SLOT" => ZEND_VM_OP_CACHE_SLOT,
);
$vm_ext_decode = array(
"NUM" => ZEND_VM_EXT_NUM,
+ "LAST_CATCH" => ZEND_VM_EXT_LAST_CATCH,
"JMP_ADDR" => ZEND_VM_EXT_JMP_ADDR,
"DIM_OBJ" => ZEND_VM_EXT_DIM_OBJ,
- "CLASS_FETCH" => ZEND_VM_EXT_CLASS_FETCH,
- "CONST_FETCH" => ZEND_VM_EXT_CONST_FETCH,
"VAR_FETCH" => ZEND_VM_EXT_VAR_FETCH,
"ARRAY_INIT" => ZEND_VM_EXT_ARRAY_INIT,
"TYPE" => ZEND_VM_EXT_TYPE,
"EVAL" => ZEND_VM_EXT_EVAL,
+ "TYPE_MASK" => ZEND_VM_EXT_TYPE_MASK,
"ISSET" => ZEND_VM_EXT_ISSET,
- "ARG_NUM" => ZEND_VM_EXT_ARG_NUM,
"REF" => ZEND_VM_EXT_REF,
"SRC" => ZEND_VM_EXT_SRC,
+ "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT,
);
$vm_kind_name = array(
@@ -150,12 +151,12 @@ $op_types = array(
$op_types_ex = array(
"ANY",
"CONST",
+ "TMPVARCV",
+ "TMPVAR",
"TMP",
"VAR",
"UNUSED",
"CV",
- "TMPVAR",
- "TMPVARCV",
);
$prefix = array(
@@ -169,17 +170,6 @@ $prefix = array(
"TMPVARCV" => "_TMPVARCV",
);
-$typecode = array(
- "ANY" => 0,
- "TMP" => 1,
- "VAR" => 2,
- "CONST" => 0,
- "UNUSED" => 3,
- "CV" => 4,
- "TMPVAR" => 0,
- "TMPVARCV" => 0,
-);
-
$commutative_order = array(
"ANY" => 0,
"TMP" => 1,
@@ -239,7 +229,7 @@ $op1_get_zval_ptr = array(
"ANY" => "get_zval_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
@@ -250,7 +240,7 @@ $op2_get_zval_ptr = array(
"ANY" => "get_zval_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
@@ -283,7 +273,7 @@ $op1_get_zval_ptr_deref = array(
"ANY" => "get_zval_ptr_deref(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
@@ -294,7 +284,7 @@ $op2_get_zval_ptr_deref = array(
"ANY" => "get_zval_ptr_deref(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
@@ -305,9 +295,9 @@ $op1_get_zval_ptr_undef = array(
"ANY" => "get_zval_ptr_undef(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
"UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC)",
+ "CV" => "EX_VAR(opline->op1.var)",
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"TMPVARCV" => "EX_VAR(opline->op1.var)",
);
@@ -316,9 +306,9 @@ $op2_get_zval_ptr_undef = array(
"ANY" => "get_zval_ptr_undef(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
"UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC)",
+ "CV" => "EX_VAR(opline->op2.var)",
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"TMPVARCV" => "EX_VAR(opline->op2.var)",
);
@@ -329,7 +319,7 @@ $op1_get_zval_ptr_ptr_undef = array(
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"CONST" => "NULL",
"UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_undef_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "CV" => "EX_VAR(opline->op1.var)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
@@ -340,7 +330,7 @@ $op2_get_zval_ptr_ptr_undef = array(
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"CONST" => "NULL",
"UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_undef_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "CV" => "EX_VAR(opline->op2.var)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
@@ -349,8 +339,8 @@ $op1_get_obj_zval_ptr = array(
"ANY" => "get_obj_zval_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"TMPVARCV" => "???",
@@ -360,8 +350,8 @@ $op2_get_obj_zval_ptr = array(
"ANY" => "get_obj_zval_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"TMPVARCV" => "???",
@@ -371,9 +361,9 @@ $op1_get_obj_zval_ptr_undef = array(
"ANY" => "get_obj_zval_ptr_undef(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
- "CV" => "_get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op1.var)",
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"TMPVARCV" => "EX_VAR(opline->op1.var)",
);
@@ -382,9 +372,9 @@ $op2_get_obj_zval_ptr_undef = array(
"ANY" => "get_obj_zval_ptr_undef(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
- "CV" => "_get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op2.var)",
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"TMPVARCV" => "EX_VAR(opline->op2.var)",
);
@@ -393,8 +383,8 @@ $op1_get_obj_zval_ptr_deref = array(
"ANY" => "get_obj_zval_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op1)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "CONST" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
@@ -404,8 +394,8 @@ $op2_get_obj_zval_ptr_deref = array(
"ANY" => "get_obj_zval_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT(opline->op2)",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "CONST" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
@@ -416,7 +406,7 @@ $op1_get_obj_zval_ptr_ptr = array(
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
@@ -427,7 +417,7 @@ $op2_get_obj_zval_ptr_ptr = array(
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
+ "UNUSED" => "&EX(This)",
"CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
@@ -438,8 +428,8 @@ $op1_get_obj_zval_ptr_ptr_undef = array(
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
- "CV" => "_get_zval_ptr_cv_undef_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op1.var)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
@@ -449,8 +439,8 @@ $op2_get_obj_zval_ptr_ptr_undef = array(
"TMP" => "NULL",
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
"CONST" => "NULL",
- "UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
- "CV" => "_get_zval_ptr_cv_undef_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op2.var)",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
@@ -555,10 +545,10 @@ $op_data_type = array(
);
$op_data_get_zval_ptr = array(
- "ANY" => "get_zval_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1)",
+ "ANY" => "get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data)",
"TMP" => "_get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT((opline+1)->op1)",
+ "CONST" => "RT_CONSTANT((opline+1), (opline+1)->op1)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1((opline+1)->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "_get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
@@ -566,10 +556,10 @@ $op_data_get_zval_ptr = array(
);
$op_data_get_zval_ptr_deref = array(
- "ANY" => "get_zval_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1)",
+ "ANY" => "get_op_data_zval_ptr_deref_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data)",
"TMP" => "_get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
"VAR" => "_get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
- "CONST" => "EX_CONSTANT((opline+1)->op1)",
+ "CONST" => "RT_CONSTANT((opline+1), (opline+1)->op1)",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_deref_\\1((opline+1)->op1.var EXECUTE_DATA_CC)",
"TMPVAR" => "???",
@@ -623,6 +613,16 @@ function out_line($f) {
++$line_no;
}
+function is_hot_helper($name) {
+ global $helpers;
+
+ if (isset($helpers[$name]["hot"])) {
+ return $helpers[$name]["hot"];
+ } else {
+ return false;
+ }
+}
+
// Returns name of specialized helper
function helper_name($name, $spec, $op1, $op2, $extra_spec) {
global $prefix, $helpers;
@@ -632,13 +632,33 @@ function helper_name($name, $spec, $op1, $op2, $extra_spec) {
if (isset($helpers[$name])) {
// If we haven't helper with specified spicialized operands then
// using unspecialized helper
- if (!isset($helpers[$name]["op1"][$op1]) &&
- isset($helpers[$name]["op1"]["ANY"])) {
- $op1 = "ANY";
+ if (!isset($helpers[$name]["op1"][$op1])) {
+ if (($op1 == 'TMP' || $op1 == 'VAR') &&
+ isset($helpers[$name]["op1"]["TMPVAR"])) {
+ $op1 = "TMPVAR";
+ } else if (($op1 == 'TMP' || $op1 == 'VAR') &&
+ isset($helpers[$name]["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else if ($op1 == 'CV' &&
+ isset($helpers[$name]["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else if (isset($helpers[$name]["op1"]["ANY"])) {
+ $op1 = "ANY";
+ }
}
- if (!isset($helpers[$name]["op2"][$op2]) &&
- isset($helpers[$name]["op2"]["ANY"])) {
- $op2 = "ANY";
+ if (!isset($helpers[$name]["op2"][$op2])) {
+ if (($op2 == 'TMP' || $op2 == 'VAR') &&
+ isset($helpers[$name]["op2"]["TMPVAR"])) {
+ $op2 = "TMPVAR";
+ } else if (($op2 == 'TMP' || $op2 == 'VAR') &&
+ isset($helpers[$name]["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else if ($op2 == 'CV' &&
+ isset($helpers[$name]["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else if (isset($helpers[$name]["op2"]["ANY"])) {
+ $op2 = "ANY";
+ }
}
/* forward common specs (e.g. in ZEND_VM_DISPATCH_TO_HELPER) */
if (isset($extra_spec, $helpers[$name]["spec"])) {
@@ -655,13 +675,39 @@ function opcode_name($name, $spec, $op1, $op2) {
$opcode = $opcodes[$opnames[$name]];
// If we haven't helper with specified spicialized operands then
// using unspecialized helper
- if (!isset($opcode["op1"][$op1]) &&
- isset($opcode["op1"]["ANY"])) {
- $op1 = "ANY";
+ if (!isset($opcode["op1"][$op1])) {
+ if (($op1 == 'TMP' || $op1 == 'VAR') &&
+ isset($opcode["op1"]["TMPVAR"])) {
+ $op1 = "TMPVAR";
+ } else if (($op1 == 'TMP' || $op1 == 'VAR') &&
+ isset($opcode["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else if ($op1 == 'CV' &&
+ isset($opcode["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else if (isset($opcode["op1"]["ANY"])) {
+ $op1 = "ANY";
+ } else if ($spec) {
+ /* dispatch to invalid handler from unreachable code */
+ return "ZEND_NULL";
+ }
}
- if (!isset($opcode["op2"][$op2]) &&
- isset($opcode["op2"]["ANY"])) {
- $op2 = "ANY";
+ if (!isset($opcode["op2"][$op2])) {
+ if (($op2 == 'TMP' || $op2 == 'VAR') &&
+ isset($opcode["op2"]["TMPVAR"])) {
+ $op2 = "TMPVAR";
+ } else if (($op2 == 'TMP' || $op2 == 'VAR') &&
+ isset($opcode["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else if ($op2 == 'CV' &&
+ isset($opcode["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else if (isset($opcode["op2"]["ANY"])) {
+ $op2 = "ANY";
+ } else if ($spec) {
+ /* dispatch to unknown handler in unreachable code */
+ return "ZEND_NULL";
+ }
}
}
return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2];
@@ -754,6 +800,8 @@ 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_ISEMPTY/",
+ "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/",
),
array(
$op1_type[$op1],
@@ -820,6 +868,12 @@ 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['ISSET']) ?
+ ($extra_spec['ISSET'] == 0 ? "0" : "1")
+ : "\\0",
+ isset($extra_spec['ISSET']) ?
+ ($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
+ : "\\0",
),
$code);
@@ -828,6 +882,41 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp
}
// Updating code according to selected threading model
switch($kind) {
+ case ZEND_VM_KIND_HYBRID:
+ $code = preg_replace_callback(
+ array(
+ "/EXECUTE_DATA(?=[^_])/m",
+ "/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m",
+ "/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*(,[^)]*)?\)/m",
+ ),
+ function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) {
+ 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) {
+ global $opcodes, $opnames;
+
+ $name = $matches[1];
+ $opcode = $opcodes[$opnames[$name]];
+ if (is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
+ return "goto " . opcode_name($name, $spec, $op1, $op2) . "_LABEL";
+ } else {
+ return "ZEND_VM_TAIL_CALL(" . opcode_name($name, $spec, $op1, $op2) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))";
+ }
+ } else {
+ // ZEND_VM_DISPATCH_TO_HELPER
+ if (isset($matches[2])) {
+ // extra args
+ $args = substr(preg_replace("/,\s*[A-Za-z_]*\s*,\s*([^,)\s]*)\s*/", ", $1", $matches[2]), 2);
+ return "ZEND_VM_TAIL_CALL(" . helper_name($matches[1], $spec, $op1, $op2, $extra_spec) . "(" . $args. " ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC))";
+ }
+ if (is_hot_helper($matches[1])) {
+ return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ }
+ return "ZEND_VM_TAIL_CALL(" . helper_name($matches[1], $spec, $op1, $op2, $extra_spec) . "(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))";
+ }
+ },
+ $code);
+ break;
case ZEND_VM_KIND_CALL:
$code = preg_replace_callback(
array(
@@ -959,7 +1048,7 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) {
}
if (isset($extra_spec["COMMUTATIVE"]) &&
- $commutative_order[$op1] > $commutative_order[$op2]) {
+ $commutative_order[$op1] < $commutative_order[$op2]) {
// Skip duplicate commutative handlers
return true;
}
@@ -974,9 +1063,44 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) {
return false;
}
+function is_hot_handler($hot, $op1, $op2, $extra_spec) {
+ if ($hot === 'HOT_') {
+ return true;
+ } else if ($hot === 'HOT_NOCONST_') {
+ return ($op1 !== 'CONST');
+ } else if ($hot === 'HOT_OBJ_') {
+ return (($op1 === 'UNUSED') || ($op1 === 'CV')) && ($op2 === 'CONST');
+ } else if ($hot === 'HOT_SEND_') {
+ return !empty($extra_spec["QUICK_ARG"]);
+ } else {
+ return false;
+ }
+}
+
+function is_cold_handler($hot, $op1, $op2, $extra_spec) {
+ if ($hot === 'COLD_') {
+ return true;
+ } else if ($hot === 'COLD_CONST_') {
+ return ($op1 === 'CONST');
+ } else if ($hot === 'COLD_CONSTCONST_') {
+ return ($op1 === 'CONST' && $op2 === 'CONST');
+ } else if ($hot === 'HOT_OBJ_') {
+ return ($op1 === 'CONST');
+ } else if ($hot === 'HOT_NOCONST_') {
+ return ($op1 === 'CONST');
+ } else {
+ return false;
+ }
+}
+
+function is_inline_hybrid_handler($name, $hot, $op1, $op2, $extra_spec) {
+ return $name == "ZEND_RETURN";
+ //return $hot && is_hot_handler($hot, $op1, $op2, $extra_spec);
+}
+
// Generates opcode handler
function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno, $opcode, $extra_spec = null, &$switch_labels = array()) {
- global $definition_file, $prefix, $typecode, $opnames;
+ global $definition_file, $prefix, $opnames, $gen_order;
if ($spec && skip_extra_spec_function($op1, $op2, $extra_spec)) {
return;
@@ -990,13 +1114,33 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
$spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
switch($kind) {
case ZEND_VM_KIND_HYBRID:
- out($f,"\t\t\tHYBRID_CASE({$spec_name}):\n");
- out($f,"\t\t\t\t{$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- out($f,"\t\t\t\tHYBRID_BREAK();\n");
+ if (is_inline_hybrid_handler($name, $opcode["hot"], $op1, $op2, $extra_spec)) {
+ $out = fopen('php://memory', 'w+');
+ gen_code($out, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
+ rewind($out);
+ $code =
+ "\t\t\tHYBRID_CASE({$spec_name}):\n"
+ . "\t\t\t\tVM_TRACE($spec_name)\n"
+ . stream_get_contents($out);
+ fclose($out);
+ } else {
+ $code =
+ "\t\t\tHYBRID_CASE({$spec_name}):\n"
+ . "\t\t\t\tVM_TRACE($spec_name)\n"
+ . "\t\t\t\t{$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"
+ . "\t\t\t\tHYBRID_BREAK();\n";
+ }
+ if (is_array($gen_order)) {
+ $gen_order[$spec_name] = $code;
+ } else {
+ out($f, $code);
+ }
return;
case ZEND_VM_KIND_CALL:
- if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
+ if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
out($f,"static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
+ } else if ($opcode["hot"] && is_cold_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
+ out($f,"static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
} else {
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
}
@@ -1026,10 +1170,10 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
}
// Generates helper
-function gen_helper($f, $spec, $kind, $name, $op1, $op2, $param, $code, $lineno, $inline, $extra_spec = null) {
+function gen_helper($f, $spec, $kind, $name, $op1, $op2, $param, $code, $lineno, $inline, $cold = false, $hot = false, $extra_spec = null) {
global $definition_file, $prefix;
- if ($kind == ZEND_VM_KIND_HYBRID) {
+ if ($kind == ZEND_VM_KIND_HYBRID && !$hot) {
return;
}
@@ -1045,20 +1189,27 @@ function gen_helper($f, $spec, $kind, $name, $op1, $op2, $param, $code, $lineno,
// Generate helper's entry point according to selected threading model
switch($kind) {
+ case ZEND_VM_KIND_HYBRID:
+ out($f, $spec_name . "_LABEL:\n");
+ break;
case ZEND_VM_KIND_CALL:
if ($inline) {
- $zend_always_inline = " zend_always_inline";
+ $zend_attributes = " zend_always_inline";
$zend_fastcall = "";
} else {
- $zend_always_inline = "";
+ if ($cold) {
+ $zend_attributes = " zend_never_inline ZEND_COLD";
+ } else {
+ $zend_attributes = "";
+ }
$zend_fastcall = " ZEND_FASTCALL";
}
if ($param == null) {
// Helper without parameters
- out($f, "static$zend_always_inline ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name(ZEND_OPCODE_HANDLER_ARGS)\n");
+ out($f, "static$zend_attributes ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name(ZEND_OPCODE_HANDLER_ARGS)\n");
} else {
// Helper with parameter
- out($f, "static$zend_always_inline ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name($param ZEND_OPCODE_HANDLER_ARGS_DC)\n");
+ out($f, "static$zend_attributes ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name($param ZEND_OPCODE_HANDLER_ARGS_DC)\n");
}
break;
case ZEND_VM_KIND_SWITCH:
@@ -1090,8 +1241,9 @@ function gen_null_label($f, $kind, $prolog) {
// Generates array of opcode handlers (specialized or unspecialized)
function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()) {
- global $opcodes, $op_types, $prefix;
+ global $opcodes, $op_types, $prefix, $op_types_ex;
+ $list = [];
$next = 0;
$label = 0;
if ($spec) {
@@ -1101,21 +1253,40 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
foreach($opcodes as $num => $dsc) {
$specs[$num] = "$label";
$spec_op1 = $spec_op2 = $spec_extra = false;
+ $def_op1_type = $def_op2_type = "ANY";
$next = $num + 1;
- $diff = array_diff_key(array_flip($op_types), isset($dsc["op1"]) ? $dsc["op1"] : array());
- if ((count($diff) == count($op_types) - 1 ? isset($diff["ANY"]) : count($diff) != count($op_types)) || isset($dsc["op1"]["TMPVAR"]) || isset($dsc["op1"]["TMPVARCV"])) {
- $spec_op1 = true;
- $specs[$num] .= " | SPEC_RULE_OP1";
+ if (isset($dsc["op1"]) && !isset($dsc["op1"]["ANY"])) {
+ $count = 0;
+ foreach ($op_types_ex as $t) {
+ if (isset($dsc["op1"][$t])) {
+ $def_op1_type = $t;
+ $count++;
+ }
+ }
+ if ($count > 1) {
+ $spec_op1 = true;
+ $specs[$num] .= " | SPEC_RULE_OP1";
+ $def_op1_type = "ANY";
+ }
}
- $diff = array_diff_key(array_flip($op_types), isset($dsc["op2"]) ? $dsc["op2"] : array());
- if ((count($diff) == count($op_types) - 1 ? isset($diff["ANY"]) : count($diff) != count($op_types)) || isset($dsc["op2"]["TMPVAR"]) || isset($dsc["op2"]["TMPVARCV"])) {
- $spec_op2 = true;
- $specs[$num] .= " | SPEC_RULE_OP2";
+ if (isset($dsc["op2"]) && !isset($dsc["op2"]["ANY"])) {
+ $count = 0;
+ foreach ($op_types_ex as $t) {
+ if (isset($dsc["op2"][$t])) {
+ $def_op2_type = $t;
+ $count++;
+ }
+ }
+ if ($count > 1) {
+ $spec_op2 = true;
+ $specs[$num] .= " | SPEC_RULE_OP2";
+ $def_op2_type = "ANY";
+ }
}
$spec_extra = call_user_func_array("array_merge", extra_spec_handler($dsc) ?: array(array()));
$flags = extra_spec_flags($spec_extra);
if ($flags) {
- $specs[$num] .= " | ".implode("|", $flags);
+ $specs[$num] .= " | " . implode(" | ", $flags);
}
if ($num >= 256) {
$opcodes[$num]['spec_code'] = $specs[$num];
@@ -1123,7 +1294,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
}
$foreach_op1 = function($do) use ($dsc, $op_types) {
- return function() use ($do, $dsc, $op_types) {
+ return function($_, $op2) use ($do, $dsc, $op_types) {
// For each op1.op_type except ANY
foreach($op_types as $op1) {
if ($op1 != "ANY") {
@@ -1143,13 +1314,13 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$op1 = "ANY";
}
}
- $do($op1, "ANY");
+ $do($op1, $op2);
}
}
};
};
$foreach_op2 = function($do) use ($dsc, $op_types) {
- return function($op1) use ($do, $dsc, $op_types) {
+ return function($op1, $_) use ($do, $dsc, $op_types) {
// For each op2.op_type except ANY
foreach($op_types as $op2) {
if ($op2 != "ANY") {
@@ -1208,8 +1379,8 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
}
};
};
- $generate = function ($op1, $op2, $extra_spec = array()) use ($f, $kind, $dsc, $prefix, $prolog, $num, $switch_labels, &$label) {
- global $typecode, $commutative_order;
+ $generate = function ($op1, $op2, $extra_spec = array()) use ($f, $kind, $dsc, $prefix, $prolog, $num, $switch_labels, &$label, &$list) {
+ global $commutative_order;
// Check if specialized handler is defined
/* TODO: figure out better way to signal "specialized and not defined" than an extra lookup */
@@ -1218,6 +1389,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
(!isset($extra_spec["OP_DATA"]) || isset($dsc["spec"]["OP_DATA"][$extra_spec["OP_DATA"]]))) {
if (skip_extra_spec_function($op1, $op2, $extra_spec)) {
gen_null_label($f, $kind, $prolog);
+ $list[$label] = null;
$label++;
return;
}
@@ -1227,20 +1399,20 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
switch ($kind) {
case ZEND_VM_KIND_CALL:
out($f,"$prolog{$spec_name}_HANDLER,\n");
- $label++;
break;
case ZEND_VM_KIND_SWITCH:
out($f,$prolog."(void*)(uintptr_t)$switch_labels[$spec_name],\n");
- $label++;
break;
case ZEND_VM_KIND_GOTO:
out($f,$prolog."(void*)&&{$spec_name}_LABEL,\n");
- $label++;
break;
}
+ $list[$label] = $spec_name;
+ $label++;
} else {
// Emit pointer to handler of undefined opcode
gen_null_label($f, $kind, $prolog);
+ $list[$label] = null;
$label++;
}
};
@@ -1262,7 +1434,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$do = $foreach_op1($do);
}
- $do("ANY", "ANY");
+ $do($def_op1_type, $def_op2_type);
}
} else {
// Emit labels for unspecialized executor
@@ -1304,6 +1476,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
out($f,$prolog."(void*)&&".$dsc["op"]."_LABEL,\n");
break;
}
+ $list[] = $dsc["op"];
} else {
switch ($kind) {
case ZEND_VM_KIND_CALL:
@@ -1316,6 +1489,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
break;
}
+ $list[] = null;
}
}
}
@@ -1333,6 +1507,16 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
break;
}
$specs[$num + 1] = "$label";
+
+ $l = fopen(__DIR__ . "/zend_vm_handlers.h", "w+") or die("ERROR: Cannot create zend_vm_handlers.h\n");
+ out($l, "#define VM_HANDLERS(_) \\\n");
+ foreach ($list as $n => $name) {
+ if (!is_null($name)) {
+ out($l, "\t_($n, $name) \\\n");
+ }
+ }
+ out($l, "\t_($n+1, ZEND_NULL)\n");
+ fclose($l);
}
// Generates specialized offsets
@@ -1396,6 +1580,13 @@ function extra_spec_name($extra_spec) {
$s .= "_OBJ";
}
}
+ if (isset($extra_spec["ISSET"])) {
+ if ($extra_spec["ISSET"] == 0) {
+ $s .= "_SET";
+ } else {
+ $s .= "_EMPTY";
+ }
+ }
return $s;
}
@@ -1416,6 +1607,12 @@ function extra_spec_flags($extra_spec) {
if (isset($extra_spec["DIM_OBJ"])) {
$s[] = "SPEC_RULE_DIM_OBJ";
}
+ if (isset($extra_spec["COMMUTATIVE"])) {
+ $s[] = "SPEC_RULE_COMMUTATIVE";
+ }
+ if (isset($extra_spec["ISSET"])) {
+ $s[] = "SPEC_RULE_ISSET";
+ }
return $s;
}
@@ -1456,9 +1653,31 @@ function extra_spec_handler($dsc) {
return $f($specs);
}
+function read_order_file($fn) {
+ $f = fopen($fn, "r");
+ if (!is_resource($f)) {
+ return false;
+ }
+ $order = [];
+ while (!feof($f)) {
+ $op = trim(fgets($f));
+ if ($op !== "") {
+ $order[$op] = null;
+ }
+ }
+ fclose($f);
+ return $order;
+}
+
// Generates all opcode handlers and helpers (specialized or unspecilaized)
function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array()) {
- global $list, $opcodes, $helpers, $op_types_ex;
+ global $list, $opcodes, $helpers, $op_types_ex, $gen_order;
+
+ if ($kind == ZEND_VM_KIND_HYBRID && file_exists(__DIR__ . "/zend_vm_order.txt")) {
+ $gen_order = read_order_file(__DIR__ . "/zend_vm_order.txt");
+ } else {
+ $gen_order = null;
+ }
if ($spec) {
// Produce specialized executor
@@ -1487,7 +1706,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
if (isset($helpers[$num]["op1"][$op1]) &&
isset($helpers[$num]["op2"][$op2])) {
// Generate helper code
- gen_helper($f, 1, $kind, $num, $op1, $op2, $helpers[$num]["param"], $helpers[$num]["code"], $lineno, $helpers[$num]["inline"], $extra_spec);
+ gen_helper($f, 1, $kind, $num, $op1, $op2, $helpers[$num]["param"], $helpers[$num]["code"], $lineno, $helpers[$num]["inline"], $helpers[$num]["cold"], $helpers[$num]["hot"], $extra_spec);
}
}
} else {
@@ -1511,7 +1730,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
} else if (isset($dsc["helper"])) {
$num = $dsc["helper"];
// Generate helper code
- gen_helper($f, 0, $kind, $num, "ANY", "ANY", $helpers[$num]["param"], $helpers[$num]["code"], $lineno, $helpers[$num]["inline"]);
+ gen_helper($f, 0, $kind, $num, "ANY", "ANY", $helpers[$num]["param"], $helpers[$num]["code"], $lineno, $helpers[$num]["inline"], $helpers[$num]["cold"], $helpers[$num]["hot"]);
} else {
var_dump($dsc);
die("??? $kind:$num\n");
@@ -1519,6 +1738,14 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
}
}
+ if (is_array($gen_order)) {
+ foreach ($gen_order as $txt) {
+ if ($txt !== null) {
+ out($f, $txt);
+ }
+ }
+ }
+
if (ZEND_VM_LINES) {
// Reset #line directives
out_line($f);
@@ -1530,7 +1757,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
gen_null_handler($f);
break;
case ZEND_VM_KIND_SWITCH:
- out($f,"default:\n");
+ out($f,"default: ZEND_NULL_LABEL:\n");
out($f,"\tzend_error_noreturn(E_ERROR, \"Invalid opcode %d/%d/%d.\", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);\n");
out($f,"\tZEND_VM_NEXT_OPCODE(); /* Never reached */\n");
break;
@@ -1545,7 +1772,8 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
out($f,"\t\t\t\topline = orig_opline;\n");
out($f,"\t\t\t\treturn;\n");
out($f,"\t\t\tHYBRID_DEFAULT:\n");
- out($f,"\t\t\t\tzend_error_noreturn(E_ERROR, \"Invalid opcode %d/%d/%d.\", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);\n");
+ out($f,"\t\t\t\tVM_TRACE(ZEND_NULL)\n");
+ out($f,"\t\t\t\tZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
out($f,"\t\t\t\tHYBRID_BREAK(); /* Never reached */\n");
break;
}
@@ -1570,6 +1798,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
switch ($m[2]) {
case "DEFINES":
out($f,"#define SPEC_START_MASK 0x0000ffff\n");
+ out($f,"#define SPEC_EXTRA_MASK 0xfffc0000\n");
out($f,"#define SPEC_RULE_OP1 0x00010000\n");
out($f,"#define SPEC_RULE_OP2 0x00020000\n");
out($f,"#define SPEC_RULE_OP_DATA 0x00040000\n");
@@ -1577,17 +1806,21 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"#define SPEC_RULE_QUICK_ARG 0x00100000\n");
out($f,"#define SPEC_RULE_SMART_BRANCH 0x00200000\n");
out($f,"#define SPEC_RULE_DIM_OBJ 0x00400000\n");
+ out($f,"#define SPEC_RULE_COMMUTATIVE 0x00800000\n");
+ out($f,"#define SPEC_RULE_ISSET 0x01000000\n");
out($f,"\n");
out($f,"static const uint32_t *zend_spec_handlers;\n");
- out($f,"static const void **zend_opcode_handlers;\n");
+ out($f,"static const void * const *zend_opcode_handlers;\n");
out($f,"static int zend_handlers_count;\n");
if ($kind == ZEND_VM_KIND_HYBRID) {
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- out($f,"static const void **zend_opcode_handler_funcs;\n");
+ out($f,"static const void * const * zend_opcode_handler_funcs;\n");
out($f,"static zend_op hybrid_halt_op;\n");
out($f,"#endif\n");
}
- out($f,"static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op);\n\n");
+ out($f,"#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC\n");
+ out($f,"static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op);\n");
+ out($f,"#endif\n\n");
if ($kind == ZEND_VM_KIND_HYBRID) {
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
out($f,"static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend_op* op);\n");
@@ -1595,6 +1828,15 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"# define zend_vm_get_opcode_handler_func zend_vm_get_opcode_handler\n");
out($f,"#endif\n\n");
}
+ out($f,"#ifndef VM_TRACE\n");
+ out($f,"# define VM_TRACE(op)\n");
+ out($f,"#endif\n");
+ out($f,"#ifndef VM_TRACE_START\n");
+ out($f,"# define VM_TRACE_START()\n");
+ out($f,"#endif\n");
+ out($f,"#ifndef VM_TRACE_END\n");
+ out($f,"# define VM_TRACE_END()\n");
+ out($f,"#endif\n");
switch ($kind) {
case ZEND_VM_KIND_HYBRID:
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
@@ -1629,13 +1871,16 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
if ($kind == ZEND_VM_KIND_HYBRID) {
out($f,"# if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
out($f,"# define ZEND_VM_RETURN() opline = &hybrid_halt_op; return\n");
- out($f,"# define ZEND_VM_HOT zend_always_inline\n");
+ out($f,"# define ZEND_VM_HOT zend_always_inline ZEND_COLD ZEND_OPT_SIZE\n");
+ out($f,"# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE\n");
out($f,"# else\n");
out($f,"# define ZEND_VM_RETURN() opline = NULL; return\n");
out($f,"# define ZEND_VM_HOT\n");
+ out($f,"# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE\n");
out($f,"# endif\n");
} else {
out($f,"# define ZEND_VM_RETURN() opline = NULL; return\n");
+ out($f,"# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE\n");
}
out($f,"#else\n");
out($f,"# define ZEND_OPCODE_HANDLER_RET int\n");
@@ -1644,6 +1889,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"# define ZEND_VM_RETURN() return -1\n");
if ($kind == ZEND_VM_KIND_HYBRID) {
out($f,"# define ZEND_VM_HOT\n");
+ out($f,"# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE\n");
}
out($f,"#endif\n");
out($f,"\n");
@@ -1674,12 +1920,15 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n");
- out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n");
out($f,"# define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n");
out($f,"#elif defined(ZEND_VM_IP_GLOBAL_REG)\n");
- out($f,"# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; return 1\n");
+ out($f,"# define ZEND_VM_ENTER_EX() return 1\n");
+ out($f,"# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; ZEND_VM_ENTER_EX()\n");
out($f,"# define ZEND_VM_LEAVE() return 2\n");
out($f,"#else\n");
+ out($f,"# define ZEND_VM_ENTER_EX() return 1\n");
out($f,"# define ZEND_VM_ENTER() return 1\n");
out($f,"# define ZEND_VM_LEAVE() return 2\n");
out($f,"#endif\n");
@@ -1691,7 +1940,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"#define ZEND_VM_DISPATCH(opcode, opline) ZEND_VM_TAIL_CALL(((opcode_handler_t)zend_vm_get_opcode_handler(opcode, opline))(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
}
out($f,"\n");
- out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS);");
+ out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS);\n");
+ out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
out($f,"\n");
break;
case ZEND_VM_KIND_SWITCH:
@@ -1718,7 +1968,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n");
out($f,"#define ZEND_VM_RETURN() return\n");
- out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n");
out($f,"#define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n");
out($f,"#define ZEND_VM_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n");
out($f,"#define ZEND_VM_LOOP_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n");
@@ -1754,7 +2005,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
}
out($f,"#define ZEND_VM_CONTINUE() goto *(void**)(OPLINE->handler)\n");
out($f,"#define ZEND_VM_RETURN() return\n");
- out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n");
out($f,"#define ZEND_VM_LEAVE() ZEND_VM_CONTINUE()\n");
out($f,"#define ZEND_VM_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n");
out($f,"#define ZEND_VM_LOOP_INTERRUPT() goto zend_interrupt_helper".($spec?"_SPEC":"").";\n");
@@ -1764,6 +2016,18 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
}
if ($kind == ZEND_VM_KIND_HYBRID) {
gen_executor_code($f, $spec, ZEND_VM_KIND_CALL, $m[1]);
+ out($f,"\n");
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ out($f,"# undef ZEND_VM_TAIL_CALL\n");
+ out($f,"# undef ZEND_VM_CONTINUE\n");
+ out($f,"# undef ZEND_VM_RETURN\n");
+// out($f,"# undef ZEND_VM_INTERRUPT\n");
+ out($f,"\n");
+ out($f,"# define ZEND_VM_TAIL_CALL(call) call; ZEND_VM_CONTINUE()\n");
+ out($f,"# define ZEND_VM_CONTINUE() HYBRID_NEXT()\n");
+ out($f,"# define ZEND_VM_RETURN() goto HYBRID_HALT_LABEL\n");
+// out($f,"# define ZEND_VM_INTERRUPT() goto zend_interrupt_helper_SPEC_LABEL\n");
+ out($f,"#endif\n\n");
}
break;
case "EXECUTOR_NAME":
@@ -1804,7 +2068,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
}
$prolog = $m[1];
out($f,$prolog."if (UNEXPECTED(execute_data == NULL)) {\n");
- out($f,$prolog."\tstatic const void* labels[] = {\n");
+ out($f,$prolog."\tstatic const void * const labels[] = {\n");
gen_labels($f, $spec, ($kind == ZEND_VM_KIND_HYBRID) ? ZEND_VM_KIND_GOTO : $kind, $prolog."\t\t", $specs);
out($f,$prolog."\t};\n");
out($f,$prolog."\tzend_opcode_handlers = (const void **) labels;\n");
@@ -1919,7 +2183,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
out($f,$prolog."zend_spec_handlers = specs;\n");
out($f,$prolog.$executor_name."_ex(NULL);\n");
} else {
- out($f,$prolog."static const void *labels[] = {\n");
+ out($f,$prolog."static const void * const labels[] = {\n");
gen_labels($f, $spec, ($kind == ZEND_VM_KIND_HYBRID) ? ZEND_VM_KIND_CALL : $kind, $prolog."\t", $specs, $switch_labels);
out($f,$prolog."};\n");
out($f,$prolog."static const uint32_t specs[] = {\n");
@@ -2024,6 +2288,9 @@ function parse_spec_rules($def, $lineno, $str) {
case "COMMUTATIVE":
$ret["COMMUTATIVE"] = array(1);
break;
+ case "ISSET":
+ $ret["ISSET"] = array(0, 1);
+ break;
default:
die("ERROR ($def:$lineno): Wrong specialization rules '$str'\n");
}
@@ -2065,15 +2332,21 @@ function gen_vm($def, $skel) {
foreach ($in as $line) {
++$lineno;
if (strpos($line,"ZEND_VM_HANDLER(") === 0 ||
- strpos($line,"ZEND_VM_HOT_HANDLER(") === 0) {
+ strpos($line,"ZEND_VM_HOT_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_NOCONST_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_SEND_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_OBJ_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_COLD_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_COLD_CONST_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_COLD_CONSTCONST_HANDLER(") === 0) {
// Parsing opcode handler's definition
if (preg_match(
- "/^ZEND_VM_(HOT_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
+ "/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_|COLD_|COLD_CONST_|COLD_CONSTCONST_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
$line,
$m) == 0) {
die("ERROR ($def:$lineno): Invalid ZEND_VM_HANDLER definition.\n");
}
- $hot = !empty($m[1]);
+ $hot = !empty($m[1]) ? $m[1] : false;
$code = (int)$m[2];
$op = $m[3];
$len = strlen($op);
@@ -2111,15 +2384,18 @@ function gen_vm($def, $skel) {
$helper = null;
$list[$lineno] = array("handler"=>$handler);
} else if (strpos($line,"ZEND_VM_TYPE_SPEC_HANDLER(") === 0 ||
- strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0) {
+ strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_NOCONST_TYPE_SPEC_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_SEND_TYPE_SPEC_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_OBJ_TYPE_SPEC_HANDLER(") === 0) {
// Parsing opcode handler's definition
if (preg_match(
- "/^ZEND_VM_(HOT_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*([^,]+),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
+ "/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
$line,
$m) == 0) {
die("ERROR ($def:$lineno): Invalid ZEND_VM_TYPE_HANDLER_HANDLER definition.\n");
}
- $hot = !empty($m[1]);
+ $hot = !empty($m[1]) ? $m[1] : false;
$orig_op = $m[2];
if (!isset($opnames[$orig_op])) {
die("ERROR ($def:$lineno): Opcode with name '$orig_op' is not defined.\n");
@@ -2140,7 +2416,7 @@ function gen_vm($def, $skel) {
}
$opcodes[$orig_code]['type_spec'][$code] = $condition;
$used_extra_spec["TYPE"] = 1;
- $opcodes[$code] = array("op"=>$op,"op1"=>$op1,"op2"=>$op2,"code"=>"","flags"=>$flags,"hot"=>$hot);
+ $opcodes[$code] = array("op"=>$op,"op1"=>$op1,"op2"=>$op2,"code"=>"","flags"=>$flags,"hot"=>$hot,"is_type_spec"=>true);
if (isset($m[10])) {
$opcodes[$code]["spec"] = parse_spec_rules($def, $lineno, $m[10]);
if (isset($opcodes[$code]["spec"]["NO_CONST_CONST"])) {
@@ -2154,15 +2430,20 @@ function gen_vm($def, $skel) {
$handler = $code;
$helper = null;
$list[$lineno] = array("handler"=>$handler);
- } else if (strpos($line,"ZEND_VM_HELPER(") === 0 || strpos($line,"ZEND_VM_INLINE_HELPER(") === 0) {
+ } else if (strpos($line,"ZEND_VM_HELPER(") === 0 ||
+ strpos($line,"ZEND_VM_INLINE_HELPER(") === 0 ||
+ strpos($line,"ZEND_VM_COLD_HELPER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_HELPER(") === 0) {
// Parsing helper's definition
if (preg_match(
- "/^ZEND_VM(_INLINE)?_HELPER\(\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(?:,\s*SPEC\(([A-Z_|=,]+)\)\s*)?(?:,\s*([^)]*)\s*)?\)/",
+ "/^ZEND_VM(_INLINE|_COLD|_HOT)?_HELPER\(\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(?:,\s*SPEC\(([A-Z_|=,]+)\)\s*)?(?:,\s*([^)]*)\s*)?\)/",
$line,
$m) == 0) {
die("ERROR ($def:$lineno): Invalid ZEND_VM_HELPER definition.\n");
}
- $inline = !empty($m[1]);
+ $inline = !empty($m[1]) && $m[1] === "_INLINE";
+ $cold = !empty($m[1]) && $m[1] === "_COLD";
+ $hot = !empty($m[1]) && $m[1] === "_HOT";
$helper = $m[2];
$op1 = parse_operand_spec($def, $lineno, $m[3], $flags1);
$op2 = parse_operand_spec($def, $lineno, $m[4], $flags2);
@@ -2179,7 +2460,7 @@ function gen_vm($def, $skel) {
}
}
- $helpers[$helper] = array("op1"=>$op1,"op2"=>$op2,"param"=>$param,"code"=>"","inline"=>$inline);
+ $helpers[$helper] = array("op1"=>$op1,"op2"=>$op2,"param"=>$param,"code"=>"","inline"=>$inline,"cold"=>$cold,"hot"=>$hot);
if (!empty($m[5])) {
$helpers[$helper]["spec"] = parse_spec_rules($def, $lineno, $m[5]);
@@ -2247,13 +2528,15 @@ function gen_vm($def, $skel) {
// Search for opcode handlers those are used by other opcode handlers
foreach ($opcodes as $dsc) {
- if (preg_match("/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m", $dsc["code"], $m)) {
- $op = $m[1];
- if (!isset($opnames[$op])) {
- die("ERROR ($def:$lineno): Opcode with name '$op' is not defined.\n");
+ if (preg_match_all("/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m", $dsc["code"], $mm, PREG_SET_ORDER)) {
+ foreach ($mm as $m) {
+ $op = $m[1];
+ if (!isset($opnames[$op])) {
+ die("ERROR ($def:$lineno): Opcode with name '$op' is not defined.\n");
+ }
+ $code = $opnames[$op];
+ $opcodes[$code]['use'] = 1;
}
- $code = $opnames[$op];
- $opcodes[$code]['use'] = 1;
}
}
@@ -2288,8 +2571,8 @@ function gen_vm($def, $skel) {
fputs($f, "#define ZEND_VM_OP2_FLAGS(flags) ((flags >> 8) & 0xff)\n");
fputs($f, "\n");
fputs($f, "BEGIN_EXTERN_C()\n\n");
- fputs($f, "ZEND_API const char *zend_get_opcode_name(zend_uchar opcode);\n");
- fputs($f, "ZEND_API uint32_t zend_get_opcode_flags(zend_uchar opcode);\n\n");
+ fputs($f, "ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);\n");
+ fputs($f, "ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);\n\n");
fputs($f, "END_EXTERN_C()\n\n");
foreach ($opcodes as $code => $dsc) {
@@ -2314,7 +2597,8 @@ function gen_vm($def, $skel) {
// Insert header
out($f, HEADER_TEXT);
fputs($f,"#include <stdio.h>\n");
- fputs($f,"#include <zend.h>\n\n");
+ fputs($f,"#include <zend.h>\n");
+ fputs($f,"#include <zend_vm_opcodes.h>\n\n");
fputs($f,"static const char *zend_vm_opcodes_names[".($max_opcode + 1)."] = {\n");
for ($i = 0; $i <= $max_opcode; $i++) {
@@ -2328,11 +2612,17 @@ function gen_vm($def, $skel) {
}
fputs($f, "};\n\n");
- fputs($f, "ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) {\n");
+ fputs($f, "ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {\n");
+ fputs($f, "\tif (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {\n");
+ fputs($f, "\t\treturn NULL;\n");
+ fputs($f, "\t}\n");
fputs($f, "\treturn zend_vm_opcodes_names[opcode];\n");
fputs($f, "}\n");
- fputs($f, "ZEND_API uint32_t zend_get_opcode_flags(zend_uchar opcode) {\n");
+ fputs($f, "ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {\n");
+ fputs($f, "\tif (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {\n");
+ fputs($f, "\t\topcode = ZEND_NOP;\n");
+ fputs($f, "\t}\n");
fputs($f, "\treturn zend_vm_opcodes_flags[opcode];\n");
fputs($f, "}\n");
@@ -2382,17 +2672,17 @@ function gen_vm($def, $skel) {
out($f, "255\n};\n\n");
// Generate specialized executor
- gen_executor($f, $skl, ZEND_VM_SPEC, ZEND_VM_KIND, "execute", "zend_init_opcodes_handlers");
+ gen_executor($f, $skl, ZEND_VM_SPEC, ZEND_VM_KIND, "execute", "zend_vm_init");
out($f, "\n");
// Generate zend_vm_get_opcode_handler() function
- out($f, "static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* op)\n");
+ out($f, "static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* op)\n");
out($f, "{\n");
if (!ZEND_VM_SPEC) {
out($f, "\treturn zend_opcode_handlers[spec];\n");
} else {
out($f, "\tstatic const int zend_vm_decode[] = {\n");
- out($f, "\t\t_UNUSED_CODE, /* 0 */\n");
+ out($f, "\t\t_UNUSED_CODE, /* 0 = IS_UNUSED */\n");
out($f, "\t\t_CONST_CODE, /* 1 = IS_CONST */\n");
out($f, "\t\t_TMP_CODE, /* 2 = IS_TMP_VAR */\n");
out($f, "\t\t_UNUSED_CODE, /* 3 */\n");
@@ -2400,51 +2690,66 @@ function gen_vm($def, $skel) {
out($f, "\t\t_UNUSED_CODE, /* 5 */\n");
out($f, "\t\t_UNUSED_CODE, /* 6 */\n");
out($f, "\t\t_UNUSED_CODE, /* 7 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 8 = IS_UNUSED */\n");
- out($f, "\t\t_UNUSED_CODE, /* 9 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 10 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 11 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 12 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 13 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 14 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 15 */\n");
- out($f, "\t\t_CV_CODE /* 16 = IS_CV */\n");
+ out($f, "\t\t_CV_CODE /* 8 = IS_CV */\n");
out($f, "\t};\n");
out($f, "\tuint32_t offset = 0;\n");
out($f, "\tif (spec & SPEC_RULE_OP1) offset = offset * 5 + zend_vm_decode[op->op1_type];\n");
out($f, "\tif (spec & SPEC_RULE_OP2) offset = offset * 5 + zend_vm_decode[op->op2_type];\n");
- if (isset($used_extra_spec["OP_DATA"])) {
- out($f, "\tif (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
- }
- if (isset($used_extra_spec["RETVAL"])) {
- out($f, "\tif (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);\n");
- }
- if (isset($used_extra_spec["QUICK_ARG"])) {
- out($f, "\tif (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num < MAX_ARG_FLAG_NUM);\n");
- }
- if (isset($used_extra_spec["SMART_BRANCH"])) {
- out($f, "\tif (spec & SPEC_RULE_SMART_BRANCH) {\n");
- out($f, "\t\toffset = offset * 3;\n");
- out($f, "\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
- out($f, "\t\t\toffset += 1;\n");
- out($f, "\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
- out($f, "\t\t\toffset += 2;\n");
- out($f, "\t\t}\n");
- out($f, "\t}\n");
- }
- if (isset($used_extra_spec["DIM_OBJ"])) {
- out($f, "\tif (spec & SPEC_RULE_DIM_OBJ) {\n");
- out($f, "\t\toffset = offset * 3;\n");
- out($f, "\t\tif (op->extended_value == ZEND_ASSIGN_DIM) {\n");
- out($f, "\t\t\toffset += 1;\n");
- out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n");
- out($f, "\t\t\toffset += 2;\n");
- out($f, "\t\t}\n");
+
+ if (isset($used_extra_spec["OP_DATA"]) ||
+ isset($used_extra_spec["RETVAL"]) ||
+ isset($used_extra_spec["QUICK_ARG"]) ||
+ isset($used_extra_spec["SMART_BRANCH"]) ||
+ isset($used_extra_spec["DIM_OBJ"]) ||
+ isset($used_extra_spec["ISSET"])) {
+
+ $else = "";
+ out($f, "\tif (spec & SPEC_EXTRA_MASK) {\n");
+
+ if (isset($used_extra_spec["OP_DATA"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["RETVAL"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["QUICK_ARG"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["SMART_BRANCH"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_SMART_BRANCH) {\n");
+ out($f, "\t\t\toffset = offset * 3;\n");
+ out($f, "\t\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
+ out($f, "\t\t\t\toffset += 1;\n");
+ out($f, "\t\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
+ out($f, "\t\t\t\toffset += 2;\n");
+ out($f, "\t\t\t}\n");
+ out($f, "\t\t}\n");
+ $else = "else ";
+ }
+ 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\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\t}\n");
+ out($f, "\t\t}\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["ISSET"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
+ $else = "else ";
+ }
out($f, "\t}\n");
}
out($f, "\treturn zend_opcode_handlers[(spec & SPEC_START_MASK) + offset];\n");
}
out($f, "}\n\n");
+ out($f, "#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC\n");
out($f, "static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op)\n");
out($f, "{\n");
if (!ZEND_VM_SPEC) {
@@ -2452,7 +2757,8 @@ function gen_vm($def, $skel) {
} else {
out($f, "\treturn zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);\n");
}
- out($f, "}\n\n");
+ out($f, "}\n");
+ out($f, "#endif\n\n");
if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
// Generate zend_vm_get_opcode_handler_func() function
@@ -2464,7 +2770,7 @@ function gen_vm($def, $skel) {
out($f, "\treturn zend_opcode_handler_funcs[spec];\n");
} else {
out($f, "\tstatic const int zend_vm_decode[] = {\n");
- out($f, "\t\t_UNUSED_CODE, /* 0 */\n");
+ out($f, "\t\t_UNUSED_CODE, /* 0 = IS_UNUSED */\n");
out($f, "\t\t_CONST_CODE, /* 1 = IS_CONST */\n");
out($f, "\t\t_TMP_CODE, /* 2 = IS_TMP_VAR */\n");
out($f, "\t\t_UNUSED_CODE, /* 3 */\n");
@@ -2472,48 +2778,63 @@ function gen_vm($def, $skel) {
out($f, "\t\t_UNUSED_CODE, /* 5 */\n");
out($f, "\t\t_UNUSED_CODE, /* 6 */\n");
out($f, "\t\t_UNUSED_CODE, /* 7 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 8 = IS_UNUSED */\n");
- out($f, "\t\t_UNUSED_CODE, /* 9 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 10 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 11 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 12 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 13 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 14 */\n");
- out($f, "\t\t_UNUSED_CODE, /* 15 */\n");
- out($f, "\t\t_CV_CODE /* 16 = IS_CV */\n");
+ out($f, "\t\t_CV_CODE /* 8 = IS_CV */\n");
out($f, "\t};\n");
out($f, "\tuint32_t offset = 0;\n");
out($f, "\tif (spec & SPEC_RULE_OP1) offset = offset * 5 + zend_vm_decode[op->op1_type];\n");
out($f, "\tif (spec & SPEC_RULE_OP2) offset = offset * 5 + zend_vm_decode[op->op2_type];\n");
- if (isset($used_extra_spec["OP_DATA"])) {
- out($f, "\tif (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
- }
- if (isset($used_extra_spec["RETVAL"])) {
- out($f, "\tif (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);\n");
- }
- if (isset($used_extra_spec["QUICK_ARG"])) {
- out($f, "\tif (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num < MAX_ARG_FLAG_NUM);\n");
- }
- if (isset($used_extra_spec["SMART_BRANCH"])) {
- out($f, "\tif (spec & SPEC_RULE_SMART_BRANCH) {\n");
- out($f, "\t\toffset = offset * 3;\n");
- out($f, "\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
- out($f, "\t\t\toffset += 1;\n");
- out($f, "\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
- out($f, "\t\t\toffset += 2;\n");
- out($f, "\t\t}\n");
- out($f, "\t}\n");
- }
- if (isset($used_extra_spec["DIM_OBJ"])) {
- out($f, "\tif (spec & SPEC_RULE_DIM_OBJ) {\n");
- out($f, "\t\toffset = offset * 3;\n");
- out($f, "\t\tif (op->extended_value == ZEND_ASSIGN_DIM) {\n");
- out($f, "\t\t\toffset += 1;\n");
- out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n");
- out($f, "\t\t\toffset += 2;\n");
- out($f, "\t\t}\n");
+
+ if (isset($used_extra_spec["OP_DATA"]) ||
+ isset($used_extra_spec["RETVAL"]) ||
+ isset($used_extra_spec["QUICK_ARG"]) ||
+ isset($used_extra_spec["SMART_BRANCH"]) ||
+ isset($used_extra_spec["DIM_OBJ"]) ||
+ isset($used_extra_spec["ISSET"])) {
+
+ $else = "";
+ out($f, "\tif (spec & SPEC_EXTRA_MASK) {\n");
+
+ if (isset($used_extra_spec["OP_DATA"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["RETVAL"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["QUICK_ARG"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["SMART_BRANCH"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_SMART_BRANCH) {\n");
+ out($f, "\t\t\toffset = offset * 3;\n");
+ out($f, "\t\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
+ out($f, "\t\t\t\toffset += 1;\n");
+ out($f, "\t\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
+ out($f, "\t\t\t\toffset += 2;\n");
+ out($f, "\t\t\t}\n");
+ out($f, "\t\t}\n");
+ $else = "else ";
+ }
+ 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\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\t}\n");
+ out($f, "\t\t}\n");
+ $else = "else ";
+ }
+ if (isset($used_extra_spec["ISSET"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
+ $else = "else ";
+ }
out($f, "\t}\n");
- }
+ }
+
out($f, "\treturn zend_opcode_handler_funcs[(spec & SPEC_START_MASK) + offset];\n");
}
out($f, "}\n\n");
@@ -2521,13 +2842,24 @@ function gen_vm($def, $skel) {
}
// Generate zend_vm_get_opcode_handler() function
- out($f, "ZEND_API void zend_vm_set_opcode_handler(zend_op* op)\n");
+ out($f, "ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)\n");
out($f, "{\n");
- out($f, "\top->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op);\n");
+ out($f, "\tzend_uchar opcode = zend_user_opcodes[op->opcode];\n");
+ if (!ZEND_VM_SPEC) {
+ out($f, "\top->handler = zend_vm_get_opcode_handler(opcode, op);\n");
+ } else {
+ out($f, "\n");
+ out($f, "\tif (zend_spec_handlers[op->opcode] & SPEC_RULE_COMMUTATIVE) {\n");
+ out($f, "\t\tif (op->op1_type < op->op2_type) {\n");
+ out($f, "\t\t\tzend_swap_operands(op);\n");
+ out($f, "\t\t}\n");
+ out($f, "\t}\n");
+ out($f, "\top->handler = zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);\n");
+ }
out($f, "}\n\n");
// Generate zend_vm_set_opcode_handler_ex() function
- out($f, "ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint32_t op2_info, uint32_t res_info)\n");
+ out($f, "ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint32_t op2_info, uint32_t res_info)\n");
out($f, "{\n");
out($f, "\tzend_uchar opcode = zend_user_opcodes[op->opcode];\n");
if (!ZEND_VM_SPEC) {
@@ -2540,6 +2872,11 @@ function gen_vm($def, $skel) {
if (isset($dsc['type_spec'])) {
$orig_op = $dsc['op'];
out($f, "\t\tcase $orig_op:\n");
+ if (isset($dsc["spec"]["COMMUTATIVE"])) {
+ out($f, "\t\t\tif (op->op1_type < op->op2_type) {\n");
+ out($f, "\t\t\t\tzend_swap_operands(op);\n");
+ out($f, "\t\t\t}\n");
+ }
$first = true;
foreach($dsc['type_spec'] as $code => $condition) {
$condition = format_condition($condition);
@@ -2556,8 +2893,8 @@ function gen_vm($def, $skel) {
out($f, "\t\t\t\t}\n");
}
out($f, "\t\t\t\tspec = ${spec_dsc['spec_code']};\n");
- if (isset($spec_dsc["spec"]["COMMUTATIVE"])) {
- out($f, "\t\t\t\tif (op->op1_type > op->op2_type) {\n");
+ if (isset($spec_dsc["spec"]["COMMUTATIVE"]) && !isset($dsc["spec"]["COMMUTATIVE"])) {
+ out($f, "\t\t\t\tif (op->op1_type < op->op2_type) {\n");
out($f, "\t\t\t\t\tzend_swap_operands(op);\n");
out($f, "\t\t\t\t}\n");
}
@@ -2568,6 +2905,29 @@ function gen_vm($def, $skel) {
out($f, "\t\t\tbreak;\n");
}
}
+ $has_commutative = false;
+ foreach($opcodes as $code => $dsc) {
+ if (!isset($dsc['is_type_spec']) &&
+ !isset($dsc['type_spec']) &&
+ isset($dsc["spec"]["COMMUTATIVE"])) {
+ $orig_op = $dsc['op'];
+ out($f, "\t\tcase $orig_op:\n");
+ $has_commutative = true;
+ }
+ }
+ if ($has_commutative) {
+ out($f, "\t\t\tif (op->op1_type < op->op2_type) {\n");
+ out($f, "\t\t\t\tzend_swap_operands(op);\n");
+ out($f, "\t\t\t}\n");
+ out($f, "\t\t\tbreak;\n");
+ out($f, "\t\tcase ZEND_USER_OPCODE:\n");
+ out($f, "\t\t\tif (zend_spec_handlers[op->opcode] & SPEC_RULE_COMMUTATIVE) {\n");
+ out($f, "\t\t\t\tif (op->op1_type < op->op2_type) {\n");
+ out($f, "\t\t\t\t\tzend_swap_operands(op);\n");
+ out($f, "\t\t\t\t}\n");
+ out($f, "\t\t\t}\n");
+ out($f, "\t\t\tbreak;\n");
+ }
out($f, "\t\tdefault:\n");
out($f, "\t\t\tbreak;\n");
out($f, "\t}\n");
@@ -2578,7 +2938,7 @@ function gen_vm($def, $skel) {
// Generate zend_vm_call_opcode_handler() function
if (ZEND_VM_KIND == ZEND_VM_KIND_CALL || ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
- out($f, "ZEND_API int zend_vm_call_opcode_handler(zend_execute_data* ex)\n");
+ out($f, "ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data* ex)\n");
out($f, "{\n");
if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
@@ -2630,7 +2990,7 @@ function gen_vm($def, $skel) {
out($f, "\treturn ret;\n");
out($f, "}\n\n");
} else {
- out($f, "ZEND_API int zend_vm_call_opcode_handler(zend_execute_data* ex)\n");
+ out($f, "ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data* ex)\n");
out($f, "{\n");
out($f, "\tzend_error_noreturn(E_CORE_ERROR, \"zend_vm_call_opcode_handler() is not supported\");\n");
out($f, "\treturn 0;\n");
@@ -2658,11 +3018,13 @@ function gen_vm($def, $skel) {
out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
out($f,"#undef ZEND_VM_CONTINUE\n");
out($f,"#undef ZEND_VM_RETURN\n");
+ out($f,"#undef ZEND_VM_ENTER_EX\n");
out($f,"#undef ZEND_VM_ENTER\n");
out($f,"#undef ZEND_VM_LEAVE\n");
out($f,"#undef ZEND_VM_DISPATCH\n");
out($f,"#define ZEND_VM_CONTINUE() return 0\n");
out($f,"#define ZEND_VM_RETURN() return -1\n");
+ out($f,"#define ZEND_VM_ENTER_EX() return 1\n");
out($f,"#define ZEND_VM_ENTER() return 1\n");
out($f,"#define ZEND_VM_LEAVE() return 2\n");
out($f,"#define ZEND_VM_INTERRUPT() return zend_interrupt_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h
new file mode 100644
index 0000000000..8ea4001851
--- /dev/null
+++ b/Zend/zend_vm_handlers.h
@@ -0,0 +1,2059 @@
+#define VM_HANDLERS(_) \
+ _(0, ZEND_NOP_SPEC) \
+ _(1, ZEND_ADD_SPEC_CONST_CONST) \
+ _(2, ZEND_ADD_SPEC_CONST_TMPVAR) \
+ _(3, ZEND_ADD_SPEC_CONST_TMPVAR) \
+ _(5, ZEND_ADD_SPEC_CONST_CV) \
+ _(6, ZEND_ADD_SPEC_TMPVAR_CONST) \
+ _(7, ZEND_ADD_SPEC_TMPVAR_TMPVAR) \
+ _(8, ZEND_ADD_SPEC_TMPVAR_TMPVAR) \
+ _(10, ZEND_ADD_SPEC_TMPVAR_CV) \
+ _(11, ZEND_ADD_SPEC_TMPVAR_CONST) \
+ _(12, ZEND_ADD_SPEC_TMPVAR_TMPVAR) \
+ _(13, ZEND_ADD_SPEC_TMPVAR_TMPVAR) \
+ _(15, ZEND_ADD_SPEC_TMPVAR_CV) \
+ _(21, ZEND_ADD_SPEC_CV_CONST) \
+ _(22, ZEND_ADD_SPEC_CV_TMPVAR) \
+ _(23, ZEND_ADD_SPEC_CV_TMPVAR) \
+ _(25, ZEND_ADD_SPEC_CV_CV) \
+ _(26, ZEND_SUB_SPEC_CONST_CONST) \
+ _(27, ZEND_SUB_SPEC_CONST_TMPVAR) \
+ _(28, ZEND_SUB_SPEC_CONST_TMPVAR) \
+ _(30, ZEND_SUB_SPEC_CONST_CV) \
+ _(31, ZEND_SUB_SPEC_TMPVAR_CONST) \
+ _(32, ZEND_SUB_SPEC_TMPVAR_TMPVAR) \
+ _(33, ZEND_SUB_SPEC_TMPVAR_TMPVAR) \
+ _(35, ZEND_SUB_SPEC_TMPVAR_CV) \
+ _(36, ZEND_SUB_SPEC_TMPVAR_CONST) \
+ _(37, ZEND_SUB_SPEC_TMPVAR_TMPVAR) \
+ _(38, ZEND_SUB_SPEC_TMPVAR_TMPVAR) \
+ _(40, ZEND_SUB_SPEC_TMPVAR_CV) \
+ _(46, ZEND_SUB_SPEC_CV_CONST) \
+ _(47, ZEND_SUB_SPEC_CV_TMPVAR) \
+ _(48, ZEND_SUB_SPEC_CV_TMPVAR) \
+ _(50, ZEND_SUB_SPEC_CV_CV) \
+ _(51, ZEND_MUL_SPEC_CONST_CONST) \
+ _(56, ZEND_MUL_SPEC_TMPVAR_CONST) \
+ _(57, ZEND_MUL_SPEC_TMPVAR_TMPVAR) \
+ _(58, ZEND_MUL_SPEC_TMPVAR_TMPVAR) \
+ _(61, ZEND_MUL_SPEC_TMPVAR_CONST) \
+ _(62, ZEND_MUL_SPEC_TMPVAR_TMPVAR) \
+ _(63, ZEND_MUL_SPEC_TMPVAR_TMPVAR) \
+ _(71, ZEND_MUL_SPEC_CV_CONST) \
+ _(72, ZEND_MUL_SPEC_CV_TMPVAR) \
+ _(73, ZEND_MUL_SPEC_CV_TMPVAR) \
+ _(75, ZEND_MUL_SPEC_CV_CV) \
+ _(76, ZEND_DIV_SPEC_CONST_CONST) \
+ _(77, ZEND_DIV_SPEC_CONST_TMPVAR) \
+ _(78, ZEND_DIV_SPEC_CONST_TMPVAR) \
+ _(80, ZEND_DIV_SPEC_CONST_CV) \
+ _(81, ZEND_DIV_SPEC_TMPVAR_CONST) \
+ _(82, ZEND_DIV_SPEC_TMPVAR_TMPVAR) \
+ _(83, ZEND_DIV_SPEC_TMPVAR_TMPVAR) \
+ _(85, ZEND_DIV_SPEC_TMPVAR_CV) \
+ _(86, ZEND_DIV_SPEC_TMPVAR_CONST) \
+ _(87, ZEND_DIV_SPEC_TMPVAR_TMPVAR) \
+ _(88, ZEND_DIV_SPEC_TMPVAR_TMPVAR) \
+ _(90, ZEND_DIV_SPEC_TMPVAR_CV) \
+ _(96, ZEND_DIV_SPEC_CV_CONST) \
+ _(97, ZEND_DIV_SPEC_CV_TMPVAR) \
+ _(98, ZEND_DIV_SPEC_CV_TMPVAR) \
+ _(100, ZEND_DIV_SPEC_CV_CV) \
+ _(101, ZEND_MOD_SPEC_CONST_CONST) \
+ _(102, ZEND_MOD_SPEC_CONST_TMPVAR) \
+ _(103, ZEND_MOD_SPEC_CONST_TMPVAR) \
+ _(105, ZEND_MOD_SPEC_CONST_CV) \
+ _(106, ZEND_MOD_SPEC_TMPVAR_CONST) \
+ _(107, ZEND_MOD_SPEC_TMPVAR_TMPVAR) \
+ _(108, ZEND_MOD_SPEC_TMPVAR_TMPVAR) \
+ _(110, ZEND_MOD_SPEC_TMPVAR_CV) \
+ _(111, ZEND_MOD_SPEC_TMPVAR_CONST) \
+ _(112, ZEND_MOD_SPEC_TMPVAR_TMPVAR) \
+ _(113, ZEND_MOD_SPEC_TMPVAR_TMPVAR) \
+ _(115, ZEND_MOD_SPEC_TMPVAR_CV) \
+ _(121, ZEND_MOD_SPEC_CV_CONST) \
+ _(122, ZEND_MOD_SPEC_CV_TMPVAR) \
+ _(123, ZEND_MOD_SPEC_CV_TMPVAR) \
+ _(125, ZEND_MOD_SPEC_CV_CV) \
+ _(126, ZEND_SL_SPEC_CONST_CONST) \
+ _(127, ZEND_SL_SPEC_CONST_TMPVAR) \
+ _(128, ZEND_SL_SPEC_CONST_TMPVAR) \
+ _(130, ZEND_SL_SPEC_CONST_CV) \
+ _(131, ZEND_SL_SPEC_TMPVAR_CONST) \
+ _(132, ZEND_SL_SPEC_TMPVAR_TMPVAR) \
+ _(133, ZEND_SL_SPEC_TMPVAR_TMPVAR) \
+ _(135, ZEND_SL_SPEC_TMPVAR_CV) \
+ _(136, ZEND_SL_SPEC_TMPVAR_CONST) \
+ _(137, ZEND_SL_SPEC_TMPVAR_TMPVAR) \
+ _(138, ZEND_SL_SPEC_TMPVAR_TMPVAR) \
+ _(140, ZEND_SL_SPEC_TMPVAR_CV) \
+ _(146, ZEND_SL_SPEC_CV_CONST) \
+ _(147, ZEND_SL_SPEC_CV_TMPVAR) \
+ _(148, ZEND_SL_SPEC_CV_TMPVAR) \
+ _(150, ZEND_SL_SPEC_CV_CV) \
+ _(151, ZEND_SR_SPEC_CONST_CONST) \
+ _(152, ZEND_SR_SPEC_CONST_TMPVAR) \
+ _(153, ZEND_SR_SPEC_CONST_TMPVAR) \
+ _(155, ZEND_SR_SPEC_CONST_CV) \
+ _(156, ZEND_SR_SPEC_TMPVAR_CONST) \
+ _(157, ZEND_SR_SPEC_TMPVAR_TMPVAR) \
+ _(158, ZEND_SR_SPEC_TMPVAR_TMPVAR) \
+ _(160, ZEND_SR_SPEC_TMPVAR_CV) \
+ _(161, ZEND_SR_SPEC_TMPVAR_CONST) \
+ _(162, ZEND_SR_SPEC_TMPVAR_TMPVAR) \
+ _(163, ZEND_SR_SPEC_TMPVAR_TMPVAR) \
+ _(165, ZEND_SR_SPEC_TMPVAR_CV) \
+ _(171, ZEND_SR_SPEC_CV_CONST) \
+ _(172, ZEND_SR_SPEC_CV_TMPVAR) \
+ _(173, ZEND_SR_SPEC_CV_TMPVAR) \
+ _(175, ZEND_SR_SPEC_CV_CV) \
+ _(177, ZEND_CONCAT_SPEC_CONST_TMPVAR) \
+ _(178, ZEND_CONCAT_SPEC_CONST_TMPVAR) \
+ _(180, ZEND_CONCAT_SPEC_CONST_CV) \
+ _(181, ZEND_CONCAT_SPEC_TMPVAR_CONST) \
+ _(182, ZEND_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(183, ZEND_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(185, ZEND_CONCAT_SPEC_TMPVAR_CV) \
+ _(186, ZEND_CONCAT_SPEC_TMPVAR_CONST) \
+ _(187, ZEND_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(188, ZEND_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(190, ZEND_CONCAT_SPEC_TMPVAR_CV) \
+ _(196, ZEND_CONCAT_SPEC_CV_CONST) \
+ _(197, ZEND_CONCAT_SPEC_CV_TMPVAR) \
+ _(198, ZEND_CONCAT_SPEC_CV_TMPVAR) \
+ _(200, ZEND_CONCAT_SPEC_CV_CV) \
+ _(201, ZEND_BW_OR_SPEC_CONST_CONST) \
+ _(206, ZEND_BW_OR_SPEC_TMPVAR_CONST) \
+ _(207, ZEND_BW_OR_SPEC_TMPVAR_TMPVAR) \
+ _(208, ZEND_BW_OR_SPEC_TMPVAR_TMPVAR) \
+ _(211, ZEND_BW_OR_SPEC_TMPVAR_CONST) \
+ _(212, ZEND_BW_OR_SPEC_TMPVAR_TMPVAR) \
+ _(213, ZEND_BW_OR_SPEC_TMPVAR_TMPVAR) \
+ _(221, ZEND_BW_OR_SPEC_CV_CONST) \
+ _(222, ZEND_BW_OR_SPEC_CV_TMPVAR) \
+ _(223, ZEND_BW_OR_SPEC_CV_TMPVAR) \
+ _(225, ZEND_BW_OR_SPEC_CV_CV) \
+ _(226, ZEND_BW_AND_SPEC_CONST_CONST) \
+ _(231, ZEND_BW_AND_SPEC_TMPVAR_CONST) \
+ _(232, ZEND_BW_AND_SPEC_TMPVAR_TMPVAR) \
+ _(233, ZEND_BW_AND_SPEC_TMPVAR_TMPVAR) \
+ _(236, ZEND_BW_AND_SPEC_TMPVAR_CONST) \
+ _(237, ZEND_BW_AND_SPEC_TMPVAR_TMPVAR) \
+ _(238, ZEND_BW_AND_SPEC_TMPVAR_TMPVAR) \
+ _(246, ZEND_BW_AND_SPEC_CV_CONST) \
+ _(247, ZEND_BW_AND_SPEC_CV_TMPVAR) \
+ _(248, ZEND_BW_AND_SPEC_CV_TMPVAR) \
+ _(250, ZEND_BW_AND_SPEC_CV_CV) \
+ _(251, ZEND_BW_XOR_SPEC_CONST_CONST) \
+ _(256, ZEND_BW_XOR_SPEC_TMPVAR_CONST) \
+ _(257, ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(258, ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(261, ZEND_BW_XOR_SPEC_TMPVAR_CONST) \
+ _(262, ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(263, ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(271, ZEND_BW_XOR_SPEC_CV_CONST) \
+ _(272, ZEND_BW_XOR_SPEC_CV_TMPVAR) \
+ _(273, ZEND_BW_XOR_SPEC_CV_TMPVAR) \
+ _(275, ZEND_BW_XOR_SPEC_CV_CV) \
+ _(276, ZEND_BW_NOT_SPEC_CONST) \
+ _(277, ZEND_BW_NOT_SPEC_TMPVAR) \
+ _(278, ZEND_BW_NOT_SPEC_TMPVAR) \
+ _(280, ZEND_BW_NOT_SPEC_CV) \
+ _(281, ZEND_BOOL_NOT_SPEC_CONST) \
+ _(282, ZEND_BOOL_NOT_SPEC_TMPVAR) \
+ _(283, ZEND_BOOL_NOT_SPEC_TMPVAR) \
+ _(285, ZEND_BOOL_NOT_SPEC_CV) \
+ _(286, ZEND_BOOL_XOR_SPEC_CONST_CONST) \
+ _(291, ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) \
+ _(292, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(293, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(296, ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) \
+ _(297, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(298, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(306, ZEND_BOOL_XOR_SPEC_CV_CONST) \
+ _(307, ZEND_BOOL_XOR_SPEC_CV_TMPVAR) \
+ _(308, ZEND_BOOL_XOR_SPEC_CV_TMPVAR) \
+ _(310, ZEND_BOOL_XOR_SPEC_CV_CV) \
+ _(311, ZEND_IS_IDENTICAL_SPEC_CONST_CONST) \
+ _(316, ZEND_IS_IDENTICAL_SPEC_TMP_CONST) \
+ _(317, ZEND_IS_IDENTICAL_SPEC_TMP_TMP) \
+ _(321, ZEND_IS_IDENTICAL_SPEC_VAR_CONST) \
+ _(322, ZEND_IS_IDENTICAL_SPEC_VAR_TMP) \
+ _(323, ZEND_IS_IDENTICAL_SPEC_VAR_VAR) \
+ _(331, ZEND_IS_IDENTICAL_SPEC_CV_CONST) \
+ _(332, ZEND_IS_IDENTICAL_SPEC_CV_TMP) \
+ _(333, ZEND_IS_IDENTICAL_SPEC_CV_VAR) \
+ _(335, ZEND_IS_IDENTICAL_SPEC_CV_CV) \
+ _(336, ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST) \
+ _(341, ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST) \
+ _(342, ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP) \
+ _(346, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST) \
+ _(347, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP) \
+ _(348, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR) \
+ _(356, ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST) \
+ _(357, ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP) \
+ _(358, ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR) \
+ _(360, ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV) \
+ _(361, ZEND_IS_EQUAL_SPEC_CONST_CONST) \
+ _(366, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST) \
+ _(367, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(368, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(371, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST) \
+ _(372, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(373, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(381, ZEND_IS_EQUAL_SPEC_CV_CONST) \
+ _(382, ZEND_IS_EQUAL_SPEC_CV_TMPVAR) \
+ _(383, ZEND_IS_EQUAL_SPEC_CV_TMPVAR) \
+ _(385, ZEND_IS_EQUAL_SPEC_CV_CV) \
+ _(386, ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST) \
+ _(391, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST) \
+ _(392, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(393, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(396, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST) \
+ _(397, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(398, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(406, ZEND_IS_NOT_EQUAL_SPEC_CV_CONST) \
+ _(407, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR) \
+ _(408, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR) \
+ _(410, ZEND_IS_NOT_EQUAL_SPEC_CV_CV) \
+ _(411, ZEND_IS_SMALLER_SPEC_CONST_CONST) \
+ _(412, ZEND_IS_SMALLER_SPEC_CONST_TMPVAR) \
+ _(413, ZEND_IS_SMALLER_SPEC_CONST_TMPVAR) \
+ _(415, ZEND_IS_SMALLER_SPEC_CONST_CV) \
+ _(416, ZEND_IS_SMALLER_SPEC_TMPVAR_CONST) \
+ _(417, ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR) \
+ _(418, ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR) \
+ _(420, ZEND_IS_SMALLER_SPEC_TMPVAR_CV) \
+ _(421, ZEND_IS_SMALLER_SPEC_TMPVAR_CONST) \
+ _(422, ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR) \
+ _(423, ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR) \
+ _(425, ZEND_IS_SMALLER_SPEC_TMPVAR_CV) \
+ _(431, ZEND_IS_SMALLER_SPEC_CV_CONST) \
+ _(432, ZEND_IS_SMALLER_SPEC_CV_TMPVAR) \
+ _(433, ZEND_IS_SMALLER_SPEC_CV_TMPVAR) \
+ _(435, ZEND_IS_SMALLER_SPEC_CV_CV) \
+ _(436, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST) \
+ _(437, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR) \
+ _(438, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR) \
+ _(440, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV) \
+ _(441, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST) \
+ _(442, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(443, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(445, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV) \
+ _(446, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST) \
+ _(447, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(448, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(450, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV) \
+ _(456, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST) \
+ _(457, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR) \
+ _(458, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR) \
+ _(460, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV) \
+ _(461, ZEND_CAST_SPEC_CONST) \
+ _(462, ZEND_CAST_SPEC_TMP) \
+ _(463, ZEND_CAST_SPEC_VAR) \
+ _(465, ZEND_CAST_SPEC_CV) \
+ _(466, ZEND_QM_ASSIGN_SPEC_CONST) \
+ _(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_ADD_INTERFACE_SPEC_CONST) \
+ _(2438, ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST) \
+ _(2439, ZEND_VERIFY_ABSTRACT_CLASS_SPEC) \
+ _(2490, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST) \
+ _(2491, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP) \
+ _(2492, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR) \
+ _(2494, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV) \
+ _(2495, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(2496, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(2497, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(2499, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(2500, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(2501, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(2502, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(2504, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(2505, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST) \
+ _(2506, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP) \
+ _(2507, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR) \
+ _(2509, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV) \
+ _(2510, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST) \
+ _(2511, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP) \
+ _(2512, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR) \
+ _(2514, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV) \
+ _(2540, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST) \
+ _(2541, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP) \
+ _(2542, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR) \
+ _(2544, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV) \
+ _(2545, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(2546, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(2547, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(2549, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(2550, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(2551, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(2552, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(2554, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(2555, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST) \
+ _(2556, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP) \
+ _(2557, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR) \
+ _(2559, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) \
+ _(2560, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST) \
+ _(2561, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP) \
+ _(2562, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR) \
+ _(2564, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV) \
+ _(2565, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
+ _(2566, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+ _(2567, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+ _(2569, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
+ _(2570, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+ _(2571, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2572, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2574, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+ _(2575, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+ _(2576, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2577, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2579, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+ _(2580, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
+ _(2581, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2582, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2584, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
+ _(2585, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
+ _(2586, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+ _(2587, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+ _(2589, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
+ _(2590, ZEND_HANDLE_EXCEPTION_SPEC) \
+ _(2591, ZEND_USER_OPCODE_SPEC) \
+ _(2592, ZEND_ASSERT_CHECK_SPEC) \
+ _(2593, ZEND_JMP_SET_SPEC_CONST) \
+ _(2594, ZEND_JMP_SET_SPEC_TMP) \
+ _(2595, ZEND_JMP_SET_SPEC_VAR) \
+ _(2597, ZEND_JMP_SET_SPEC_CV) \
+ _(2598, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \
+ _(2599, ZEND_ADD_TRAIT_SPEC) \
+ _(2600, ZEND_BIND_TRAITS_SPEC) \
+ _(2601, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
+ _(2602, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
+ _(2603, ZEND_CALL_TRAMPOLINE_SPEC) \
+ _(2604, ZEND_DISCARD_EXCEPTION_SPEC) \
+ _(2605, ZEND_YIELD_SPEC_CONST_CONST) \
+ _(2606, ZEND_YIELD_SPEC_CONST_TMP) \
+ _(2607, ZEND_YIELD_SPEC_CONST_VAR) \
+ _(2608, ZEND_YIELD_SPEC_CONST_UNUSED) \
+ _(2609, ZEND_YIELD_SPEC_CONST_CV) \
+ _(2610, ZEND_YIELD_SPEC_TMP_CONST) \
+ _(2611, ZEND_YIELD_SPEC_TMP_TMP) \
+ _(2612, ZEND_YIELD_SPEC_TMP_VAR) \
+ _(2613, ZEND_YIELD_SPEC_TMP_UNUSED) \
+ _(2614, ZEND_YIELD_SPEC_TMP_CV) \
+ _(2615, ZEND_YIELD_SPEC_VAR_CONST) \
+ _(2616, ZEND_YIELD_SPEC_VAR_TMP) \
+ _(2617, ZEND_YIELD_SPEC_VAR_VAR) \
+ _(2618, ZEND_YIELD_SPEC_VAR_UNUSED) \
+ _(2619, ZEND_YIELD_SPEC_VAR_CV) \
+ _(2620, ZEND_YIELD_SPEC_UNUSED_CONST) \
+ _(2621, ZEND_YIELD_SPEC_UNUSED_TMP) \
+ _(2622, ZEND_YIELD_SPEC_UNUSED_VAR) \
+ _(2623, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
+ _(2624, ZEND_YIELD_SPEC_UNUSED_CV) \
+ _(2625, ZEND_YIELD_SPEC_CV_CONST) \
+ _(2626, ZEND_YIELD_SPEC_CV_TMP) \
+ _(2627, ZEND_YIELD_SPEC_CV_VAR) \
+ _(2628, ZEND_YIELD_SPEC_CV_UNUSED) \
+ _(2629, ZEND_YIELD_SPEC_CV_CV) \
+ _(2630, ZEND_GENERATOR_RETURN_SPEC_CONST) \
+ _(2631, ZEND_GENERATOR_RETURN_SPEC_TMP) \
+ _(2632, ZEND_GENERATOR_RETURN_SPEC_VAR) \
+ _(2634, ZEND_GENERATOR_RETURN_SPEC_CV) \
+ _(2635, ZEND_FAST_CALL_SPEC) \
+ _(2636, ZEND_FAST_RET_SPEC) \
+ _(2637, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
+ _(2638, ZEND_SEND_UNPACK_SPEC) \
+ _(2639, ZEND_POW_SPEC_CONST_CONST) \
+ _(2640, ZEND_POW_SPEC_CONST_TMPVAR) \
+ _(2641, ZEND_POW_SPEC_CONST_TMPVAR) \
+ _(2643, ZEND_POW_SPEC_CONST_CV) \
+ _(2644, ZEND_POW_SPEC_TMPVAR_CONST) \
+ _(2645, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(2646, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(2648, ZEND_POW_SPEC_TMPVAR_CV) \
+ _(2649, ZEND_POW_SPEC_TMPVAR_CONST) \
+ _(2650, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(2651, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(2653, ZEND_POW_SPEC_TMPVAR_CV) \
+ _(2659, ZEND_POW_SPEC_CV_CONST) \
+ _(2660, ZEND_POW_SPEC_CV_TMPVAR) \
+ _(2661, ZEND_POW_SPEC_CV_TMPVAR) \
+ _(2663, ZEND_POW_SPEC_CV_CV) \
+ _(2694, ZEND_ASSIGN_POW_SPEC_VAR_CONST) \
+ _(2695, ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM) \
+ _(2696, ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ) \
+ _(2697, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \
+ _(2698, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \
+ _(2699, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \
+ _(2700, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR) \
+ _(2701, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM) \
+ _(2702, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ) \
+ _(2704, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM) \
+ _(2706, ZEND_ASSIGN_POW_SPEC_VAR_CV) \
+ _(2707, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM) \
+ _(2708, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ) \
+ _(2711, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ) \
+ _(2714, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \
+ _(2717, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ) \
+ _(2723, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ) \
+ _(2724, ZEND_ASSIGN_POW_SPEC_CV_CONST) \
+ _(2725, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM) \
+ _(2726, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ) \
+ _(2727, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \
+ _(2728, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \
+ _(2729, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \
+ _(2730, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR) \
+ _(2731, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM) \
+ _(2732, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ) \
+ _(2734, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM) \
+ _(2736, ZEND_ASSIGN_POW_SPEC_CV_CV) \
+ _(2737, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM) \
+ _(2738, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ) \
+ _(2739, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
+ _(2740, ZEND_COALESCE_SPEC_CONST) \
+ _(2741, ZEND_COALESCE_SPEC_TMPVAR) \
+ _(2742, ZEND_COALESCE_SPEC_TMPVAR) \
+ _(2744, ZEND_COALESCE_SPEC_CV) \
+ _(2745, ZEND_SPACESHIP_SPEC_CONST_CONST) \
+ _(2746, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+ _(2747, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+ _(2749, ZEND_SPACESHIP_SPEC_CONST_CV) \
+ _(2750, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+ _(2751, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2752, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2754, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+ _(2755, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+ _(2756, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2757, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2759, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+ _(2765, ZEND_SPACESHIP_SPEC_CV_CONST) \
+ _(2766, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+ _(2767, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+ _(2769, ZEND_SPACESHIP_SPEC_CV_CV) \
+ _(2770, ZEND_DECLARE_ANON_CLASS_SPEC) \
+ _(2771, ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_CONST_CONST) \
+ _(2772, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) \
+ _(2774, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) \
+ _(2775, ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED) \
+ _(2777, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \
+ _(2779, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \
+ _(2780, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \
+ _(2782, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) \
+ _(2784, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) \
+ _(2785, ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED) \
+ _(2792, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) \
+ _(2794, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) \
+ _(2795, ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED) \
+ _(2797, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST) \
+ _(2799, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR) \
+ _(2800, ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED) \
+ _(2802, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \
+ _(2804, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \
+ _(2805, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \
+ _(2807, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST) \
+ _(2809, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR) \
+ _(2810, ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED) \
+ _(2817, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST) \
+ _(2819, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR) \
+ _(2820, ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED) \
+ _(2822, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST) \
+ _(2824, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR) \
+ _(2825, ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED) \
+ _(2827, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \
+ _(2829, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \
+ _(2830, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \
+ _(2832, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST) \
+ _(2834, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR) \
+ _(2835, ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED) \
+ _(2842, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST) \
+ _(2844, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR) \
+ _(2845, ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED) \
+ _(2847, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST) \
+ _(2849, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR) \
+ _(2850, ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED) \
+ _(2852, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \
+ _(2854, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \
+ _(2855, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \
+ _(2857, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST) \
+ _(2859, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR) \
+ _(2860, ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED) \
+ _(2867, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST) \
+ _(2869, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR) \
+ _(2870, ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED) \
+ _(2872, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST) \
+ _(2874, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR) \
+ _(2875, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED) \
+ _(2877, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \
+ _(2879, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \
+ _(2880, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+ _(2882, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST) \
+ _(2884, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR) \
+ _(2885, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+ _(2892, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST) \
+ _(2894, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR) \
+ _(2895, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED) \
+ _(2897, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST) \
+ _(2899, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR) \
+ _(2900, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED) \
+ _(2902, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \
+ _(2904, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \
+ _(2905, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \
+ _(2907, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST) \
+ _(2909, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR) \
+ _(2910, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED) \
+ _(2917, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST) \
+ _(2919, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR) \
+ _(2920, ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED) \
+ _(2922, ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST) \
+ _(2924, ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) \
+ _(2925, ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED) \
+ _(2927, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \
+ _(2929, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \
+ _(2930, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \
+ _(2932, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST) \
+ _(2934, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) \
+ _(2935, ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED) \
+ _(2942, ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST) \
+ _(2944, ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) \
+ _(2945, ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED) \
+ _(2947, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST) \
+ _(2949, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR) \
+ _(2950, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED) \
+ _(2952, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \
+ _(2954, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \
+ _(2955, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \
+ _(2957, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST) \
+ _(2959, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR) \
+ _(2960, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED) \
+ _(2967, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST) \
+ _(2969, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR) \
+ _(2970, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED) \
+ _(2972, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
+ _(2974, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
+ _(2975, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
+ _(2977, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
+ _(2978, ZEND_BIND_STATIC_SPEC_CV_CONST) \
+ _(2979, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
+ _(2980, ZEND_SEND_FUNC_ARG_SPEC_VAR) \
+ _(2981, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
+ _(2982, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
+ _(2983, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2984, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2986, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2987, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
+ _(2988, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2989, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2991, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2992, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
+ _(2993, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
+ _(2994, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
+ _(2996, ZEND_IN_ARRAY_SPEC_CV_CONST) \
+ _(2997, ZEND_COUNT_SPEC_CONST_UNUSED) \
+ _(2998, ZEND_COUNT_SPEC_TMP_UNUSED) \
+ _(2999, ZEND_COUNT_SPEC_VAR_UNUSED) \
+ _(3001, ZEND_COUNT_SPEC_CV_UNUSED) \
+ _(3002, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
+ _(3003, ZEND_GET_CLASS_SPEC_TMP_UNUSED) \
+ _(3004, ZEND_GET_CLASS_SPEC_VAR_UNUSED) \
+ _(3005, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
+ _(3006, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
+ _(3007, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
+ _(3008, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
+ _(3009, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
+ _(3010, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
+ _(3012, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
+ _(3013, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
+ _(3014, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
+ _(3017, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
+ _(3019, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
+ _(3020, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+ _(3021, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
+ _(3022, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
+ _(3023, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+ _(3024, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+ _(3026, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
+ _(3027, ZEND_JMP_FORWARD_SPEC) \
+ _(3033, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3034, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3035, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3037, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3038, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3039, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3040, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3042, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3048, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3049, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3050, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3052, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3058, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(3059, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3060, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3062, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3063, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(3064, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3065, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3067, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3073, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(3074, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3075, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3077, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3083, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3084, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3085, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3087, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3088, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3089, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3090, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3092, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3098, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3099, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3100, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3102, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3104, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(3105, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(3107, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(3108, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3109, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3110, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3112, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3113, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3114, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3115, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3117, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3123, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3124, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3125, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3127, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3129, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(3130, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(3132, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(3133, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(3134, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3135, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3137, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3138, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(3139, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3140, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3142, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3148, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(3149, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3150, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3152, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3154, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3155, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3157, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3158, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3159, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3160, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3162, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3163, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3164, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3165, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3167, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3173, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3174, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3175, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3177, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3183, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3184, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3185, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3187, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3188, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3189, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3190, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3192, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3198, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(3199, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3200, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3202, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(3208, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3209, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3210, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3212, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3213, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3214, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3215, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3217, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3223, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3224, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3225, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3227, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3233, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3234, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3235, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3237, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3238, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3239, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3240, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3242, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3248, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3249, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3250, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3252, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3268, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3269, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3270, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3271, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3272, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3273, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3274, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3275, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3276, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3280, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3281, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3282, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3283, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3284, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3285, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3286, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3287, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3288, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3289, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3290, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3291, 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) \
+ _(3313, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3314, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3315, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \
+ _(3319, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3320, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3321, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3325, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3326, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3327, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3343, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3344, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3345, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3346, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3347, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3348, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3349, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3350, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3351, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3355, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3356, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3357, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3358, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3359, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3360, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3361, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3362, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3363, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3364, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3365, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3366, 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) \
+ _(3388, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3389, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3390, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \
+ _(3394, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3395, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3396, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3400, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3401, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3402, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3418, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3419, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3420, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3421, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3422, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3423, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3424, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3425, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3426, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3430, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3431, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3432, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3433, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3434, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3435, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3436, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3437, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3438, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3439, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3440, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3441, 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) \
+ _(3463, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3464, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3465, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \
+ _(3469, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3470, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3471, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3475, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3476, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3477, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3493, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3494, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3495, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3496, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3497, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3498, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3499, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3500, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3501, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3505, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3506, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3507, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3508, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3509, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3510, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3511, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3512, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3513, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3514, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3515, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3516, 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) \
+ _(3538, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3539, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3540, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \
+ _(3544, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3545, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3546, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3550, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3551, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3552, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3556, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3557, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3558, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3559, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3560, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3561, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3565, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3566, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3567, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3568, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3569, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3570, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3571, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3572, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3573, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3574, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3575, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3576, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3580, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3581, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3582, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3583, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3584, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3585, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3586, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3587, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3588, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3589, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3590, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3591, 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) \
+ _(3613, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3614, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3615, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_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) \
+ _(3619, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3620, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3621, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3625, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3626, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3627, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3631, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3632, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3633, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3634, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3635, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3636, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3640, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3641, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3642, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3643, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3644, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3645, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3646, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3647, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3648, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3649, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3650, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3651, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3655, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3656, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3657, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3658, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3659, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3660, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3661, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3662, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3663, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3664, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3665, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3666, 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) \
+ _(3688, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3689, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3690, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_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) \
+ _(3694, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3695, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3696, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3700, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3701, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3702, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3706, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3707, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3708, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3709, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3710, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3711, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3715, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3716, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3717, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3718, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3719, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3720, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3721, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3722, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3723, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3724, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3725, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3726, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3730, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3731, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3732, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3733, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3734, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3735, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3736, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3737, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3738, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3739, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3740, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3741, 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) \
+ _(3763, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3764, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3765, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_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) \
+ _(3769, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3770, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3771, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3775, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3776, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3777, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3781, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3782, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3783, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3784, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3785, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3786, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3790, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3791, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3792, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3793, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3794, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3795, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3796, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3797, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3798, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3799, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3800, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3801, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3805, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3806, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3807, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3808, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3809, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3810, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3811, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3812, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3813, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3814, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3815, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3816, 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) \
+ _(3838, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3839, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3840, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_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) \
+ _(3844, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3845, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3846, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3850, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3851, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3852, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3853, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3854, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3855, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3856, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3857, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED) \
+ _(3858, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED) \
+ _(3859, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3860, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3861, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3862, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3863, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED) \
+ _(3864, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED) \
+ _(3865, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3866, ZEND_POST_INC_LONG_SPEC_CV) \
+ _(3867, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV) \
+ _(3868, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3869, ZEND_POST_DEC_LONG_SPEC_CV) \
+ _(3870, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV) \
+ _(3871, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
+ _(3872, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3873, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3875, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3876, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
+ _(3877, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3878, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3880, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3882, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3883, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3885, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3886, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+ _(3887, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3888, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3890, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3891, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+ _(3892, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3893, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3895, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3901, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
+ _(3902, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3903, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3905, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3908, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
+ _(3910, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
+ _(3913, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \
+ _(3915, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \
+ _(3916, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
+ _(3917, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
+ _(3918, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
+ _(3919, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
+ _(3919+1, ZEND_NULL)
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 61ce8ce072..56c3ac7c25 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -12,16 +12,17 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include <zend.h>
+#include <zend_vm_opcodes.h>
-static const char *zend_vm_opcodes_names[198] = {
+static const char *zend_vm_opcodes_names[199] = {
"ZEND_NOP",
"ZEND_ADD",
"ZEND_SUB",
@@ -120,9 +121,9 @@ static const char *zend_vm_opcodes_names[198] = {
"ZEND_FETCH_UNSET",
"ZEND_FETCH_DIM_UNSET",
"ZEND_FETCH_OBJ_UNSET",
- "ZEND_FETCH_LIST",
+ "ZEND_FETCH_LIST_R",
"ZEND_FETCH_CONSTANT",
- NULL,
+ "ZEND_CHECK_FUNC_ARG",
"ZEND_EXT_STMT",
"ZEND_EXT_FCALL_BEGIN",
"ZEND_EXT_FCALL_END",
@@ -207,7 +208,7 @@ static const char *zend_vm_opcodes_names[198] = {
"ZEND_BIND_LEXICAL",
"ZEND_BIND_STATIC",
"ZEND_FETCH_THIS",
- NULL,
+ "ZEND_SEND_FUNC_ARG",
"ZEND_ISSET_ISEMPTY_THIS",
"ZEND_SWITCH_LONG",
"ZEND_SWITCH_STRING",
@@ -220,43 +221,44 @@ static const char *zend_vm_opcodes_names[198] = {
"ZEND_FUNC_GET_ARGS",
"ZEND_UNSET_CV",
"ZEND_ISSET_ISEMPTY_CV",
+ "ZEND_FETCH_LIST_W",
};
-static uint32_t zend_vm_opcodes_flags[198] = {
+static uint32_t zend_vm_opcodes_flags[199] = {
0x00000000,
0x00000707,
0x00000707,
+ 0x80000707,
0x00000707,
0x00000707,
0x00000707,
0x00000707,
- 0x00000707,
- 0x00000707,
- 0x00000707,
- 0x00000707,
- 0x00000707,
+ 0x40000707,
+ 0x80000707,
+ 0x80000707,
+ 0x80000707,
0x00000007,
0x00000007,
- 0x00000707,
- 0x00000303,
- 0x00000303,
- 0x00000707,
- 0x00000707,
+ 0x80000707,
+ 0x80000303,
+ 0x80000303,
+ 0x80000707,
+ 0x80000707,
0x00000707,
0x00000707,
0x07000003,
0x00000003,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
- 0x04006751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
+ 0x04046751,
0x00000001,
0x00000001,
0x00000001,
@@ -271,7 +273,7 @@ static uint32_t zend_vm_opcodes_flags[198] = {
0x03002007,
0x00002007,
0x00002007,
- 0x00000707,
+ 0x00000705,
0x00000101,
0x00001001,
0x00000101,
@@ -282,61 +284,61 @@ static uint32_t zend_vm_opcodes_flags[198] = {
0x01000701,
0x00000000,
0x00000001,
- 0x01000300,
+ 0x01040300,
0x00000000,
- 0x01000310,
+ 0x01040310,
0x00000003,
- 0x00000010,
- 0x00000310,
+ 0x0000a110,
+ 0x00040310,
0x00001007,
0x00001001,
0x00001001,
- 0x01000073,
- 0x01000300,
- 0x00004005,
+ 0x0100a173,
+ 0x01040300,
+ 0x00000005,
0x00186703,
0x00106703,
0x08000007,
0x00010107,
0x00000701,
- 0x00000751,
+ 0x00040751,
0x00002003,
0x03000001,
0x00000007,
0x00010107,
0x00000707,
- 0x00000753,
+ 0x00040757,
0x00010107,
0x00006701,
- 0x00000751,
+ 0x00040751,
0x00010107,
0x00006701,
- 0x00000751,
+ 0x00040751,
0x00010107,
0x00000707,
- 0x00000757,
- 0x00050107,
- 0x01006703,
- 0x01000753,
+ 0x00040757,
+ 0x00010107,
+ 0x00006703,
+ 0x00040753,
0x00010107,
0x00000701,
- 0x00000751,
- 0x00000707,
- 0x06000301,
- 0x00000000,
+ 0x00040751,
+ 0x0000070b,
+ 0x00040391,
+ 0x00001001,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x01000000,
0x00001001,
- 0x03000103,
+ 0x02042003,
0x00000003,
- 0x05000700,
+ 0x00040771,
0x00000057,
0x0b000003,
- 0x01000757,
- 0x01008773,
+ 0x01040757,
+ 0x01048773,
0x00030107,
0x00020707,
0x00001003,
@@ -345,73 +347,73 @@ static uint32_t zend_vm_opcodes_flags[198] = {
0x01000000,
0x00001003,
0x00000007,
- 0x00000003,
- 0x07000003,
- 0x00000103,
+ 0x00040003,
+ 0x09000007,
+ 0x0000a103,
0x00002003,
0x03000001,
- 0x00004005,
+ 0x00000005,
0x01000700,
0x00000000,
0x00000000,
0x00000000,
- 0x00000751,
- 0x00000751,
- 0x00000751,
- 0x00000751,
- 0x00000751,
- 0x00000000,
- 0x00007305,
+ 0x00040751,
+ 0x00040751,
+ 0x00040751,
+ 0x00040751,
+ 0x00040751,
0x00000000,
- 0x00000100,
+ 0x00047305,
+ 0x00000003,
+ 0x00000303,
0x00000000,
0x00000003,
0x00000303,
- 0x00000300,
- 0x00000100,
+ 0x00040300,
+ 0x00000303,
0x00000000,
0x00006701,
- 0x00020757,
+ 0x00060757,
0x00000000,
0x00000000,
0x00002000,
0x00002003,
0x00000103,
- 0x00000000,
+ 0x00040000,
0x00000000,
0x00000101,
- 0x05000000,
+ 0x00000071,
0x00000000,
0x00000000,
0x0b000303,
0x00000003,
0x00000020,
0x00003000,
- 0x00000010,
+ 0x0000a110,
0x00000000,
0x00000707,
- 0x04006751,
- 0x00000301,
- 0x00002003,
+ 0x04046751,
+ 0x00040301,
+ 0x00002007,
0x00000707,
0x03000000,
- 0x03000100,
- 0x00007307,
- 0x00007307,
- 0x00007307,
- 0x00007307,
- 0x01007307,
- 0x00007307,
- 0x00007307,
- 0x00027307,
- 0x00000373,
+ 0x03000303,
+ 0x00047307,
+ 0x00047307,
+ 0x00047307,
+ 0x00047307,
+ 0x00047307,
+ 0x00047307,
+ 0x00047307,
+ 0x00067307,
+ 0x00040373,
0x00100101,
0x00100301,
0x00000101,
- 0x00000000,
+ 0x00001001,
0x00000101,
- 0x03000307,
- 0x03000307,
+ 0x0300030b,
+ 0x0300030b,
0x01000303,
0x00000103,
0x00000103,
@@ -421,11 +423,18 @@ static uint32_t zend_vm_opcodes_flags[198] = {
0x00000103,
0x00000101,
0x00020101,
+ 0x00000701,
};
-ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) {
+ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
+ if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
+ return NULL;
+ }
return zend_vm_opcodes_names[opcode];
}
-ZEND_API uint32_t zend_get_opcode_flags(zend_uchar opcode) {
+ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {
+ if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
+ opcode = ZEND_NOP;
+ }
return zend_vm_opcodes_flags[opcode];
}
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index 856b8d26b2..ea9e523b36 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -12,9 +12,9 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
- | Dmitry Stogov <dmitry@zend.com> |
+ | Authors: Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+ | Dmitry Stogov <dmitry@php.net> |
+----------------------------------------------------------------------+
*/
@@ -42,24 +42,25 @@
#define ZEND_VM_OP_NUM 0x00000010
#define ZEND_VM_OP_JMP_ADDR 0x00000020
#define ZEND_VM_OP_TRY_CATCH 0x00000030
-#define ZEND_VM_OP_LIVE_RANGE 0x00000040
#define ZEND_VM_OP_THIS 0x00000050
#define ZEND_VM_OP_NEXT 0x00000060
#define ZEND_VM_OP_CLASS_FETCH 0x00000070
#define ZEND_VM_OP_CONSTRUCTOR 0x00000080
+#define ZEND_VM_OP_CONST_FETCH 0x00000090
+#define ZEND_VM_OP_CACHE_SLOT 0x000000a0
#define ZEND_VM_EXT_VAR_FETCH 0x00010000
#define ZEND_VM_EXT_ISSET 0x00020000
-#define ZEND_VM_EXT_ARG_NUM 0x00040000
+#define ZEND_VM_EXT_CACHE_SLOT 0x00040000
#define ZEND_VM_EXT_ARRAY_INIT 0x00080000
#define ZEND_VM_EXT_REF 0x00100000
#define ZEND_VM_EXT_MASK 0x0f000000
#define ZEND_VM_EXT_NUM 0x01000000
+#define ZEND_VM_EXT_LAST_CATCH 0x02000000
#define ZEND_VM_EXT_JMP_ADDR 0x03000000
#define ZEND_VM_EXT_DIM_OBJ 0x04000000
-#define ZEND_VM_EXT_CLASS_FETCH 0x05000000
-#define ZEND_VM_EXT_CONST_FETCH 0x06000000
#define ZEND_VM_EXT_TYPE 0x07000000
#define ZEND_VM_EXT_EVAL 0x08000000
+#define ZEND_VM_EXT_TYPE_MASK 0x09000000
#define ZEND_VM_EXT_SRC 0x0b000000
#define ZEND_VM_NO_CONST_CONST 0x40000000
#define ZEND_VM_COMMUTATIVE 0x80000000
@@ -68,8 +69,8 @@
BEGIN_EXTERN_C()
-ZEND_API const char *zend_get_opcode_name(zend_uchar opcode);
-ZEND_API uint32_t zend_get_opcode_flags(zend_uchar opcode);
+ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);
+ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);
END_EXTERN_C()
@@ -171,8 +172,9 @@ END_EXTERN_C()
#define ZEND_FETCH_UNSET 95
#define ZEND_FETCH_DIM_UNSET 96
#define ZEND_FETCH_OBJ_UNSET 97
-#define ZEND_FETCH_LIST 98
+#define ZEND_FETCH_LIST_R 98
#define ZEND_FETCH_CONSTANT 99
+#define ZEND_CHECK_FUNC_ARG 100
#define ZEND_EXT_STMT 101
#define ZEND_EXT_FCALL_BEGIN 102
#define ZEND_EXT_FCALL_END 103
@@ -257,6 +259,7 @@ END_EXTERN_C()
#define ZEND_BIND_LEXICAL 182
#define ZEND_BIND_STATIC 183
#define ZEND_FETCH_THIS 184
+#define ZEND_SEND_FUNC_ARG 185
#define ZEND_ISSET_ISEMPTY_THIS 186
#define ZEND_SWITCH_LONG 187
#define ZEND_SWITCH_STRING 188
@@ -269,7 +272,8 @@ END_EXTERN_C()
#define ZEND_FUNC_GET_ARGS 195
#define ZEND_UNSET_CV 196
#define ZEND_ISSET_ISEMPTY_CV 197
+#define ZEND_FETCH_LIST_W 198
-#define ZEND_VM_LAST_OPCODE 197
+#define ZEND_VM_LAST_OPCODE 198
#endif
diff --git a/Zend/zend_vm_trace_handlers.h b/Zend/zend_vm_trace_handlers.h
new file mode 100644
index 0000000000..5f10d9ea1c
--- /dev/null
+++ b/Zend/zend_vm_trace_handlers.h
@@ -0,0 +1,112 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend_sort.h"
+
+#define VM_TRACE(op) zend_vm_trace(#op, sizeof(#op)-1);
+#define VM_TRACE_START() zend_vm_trace_init();
+#define VM_TRACE_END() zend_vm_trace_finish();
+
+static HashTable vm_trace_ht;
+
+static void zend_vm_trace(const char *op, size_t op_len)
+{
+ static const char *last = NULL;
+ static size_t last_len = 0;
+ char buf[256];
+ size_t len;
+ zval tmp, *zv;
+
+ if (EXPECTED(last)) {
+ len = last_len + 1 + op_len;
+ memcpy(buf, last, last_len);
+ buf[last_len] = ' ';
+ memcpy(buf + last_len + 1, op, op_len + 1);
+ zv = zend_hash_str_find(&vm_trace_ht, buf, len);
+ if (EXPECTED(zv)) {
+ if (EXPECTED(Z_LVAL_P(zv) < ZEND_LONG_MAX)) {
+ Z_LVAL_P(zv)++;
+ }
+ } else {
+ ZVAL_LONG(&tmp, 1);
+ zend_hash_str_add_new(&vm_trace_ht, buf, len, &tmp);
+ }
+ }
+ last = op;
+ last_len = op_len;
+}
+
+static int zend_vm_trace_compare(const Bucket *p1, const Bucket *p2)
+{
+ if (Z_LVAL(p1->val) < Z_LVAL(p2->val)) {
+ return 1;
+ } else if (Z_LVAL(p1->val) > Z_LVAL(p2->val)) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+static void zend_vm_trace_finish(void)
+{
+ zend_string *key;
+ zval *val;
+ FILE *f;
+
+ f = fopen("zend_vm_trace.log", "w+");
+ if (f) {
+ zend_hash_sort(&vm_trace_ht, (compare_func_t)zend_vm_trace_compare, 0);
+ ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
+ fprintf(f, "%s "ZEND_LONG_FMT"\n", ZSTR_VAL(key), Z_LVAL_P(val));
+ } ZEND_HASH_FOREACH_END();
+ fclose(f);
+ }
+ zend_hash_destroy(&vm_trace_ht);
+}
+
+static void zend_vm_trace_init(void)
+{
+ FILE *f;
+
+ zend_hash_init(&vm_trace_ht, 0, NULL, NULL, 1);
+ f = fopen("zend_vm_trace.log", "r");
+ if (f) {
+ char buf[256];
+ size_t len;
+ zval tmp;
+
+ while (!feof(f)) {
+ if (fgets(buf, sizeof(buf)-1, f)) {
+ len = strlen(buf);
+ while (len > 0 && buf[len-1] <= ' ') {
+ len--;
+ buf[len] = 0;
+ }
+ while (len > 0 && buf[len-1] >= '0' && buf[len-1] <= '9') {
+ len--;
+ }
+ if (len > 1) {
+ buf[len-1] = 0;
+ ZVAL_LONG(&tmp, ZEND_STRTOL(buf + len, NULL, 10));
+ zend_hash_str_add(&vm_trace_ht, buf, len - 1, &tmp);
+ }
+ }
+ }
+ fclose(f);
+ }
+}
diff --git a/Zend/zend_vm_trace_map.h b/Zend/zend_vm_trace_map.h
new file mode 100644
index 0000000000..9ff42d492d
--- /dev/null
+++ b/Zend/zend_vm_trace_map.h
@@ -0,0 +1,81 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Dmitry Stogov <dmitry@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend_vm_handlers.h"
+#include "zend_sort.h"
+
+#define GEN_MAP(n, name) do { \
+ ZVAL_LONG(&tmp, (zend_long)(uintptr_t)zend_opcode_handlers[n]); \
+ zend_hash_str_add(&vm_trace_ht, #name, sizeof(#name) - 1, &tmp); \
+ } while (0);
+
+#define VM_TRACE_START() do { \
+ zval tmp; \
+ zend_hash_init(&vm_trace_ht, 0, NULL, NULL, 1); \
+ VM_HANDLERS(GEN_MAP) \
+ zend_vm_trace_init(); \
+ } while (0)
+
+#ifdef _WIN64
+# define ADDR_FMT "%016I64x"
+#elif SIZEOF_SIZE_T == 4
+# define ADDR_FMT "%08zx"
+#elif SIZEOF_SIZE_T == 8
+# define ADDR_FMT "%016zx"
+#else
+# error "Unknown SIZEOF_SIZE_T"
+#endif
+
+static HashTable vm_trace_ht;
+
+static int zend_vm_trace_compare(const Bucket *p1, const Bucket *p2)
+{
+ if (Z_LVAL(p1->val) > Z_LVAL(p2->val)) {
+ return 1;
+ } else if (Z_LVAL(p1->val) < Z_LVAL(p2->val)) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+static void zend_vm_trace_init(void)
+{
+ FILE *f;
+ zend_string *key, *prev_key;
+ zval *val;
+ zend_long prev_addr;
+
+ f = fopen("zend_vm.map", "w+");
+ if (f) {
+ zend_hash_sort(&vm_trace_ht, (compare_func_t)zend_vm_trace_compare, 0);
+ prev_key = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
+ if (prev_key) {
+ fprintf(f, ADDR_FMT" "ADDR_FMT" t %s\n", prev_addr, Z_LVAL_P(val) - prev_addr, ZSTR_VAL(prev_key));
+ }
+ prev_key = key;
+ prev_addr = Z_LVAL_P(val);
+ } ZEND_HASH_FOREACH_END();
+ if (prev_key) {
+ fprintf(f, ADDR_FMT" "ADDR_FMT" t %s\n", prev_addr, 0, ZSTR_VAL(prev_key));
+ }
+ fclose(f);
+ }
+ zend_hash_destroy(&vm_trace_ht);
+}